poj2828Buy Tickets(线段树 单点更新+区间求和+区间第K值)
2012-09-05 13:24
169 查看
http://poj.org/problem?id=2828
险过 3500+ms
第i个人入队 只影响后面的不会影响前面的 可以倒推 全初始化为1 第i个人去第k位置 由于是倒推,第k个位置为0,表示求k-1位置的时候不能算上k位置的人 根据区间和 求出区间第K值 就是第i个人要放的位置
View Code
险过 3500+ms
第i个人入队 只影响后面的不会影响前面的 可以倒推 全初始化为1 第i个人去第k位置 由于是倒推,第k个位置为0,表示求k-1位置的时候不能算上k位置的人 根据区间和 求出区间第K值 就是第i个人要放的位置
View Code
#include <iostream> #include<cstdio> #include<string.h> using namespace std; #define N 200001 int s[N*4],d[N*2][2],po[N*2],j; void build(int l,int r,int w) { if(l==r) { s[w] = 1; return ; } int m = (l+r)/2; build(l,m,2*w); build(m+1,r,2*w+1); } void upset(int l,int r,int w) { if(l==r) return ; int m =(l+r)/2; upset(l,m,2*w); upset(m+1,r,2*w+1); s[w] = s[w*2]+s[2*w+1]; } void add(int p,int da,int l,int r,int w) { if(l==r) { s[w] = 0; po[l] = da; return ; } int m= (l+r)/2; if(p<=s[w*2]) add(p,da,l,m,2*w); else add(p-s[w*2],da,m+1,r,2*w+1); s[w] = s[2*w]+s[w*2+1]; } int main() { int n,i,k,m; while(scanf("%d",&n)!=EOF) { j =0; memset(po,0,sizeof(po)); for(i = 1; i <= n ; i++) scanf("%d%d", &d[i][0],&d[i][1]); build(1,n,1); upset(1,n,1); for(i = n ; i >= 1; i--) add(d[i][0]+1,d[i][1],1,n,1); for(i = 1 ; i < n ; i++) printf("%d ",po[i]); printf("%d\n",po ); } return 0; }
相关文章推荐
- Hdu 1166 敌兵布阵 树状数组 或 线段树 单点更新,区间求和
- 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第五场)A.逆序数 B.Big Water Problem(线段树-区间查询求和和单点更新) F.The Biggest Water Problem H.Tree Recovery(线段树-区间查询求和和区间更新)
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- hdu 4046 Panda (线段树,单点更新,区间求和)
- HDU 1166 敌兵布阵【线段树,树状数组入门题,单点更新,区间求和】
- hdu 1166 敌兵布阵【线段树】单点更新,区间求和
- hdoj 1541 Stars 【树状数组 线段树】【单点更新 区间求和】
- HDU 1166 敌兵布阵(线段树单点更新+区间求和)
- NYOJ 116 士兵杀敌(二)(线段树—区间求和,单点加值更新)
- hdu 1166线段树 单点更新 区间求和
- HDU 1754 单点更新 区间求和 zkw线段树 + 递归线段树
- 线段树 --- (单点更新、区间求和、模板题)
- leetCode_线段树、单点更新、区间求和
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
- CDOJ1073-秋实大哥与线段树 线段树单点更新+区间求和
- HDU 1166-敌兵布阵(线段树:单点更新,区间求和)
- hdu4288 Coder 离线线段树 单点更新 区间求和 离散化?
- HDU 3874 Necklace(线段树啊 单点更新 区间求和)
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- HDU - 1394 - Minimum Inversion Number (线段树 - 单点更新,区间求和)