GTW likes gt
Accepts: 54
Submissions: 782
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
从前,有nnn只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第iii只GT会随机得到一个能力值bib_ibi。在第iii秒的时候,第iii只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,...,bci都会增加1。
现在,GTW想知道在第nnn秒之后,会有几只GT存活下来。
总共TTT行,第iii行表示第iii组数据中,GT存活的个数。
输入样例
1 //测试数据个数
4 3 //n个gtm,m次发功
0 3
1 2
0 3
1 1
1 //发功时间
3
4
输出样例
3
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct gt
{
int pos,d;
int b;
}g[+];
int c[+];
int n,m;
int main()
{
int i,j;
int T;
freopen("in.txt","r",stdin);
cin>>T;
while(T--)
{
int co=;
scanf("%d%d",&n,&m);
for(i=;i<n;i++) scanf("%d%d",&g[i].pos,&g[i].b);
for(i=;i<m;i++) scanf("%d",&c[i]);
sort(c,c+m);
for(i=;i<n;i++)
g[i].d=;
for(i=;i<m;i++)
{
int t=c[i]-;
for(int p=;p<=t;p++)
g[p].b++;
}
for(i=;i<n;i++)
{
for(j=;j<i;j++)
{
if(g[j].d==&&g[j].pos!=g[i].pos&&g[i].b>g[j].b)
{
g[j].d=;
co++;
}
}
}
printf("%d\n",n-co);
}
}
应大神的的代码:
#include <iostream>
#include <queue>
#include <cstring>
#define for1to(i,n) for(int i=1;i<=n;i++)
#define forto(i,n) for(int i=0;i<n;i++)
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
int a[],b[];
int c[];
int main()
{
ios_base::sync_with_stdio(false);
int Total;
cin>>Total;
for1to(Case,Total)
{
priority_queue<int,vector<int>,greater<int> > pq1;
priority_queue<int,vector<int>,greater<int> > pq0;
int n,m;
cin>>n>>m;
forto(i,n)
cin>>a[i]>>b[i];
CLR(c);
forto(i,m)
{
int t;
cin>>t;
t--;
c[t]++;
}
int time=;
int nres=;
for(int i=;i<n;i++)
{
b[i]-=time;
time+=c[i];
if (a[i]==)
{
while(!pq1.empty()&&pq1.top()<b[i])
{
nres++;
pq1.pop();
}
pq0.push(b[i]);
}
else
{
while(!pq0.empty()&&pq0.top()<b[i])
{
nres++;
pq0.pop();
}
pq1.push(b[i]);
}
}
cout<<n-nres<<endl;
}
return ;
}