P3960 列队
Posted qyj060604
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3960 列队相关的知识,希望对你有一定的参考价值。
P3960 列队
来讲讲我力所能及的骗分
1.纯暴力
30分的好成绩
#include<bits/stdc++.h> using namespace std; int n,m,p; int k[100001]; int c[1001][1001]; int main() { scanf("%d%d%d",&n,&m,&p); if(n==1) { for(int i=1;i<=m;i++) k[i]=i; for(int i=1;i<=p;i++) { int x,y; scanf("%d%d",&x,&y); int sum=k[y]; for(int j=y;j<m;j++) k[j]=k[j+1]; k[m]=sum; printf("%d ",sum); } } else { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { c[i][j]=(i-1)*m+j; } } for(int i=1;i<=p;i++) { int x,y; scanf("%d%d",&x,&y); int sum=c[x][y]; for(int j=y;j<m;j++) c[x][j]=c[x][j+1]; for(int j=x;j<n;j++) c[j][m]=c[j+1][m]; c[n][m]=sum; printf("%d ",sum); } } return 0; }
2.另20分
非常休闲
发现四个数据点n=1
那么就是一条链
所以说我们只需要维护一个支持动态删除、移动、加入的array
删除任意,加入最后
很容易想到线段树
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=600005; int n,m,p; ll c[1001][1001]; ll val[N]; int cnt; struct Sugment_Tree{ ll s[N<<2]; #define il inline #define mid (l+r)/2 Sugment_Tree(){memset(s,0,sizeof(s));} il void push_up(int num){ s[num]=s[num<<1]+s[num<<1|1]; } il void build(int l,int r,int num){ if(l==r){ if(l<=m) s[num]=1; else s[num]=0; return; } build(l,mid,num<<1); build(mid+1,r,num<<1|1); push_up(num); } il void del(int l,int r,int num,int POS){ if(l>POS||r<POS) return; if(l==r&&r==POS){ s[num]=0; return; } del(l,mid,num<<1,POS); del(mid+1,r,num<<1|1,POS); push_up(num); } il void ins(int l,int r,int num,int POS){ if(l>POS||r<POS) return; if(l==r&&r==POS){ s[num]=1; return; } ins(l,mid,num<<1,POS); ins(mid+1,r,num<<1|1,POS); push_up(num); } il ll ask(int l,int r,int num,int L,int R){ if(l>R||r<L) return 0ll; if(l>=L&&r<=R) return s[num]; return ask(l,mid,num<<1,L,R)+ask(mid+1,r,num<<1|1,L,R); } }T; int serch(ll sum){ int l=1,r=m+p,ans=-1; while(l<=r){ if(T.ask(1,m+p,1,1,mid)<sum) ans=mid,l=mid+1; else r=mid-1; } ans++; while(val[ans]==0) ans++; return ans; } int main() { //freopen("phalanx11.in","r",stdin); scanf("%d%d%d",&n,&m,&p); if(n==1) { cnt=m; T.build(1,m+p,1); for(int i=1;i<=m;i++) val[i]=i; //cout<<T.ask(1,m+p,1,1,1)<<" *@**&#@"<<endl; int uu=p; while(uu--){ int x,y; scanf("%d%d",&x,&y); int pos=serch(y); ll sumi=val[pos]; val[pos]=0; T.del(1,m+p,1,pos); cnt++; val[cnt]=sumi; T.ins(1,m+p,1,cnt); printf("%lld ",sumi); } } else { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { c[i][j]=(ll)(i-1)*m+j; } } for(int i=1;i<=p;i++) { int x,y; scanf("%d%d",&x,&y); ll sum=c[x][y]; for(int j=y;j<m;j++) c[x][j]=c[x][j+1]; for(int j=x;j<n;j++) c[j][m]=c[j+1][m]; c[n][m]=sum; printf("%lld ",sum); } } return 0; }
以上是关于P3960 列队的主要内容,如果未能解决你的问题,请参考以下文章