您的位置:首页 > 其它

hdu5596

2015-12-19 08:06 363 查看

题意

n个人排成序列,每个人有类别ai(0或1),权值bi,一共n秒,第i秒,第i个人前面的很它类别不同,权值小于它的离开队伍。

另外,还有一些时间点,在这些时间点i后,前i个人bi加1,问最后队伍能剩几个人。

思路

倒着看序列,每次维护两种类别的最大值即可。

复杂度O(n)

注意时间点有可能重复。。。

实现

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 50005;
int sum[maxn];
int b[maxn];
int a[maxn];

int main(){
int T;
cin>>T;
int n,m;
while (T--){
cin>>n>>m;
for (int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
}
memset(sum,0,sizeof(sum));
for (int i=0;i<m;i++){
int tmp;
scanf("%d",&tmp);
sum[tmp]++;
}
int v[2] = {0,0};
int ans = 0;
int tot = 0;
for (int i=n;i>0;i--){
tot += sum[i];
int j = (a[i] ^ 1);
if (b[i] + tot >= v[j]){
ans++;
}
v[a[i]] = max(v[a[i]],b[i] + tot);

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