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; }
相关文章推荐
- 待校习
- Win10累积补丁KB3124200更新后版本同升为10586.36
- OSChina 周六乱弹 —— 这辈子最丢脸的事
- 数据库基础知识讲解
- Sicily Shortest path in unweighted graph
- 防火墙简介
- 其实闭包并不高深莫测
- 新文档
- js
- 网站备案实录:未关闭网站成功备案
- openjudge 瑞士轮
- Codevs_P1068 乌龟棋(DP+背包问题)
- Nagios check_logfiles插件的使用记录
- 开始写博客了!
- maya中将每帧渲染成图片,再用播放器播放
- VS 2013+Qt 5.4.1
- 开始写博客了!
- c++之路起航——指针
- Convert Sorted List to Binary Search Tree
- Leetcode: Basic Calculator