标签:
从前,有nn只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第ii只GT会随机得到一个能力值bib?i??。在第ii秒的时候,第ii只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功mm次,第ii次发功的时间为cic?i??,则在第cic?i??秒结束后,b1b2...bcib?1??,b?2??,...,b?c?i????都会增加1。
现在,GTW想知道在第nn秒之后,会有几只GT存活下来。
第一行只有一个整数TT5T(T≤5),表示测试数据组数。
第二行有两个整数nmn,m。表示GT的个数和GTW发功的次数。(1n500001m500001≤n≤50000,1≤m≤50000)
第三到n2n+2行,每行有两个整数aibia?i??,b?i??,表示第ii只GT在哪个组和他的能力值 0ai11bi106(0≤a[i]≤1,1≤b[i]≤10?6??)
第n3n+3行到第nm2n+m+2行,每行有一个整数cic?i??,表示GTW第ii次发功的时间。1cin1≤c[i]≤n
总共TT行,第ii行表示第ii组数据中,GT存活的个数。
1 4 3 0 3 1 2 0 3 1 1 1 3 4
3
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
int a;//分组
int b;//能力值
}gt[50010];
int main()
{
int T,i,j,count;
int n,m;
int c[50010];
cin>>T;
while(T--)
{
cin>>n>>m;
count=0;
for(i=1;i<=n;i++)
{
cin>>gt[i].a>>gt[i].b;
}//输入组数,能力值
for(i=0;i<m;i++)
{
cin>>c[i];
}//输入发功时间
sort(c,c+m);
for(i=0;i<m;i++)
{
//第i次发功时间
for(j=1;j<=c[i];j++)
gt[j].b+=1;
}//先不管干没干掉,将所有发功引起的能力值加上,能力值加上后结果不变,将所有能力值加上后在判断死完人数。
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
if((gt[j].a!=gt[i].a)&&(gt[j].b<gt[i].b))
gt[j].b=0;//为0代表干掉
}
}//干掉前面的。
for(i=1;i<=n;i++)
{
if(gt[i].b!=0)
count++;
}
cout<<count<<endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/xiangrutt/p/5041750.html