Jzoj5431 序列操作
来源:互联网 发布:俄罗斯历史书籍知乎 编辑:程序博客网 时间:2024/06/06 09:14
一开始有n个非负整数h[i](1<=i<=n),接下来会进行m次操作,第i次操作给出一个数c[i],要求你选出c[i]个大于零的数并将它们减去1。
问最多可以进行多少轮操作后无法操作(即没有c[i]个大于零的数)
考场上脑抽认为先减小的会更优(很明显先减大的会更优啊!!!!!)
考虑怎么维护,可以用splay
然而正常人都用BIT因为100W两个log不会超时(其实是会的不过jz跑得快)
先将所有数大到小排序丢入BIT中
每次找出第c[i]个数,将所有大于ci的都减一,等于c[i]的取最后的那些,这样就能保证序列单调性
(感觉自己好傻啊,这样下去迟早药丸)
#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include<stdio.h>#include<string.h>#include<algorithm>#define N 1000010#define LL long longusing namespace std;int n,m,s[N];struct fenwick{int w[N],S;inline void add(int x,int k){ for(;x<=n;x+=x&-x) w[x]+=k; }inline int sum(int x){ for(S=s[x];x;x&=x-1) S+=w[x]; return S; }} w;int lower_bound(int v){int l=0,r=n;for(int m;l<r;){m=l+r+1>>1;if(w.sum(m)<=v) r=m-1;else l=m;}return l;}int main(){freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d",s+i);sort(s+1,s+1+n); reverse(s+1,s+1+n);for(int x,v,u,i=1;i<=m;++i){scanf("%d",&x);v=w.sum(x);if(v==0||x>n) return 0&printf("%d\n",i-1);u=lower_bound(v);w.add(1,-1); w.add(u+1,1);v=lower_bound(v-1);w.add(v-(x-u)+1,-1); w.add(v+1,1);}printf("%d\n",m);}
阅读全文
0 0
- Jzoj5431 序列操作
- 【JZOJ5431】【NOIP2017提高A组集训10.28】序列操作
- JZOJ5431. 【NOIP2017提高A组集训10.28】序列操作
- 序列操作
- 序列操作
- 操作序列
- 操作序列
- OpenCV----视频序列操作
- oracle序列操作
- 序列化操作
- Tyvj 1491 序列操作
- python序列化操作
- ☆【線段樹】序列操作
- 【线段树】序列操作
- 程序序列化操作
- oracle 序列操作
- PostgreSQL序列操作函数:
- STL操作序列
- Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
- 磁盘与文件系统与目录
- 51nod 1781 Pinball【DP】【线段树】
- FTP服务
- c++实现md5加密
- Jzoj5431 序列操作
- poj1185之状态压缩
- LeetCode-3. Longest Substring Without Repeating Characters
- kafka学习笔记三:负载均衡
- WorkMan学习篇:三
- Caused by: java.net.SocketTimeoutException: connect timed out redis
- comparator接口与Comparable接口的区别
- Java基础部分第二十一节
- 窗口程序