ZOJ-3635-Cinema in Akiba
2012-08-28 19:05
246 查看
ZOJ-3635-Cinema in Akiba
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4803
有n个从1..n标号的座位,按时间顺序给出每个客人来的时候是坐在第几个空座位,最后给若干个询问问第i号客人坐在哪里
线段树即可,和POJ-2828-Buy Tickets差不多
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4803
有n个从1..n标号的座位,按时间顺序给出每个客人来的时候是坐在第几个空座位,最后给若干个询问问第i号客人坐在哪里
线段树即可,和POJ-2828-Buy Tickets差不多
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; #define N 50005 struct cam { int x; int y; int count; }list[N*4]; void build(int k,int x,int y) { list[k].x=x; list[k].y=y; list[k].count=y-x+1; if(x==y) return; int mid=(x+y)/2; build(k<<1,x,mid); build(k<<1|1,mid+1,y); } int update(int k,int x) { int ans; if(list[k].x==list[k].y) { list[k].count=0; return list[k].x; } if(x<=list[k<<1].count) ans=update(k<<1,x); else ans=update(k<<1|1,x-list[k<<1].count); list[k].count=list[k<<1].count+list[k<<1|1].count; return ans; } int main() { int i,n,m,cur; int query[3005],ans[50005]; while(scanf("%d",&n)!=EOF) { build(1,1,n); for(i=1;i<=n;i++) { scanf("%d",&cur); ans[i]=update(1,cur); } scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&query[i]); for(i=0;i<m;i++) printf(i==m-1?"%d\n":"%d ",ans[query[i]]); } return 0; }
相关文章推荐
- ZOJ 3635——Cinema in Akiba(树状数组+二分)
- zoj 3635 Cinema in Akiba 二分+树状数组
- ZOJ 3635 Cinema in Akiba[ 块状数组 ]
- ZOJ 题目3635 Cinema in Akiba(线段树插空)
- ZOJ 3635 Cinema in Akiba(线段树)
- ZOJ 3635 Cinema in Akiba【线段树】
- ZOJ 3635 Cinema in Akiba
- Poj 2828 Buy Tickets \ Zoj 3635 Cinema in Akiba
- ZOJ 3635 Cinema in Akiba
- ZOJ 3635 Cinema in Akiba(树状数组 + 二分)
- ZOJ 3635 Cinema in Akiba(线段树)
- zoj 3635 Cinema in Akiba(树状数组+二分)
- ZOJ 3635 Cinema in Akiba (树状数组+二分)
- ZOJ 3635 Cinema in Akiba【树状数组+二分查找】
- ZOJ 3635 Cinema in Akiba(二分+树状数组)
- ZOJ 3635 Cinema in Akiba (第一次组队) 树状数组+二分
- ZOJ 3635 Cinema in Akiba[ 大规模阵列 ]
- zoj 3635 Cinema in Akiba
- ZOJ3635——Cinema in Akiba(树状数组+二分)
- ZOJ3635 Cinema in Akiba