您的位置:首页 > 其它

hdu 5596 GTW likes gt

2015-12-15 11:19 309 查看
题意:

问题描述
从前,有nn只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第ii只GT会随机得到一个能力值b_ib​i​​。在第ii秒的时候,第ii只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功mm次,第ii次发功的时间为c_ic​i​​,则在第c_ic​i​​秒结束后,b_1,b_2,...,b_{c_i}b​1​​,b​2​​,...,b​c​i​​​​都会增加1。
现在,GTW想知道在第nn秒之后,会有几只GT存活下来。

输入描述
第一行只有一个整数T(T\leq 5)T(T≤5),表示测试数据组数。
第二行有两个整数n,mn,m。表示GT的个数和GTW发功的次数。(1\leq n \leq 50000,1\leq m\leq 500001≤n≤50000,1≤m≤50000)
第三到n+2n+2行,每行有两个整数a_i,b_ia​i​​,b​i​​,表示第ii只GT在哪个组和他的能力值 (0\leq a[i]\leq 1,1\leq b[i]\leq 10^6)(0≤a[i]≤1,1≤b[i]≤10​6​​)
第n+3n+3行到第n+m+2n+m+2行,每行有一个整数c_ic​i​​,表示GTW第ii次发功的时间。1\leq c[i]\leq n1≤c[i]≤n

输出描述
总共TT行,第ii行表示第ii组数据中,GT存活的个数。

输入样例
1
4 3
0 3
1 2
0 3
1 1
1
3
4

输出样例
3

Hint
第11秒后 能力值为4\ 2\ 3\ 14 2 3 1
第22秒后 能力值为4\ 2\ 3\ 14 2 3 1
第33秒后 能力值为5\ 3\ 4\ 15 3 4 1,第22只GT被第33只GT消灭掉了
第44秒后 能力值为6\ 4\ 5\ 26 4 5 2
c_ic​i​​并不是有序的

/*一秒内可以发功多次- -

思路:

先想法得出最终的数列,然后倒着遍历,记录走过的两个组的最大值,如果比当前大,则可以消灭当前值,即总数会

减1.

Orz:

主要是一直没什么思路,没有考虑到倒着来搞,感觉遇到几次了QAQ。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int INF = 10000;

const int maxn = 1000010;
int t[maxn],a[maxn],c[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
int max0,max1;
memset(c,0,sizeof(c));
for(int i = 1; i <= n; i++)
{
scanf("%d%d",&t[i],&a[i]);
}
for(int i = 1;i <= m;i++)
{
int t;
scanf("%d",&t);
c[t]++;
}
int sum = 0;
for(int i = 1;i <= n;i++)
{
a[i] += (m-sum);
sum += c[i];
}

max0 = max1 = 0;
//if(ADD
){max0--;max1--;}
// int sum = c
;
int sub = 0;
for(int i = n;i >= 1;i--)
{
if(t[i] == 0)
{
if(max1 > a[i])
sub++;
// a[i] -= sum;
max0 = max(max0,a[i]);
}
if(t[i] == 1)
{
if(max0 > a[i])
sub++;
max1 = max(max1,a[i]);
}
}
printf("%d\n",n-sub);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: