標籤:back string ++ query sum include tor alt int
noip2017 D2T3 列隊 某zz選手當時直接放棄了寫了50還寫錯了
題目大意:
有一個n行m列的方陣,第i行j列的點編號為(i-1)m+j
每次把第x行y列的點拿出來,然後把這一行它之後的點都向左推,把最後一列x行之後的點都向上推
然後把拿出來的點放到最後一個位置,詢問這個點的編號
思路:
因為n+q並不大 可以動態開點每行維護一個權值線段樹 並對最後一行單獨維護
對於新進來的點使用vector維護
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 213906214310 #define ll long long11 #define MAXN 30010012 using namespace std;13 inline int read()14 {15 int x=0,f=1;char ch=getchar();16 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}17 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}18 return x*f;19 }20 int n,m,q,rt[MAXN],ls[MAXN*20],rs[MAXN*20],sum[MAXN*20],sz;21 ll ans[MAXN<<1];22 vector <ll> vec[MAXN];23 int query(int &k,int l,int r,int x)24 {25 if(!k) k=++sz,sum[k]=r-l+1;26 sum[k]--;27 if(l==r) return l;28 int mid=l+r>>1,sl=ls[k]?sum[ls[k]]:mid-l+1;29 if(x<=sl) query(ls[k],l,mid,x);30 else query(rs[k],mid+1,r,x-sl);31 }32 int main()33 {34 n=read(),m=read(),q=read();int a,b,res;35 for(int i=1;i<=n;i++) ans[i]=1ll*i*m;36 for(int i=n+1;i<=n+q;i++)37 {38 a=read(),b=read();39 if(b==m) ans[i]=ans[query(rt[0],1,n+q,a)];40 else 41 {42 res=query(rt[a],1,m+q,b);43 if(res<m) ans[i]=(a-1ll)*m*1ll+res;44 else ans[i]=vec[a][res-m];45 vec[a].push_back(ans[query(rt[0],1,n+q,a)]);46 }47 printf("%lld\n",ans[i]);48 }49 }View Code
luogu 3960 列隊