【比賽】NOIP2017 列隊
阿新 • • 發佈:2018-07-21
push bubuko c++ define tree 的人 lan include 現在
一直忘了發,現在趕快補
用權值線段樹維護有人的位置,動態開點省空間
多加的人用個vector存下來就可以了
#include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long const int MAXN=300000+10; int n,m,q,N; std::vector<ll> V[MAXN]; template<typename T> inline void read(T &x) { T data=0,w=1; char ch=0; while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')w=-1,ch=getchar(); while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar(); x=data*w; } template<typename T> inline void write(T x,char ch='\0') { if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar(x%10+'0'); if(ch!='\0')putchar(ch); } template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);} template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);} template<typename T> inline T min(T x,T y){return x<y?x:y;} template<typename T> inline T max(T x,T y){return x>y?x:y;} #define Mid ((l+r)>>1) #define lson l,Mid #define rson Mid+1,r struct Segment_Tree{ int sum[MAXN<<5],lc[MAXN<<5],rc[MAXN<<5],root[MAXN<<5],cnt; inline void Update(int &rt,int l,int r,int ps) { if(!rt)rt=++cnt; sum[rt]++; if(l==r)return ; else { if(ps<=Mid)Update(lc[rt],lson,ps); else Update(rc[rt],rson,ps); } } inline int Query(int rt,int l,int r,int k) { if(l==r)return l; else { int t=Mid-l+1-sum[lc[rt]]; if(t>=k)return Query(lc[rt],lson,k); else return Query(rc[rt],rson,k-t); } } }; Segment_Tree T; #undef Mid #undef lson #undef rson int main() { freopen("phalanx.in","r",stdin); freopen("phalanx.out","w",stdout); read(n);read(m);read(q);N=max(n,m)+q; while(q--) { int x,y;read(x);read(y); ll now; if(y==m) { T.Update(T.root[n+1],1,N,now=T.Query(T.root[n+1],1,N,x)); now=now<=n?1ll*now*m:V[n+1][now-n-1]; V[n+1].push_back(now); write(now,'\n'); } else { T.Update(T.root[x],1,N,now=T.Query(T.root[x],1,N,y)); now=now<m?1ll*(x-1)*m+now:V[x][now-m]; V[n+1].push_back(now); write(now,'\n'); T.Update(T.root[n+1],1,N,now=T.Query(T.root[n+1],1,N,x)); now=now<=n?1ll*now*m:V[n+1][now-n-1]; V[x].push_back(now); } } return 0; }
【比賽】NOIP2017 列隊