欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DTOJ 2825: 赛车比赛(race)

程序员文章站 2022-03-01 23:18:09
...

2825: 赛车比赛(race)
时间限制: 2Sec2 Sec 内存限制: 256MB256 MB O2O2

题目描述
USBUSB自己做了一辆卡丁车去参加f1f1赛事,经过了一轮预选赛,还剩下nn名选手进入决赛。

由于各选手的预赛成绩不同,所以各选手的出发点sis_{i}也是根据成绩而定的,有些人的出发点不同,有些人出发点相同。每位选手根据状态还有一个保持不变的速度viv_{i}。为了简化问题,设跑道为一条数轴,选手的坐标即为其通过距离。

排名方法如下,如果一辆车在另一辆车前面,则这辆车在另一辆车前。如果两车的通过距离相同,则编号小的在前。

USBUSB的卡丁车是世界一流的,他不用担心当不了第一名。他现在想知道,第tt时刻排在第kk位的是那辆车。

输入
第一行,包含一个正整数nn

22~n+1n+1行,第i+1i+1行包括两个正整数visiv_{i},s_{i}

n+2n+2行,包含一个正整数mm

n+3n+3~m+2m+2行,每行表示一个询问,包括两个正整数t,k。

输出
输出包括mm行,每行表示每个询问时刻tt排在第kk位的选手编号。

样例输入
4
2 100
3 50
4 60
5 1
4
1 1
50 2
60 4
100 1
样例输出
1
4
1
4
提示
【数据规模与约定】

对于30%30\%的数据:n,m1000;n,m≤1000;

另有40%40\%的数据:k=1;k=1;

对于100%100\%的数据: n,m7000;t1,000,000,000;v,s100,000;kn.n,m≤7000;t≤1,000,000,000;v,s≤100,000;k≤n.

题解:
emmmmmm。。。。。网上有一种炒鸡强的写法,叫做冒泡排序,但是我不会。。。。
于是,万能的STLSTL 助我切掉这题,赐予了我一个工具,叫nth_ elementnth\_\ element
对于每个询问,先找到前kk大的放前面,再找到前k1k-1的放前面,就好了。

#include<bits/stdc++.h>
using namespace std;
#define in inline
#define re register
#define rep(i,a,b) for(re int i=a;i<=b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template<class T>in void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
typedef long long ll;
const int N=7004;
int n,m;
struct A{ll v,s,d,id;}a[N];
in bool cmp(A x,A y){return x.d>y.d||(x.d==y.d&&x.id<y.id);}
int main(){
	g(n);
	rep(i,1,n) g(a[i].v),g(a[i].s),a[i].id=i;
	g(m);
	rep(i,1,m){
		ll t,k;g(t),g(k);
		rep(j,1,n) a[j].d=a[j].v*t+a[j].s;
		nth_element(a+1,a+1+k,a+1+n,cmp);
		nth_element(a+1,a+k,a+1+k,cmp);
		printf("%lld\n",a[k].id);
	}
	return 0;
}

相关标签: STL