博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jzoj5431 序列操作
阅读量:5287 次
发布时间:2019-06-14

本文共 1219 字,大约阅读时间需要 4 分钟。

一开始有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
#include
#include
#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
>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);}

转载于:https://www.cnblogs.com/Extended-Ash/p/7846030.html

你可能感兴趣的文章
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
CF461B Appleman and Tree
查看>>
CF1215E Marbles
查看>>
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
mysql 8.0 zip包安装
查看>>
awk 统计
查看>>
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>