博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4415 发牌
阅读量:5297 次
发布时间:2019-06-14

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

线段树

记录当前位于牌堆第几张,不搬牌,发牌即询问第K个可用位置
注意对Size取模即可

#include 
const int MAXN=700111;int N;int R[MAXN];int At, Cnt;struct Node{ int l, r, cnt;} T[MAXN<<2];void BuildTree(int l, int r, int at){ T[at].l=l;T[at].r=r;T[at].cnt=(r-l+1); if(l==r) return; int m=(l+r)>>1; BuildTree(l, m, at<<1); BuildTree(m+1, r, (at<<1)|1);}void Update(int at, int p){ --T[at].cnt; if(T[at].l==T[at].r) return; int m=(T[at].l+T[at].r)>>1; if(p<=m) Update(at<<1, p); else Update((at<<1)|1, p);}int Ask(int at, int k){ int m=(T[at].l+T[at].r)>>1; if(T[at].l==T[at].r) return m; int ls=T[at<<1].cnt; if(k<=ls) return Ask(at<<1, k); return Ask((at<<1)|1, k-ls);}int main(){ scanf("%d", &N); BuildTree(1, N, 1); At=1;Cnt=N; for(int i=1, r, v;i<=N;++i){ scanf("%d", &r); At+=r;At%=Cnt;if(!At) At+=Cnt; v=Ask(1, At);Update(1, v); printf("%d\n", v);--Cnt; } return 0;}/*420323421*/

转载于:https://www.cnblogs.com/Pickupwin/p/BZOJ4415.html

你可能感兴趣的文章
LuoGu P2735 电网 Electric Fences
查看>>
BZOJ 1246 & 有点不一样的概率DP
查看>>
BOS10——权限控制的实现,apache shiro权限管理框架的使用,参数同名问题,EasyUI的combotree的使用...
查看>>
CentOS上yum时遇到Insufficient space on download directory的问题的解决办法
查看>>
PowerShell升级远程机器的windows service的脚本(最终版)
查看>>
程序的堆与栈(转载)
查看>>
Vue.js经典开源项目汇总-前端参考资源
查看>>
WINFORM跟随WPF窗体移动
查看>>
MainApi
查看>>
160809310 袁韬淳
查看>>
POJ 2927 判断数字个数
查看>>
到明年的中期应该达成的目标
查看>>
IIS5.1部署WCF4 REST Service注意事项
查看>>
HTTP 笔记与总结(8)HTTP 与内容压缩
查看>>
poj 1459 网络流问题`EK
查看>>
欧拉路&&欧拉回路 概念及其练习
查看>>
HDU 1978 记忆化搜索(dfs+dp)
查看>>
How Do I Restart MySQL Server?
查看>>
第二章
查看>>
关于代码维护的一点点看法
查看>>