FZU 1962 新击鼓传花游戏
2015-07-18 10:11
405 查看
题目:http://acm.fzu.edu.cn/problem.php?pid=1962
线段树存人数来解题
线段树存人数来解题
#include<iostream> #include<cstdio> using namespace std; int a[2000001]; void update(int rt) { a[rt]=a[rt<<1]+a[rt<<1|1]; } void build(int l,int r,int rt) { if(l==r) a[rt]=1; else{ int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); update(rt); } } void leave(int l,int r,int k,int rt) { if(l==r) a[rt]=0; else{ if(k<=a[rt<<1]) leave(l,(l+r)/2,k,rt<<1); else leave((l+r)/2+1,r,k-a[rt<<1],rt<<1|1); update(rt); } } void Return(int l,int r,int x,int boot) { if(l==r) a[boot]=1; else{ if(x<=(l+r)/2) Return(l,(l+r)/2,x,boot<<1); else Return ((l+r)/2+1,r,x,boot<<1|1); update(boot); } } int qurry(int l,int r,int k,int boot) { if(l==r) return l; if(a[boot<<1]>=k) return qurry(l,(l+r)/2,k,boot<<1); else return qurry((l+r)/2+1,r,k-a[boot<<1],boot<<1|1); } int main() { char c; int n,m,t; scanf("%d%d",&n,&m); build(1,n,1); while(m--){ getchar(); scanf("%c%d",&c,&t); if(c=='L') leave(1,n,t,1); else if(c=='R') Return (1,n,t,1); else if(c=='Q') printf("%d\n",qurry(1,n,t,1)); } return 0; }
相关文章推荐
- sphinx --- 安装中碰到的问题
- 1629 - Cake slicing(DP)
- jQuery插件 -- Cookie插件
- Reverse Words in a String
- 计蒜客课程系列:统计三角形(DFS+哈希状态存储标记)
- hibernate中的锁
- 冒泡排序详解7-20
- Happy Number
- concurrentHashmap
- android专题解决之按钮快速点击重复调用问题
- 嵌入式linux按键驱动,同步互斥阻塞,linux进程六大状态
- java新手笔记1 Hello World!
- IOS AutoLayout详解(二)-多动图详解
- Vuforia SDK---- AR开发vuforia 二维码扫描
- UVA 11752-The Super Powers
- sim900a 裸AT通过GPRS网络发送接收数据
- Ubuntu下安装ARM交叉编译器过程
- 算法导论 第十六章:贪心算法之单任务调度问题
- [LeetCode]Implement Queue using Stacks
- 九章算法面试题77 插入区间