hdu 5596 GTW likes gt
题意:
问题描述
从前,有n只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第i只GT会随机得到一个能力值bi。在第i秒的时候,第i只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,...,bci都会增加1。
现在,GTW想知道在第n秒之后,会有几只GT存活下来。
输入描述
第一行只有一个整数T(T≤5),表示测试数据组数。
第二行有两个整数n,m。表示GT的个数和GTW发功的次数。(1≤n≤50000,1≤m≤50000)
第三到n+2行,每行有两个整数ai,bi,表示第i只GT在哪个组和他的能力值 (0≤a[i]≤1,1≤b[i]≤106)
第n+3行到第n+m+2行,每行有一个整数ci,表示GTW第i次发功的时间。1≤c[i]≤n
输出描述
总共T行,第i行表示第i组数据中,GT存活的个数。
输入样例
1
4 3
0 3
1 2
0 3
1 1
1
3
4
输出样例
3
Hint
第1秒后 能力值为4 2 3 1
第2秒后 能力值为4 2 3 1
第3秒后 能力值为5 3 4 1,第2只GT被第3只GT消灭掉了
第4秒后 能力值为6 4 5 2
ci并不是有序的
/*一秒内可以发功多次- -
思路:
先想法得出最终的数列,然后倒着遍历,记录走过的两个组的最大值,如果比当前大,则可以消灭当前值,即总数会
减1.
Orz:
主要是一直没什么思路,没有考虑到倒着来搞,感觉遇到几次了QAQ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #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[n]){max0--;max1--;} // int sum = c[n]; 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步