您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: