既然UOJ Easy Round是省选难度,那么请问不带Easy的是什么鬼?
当然我的Blog也出现了点意外,计数器君被drc刷爆了。
T1
诶这是什么神题,我怎么连30分都不会做。
哎呦原来只要可行解呀,这60分是送的呀,出题人送温暖啊。
那就打60分好了。
接着Gold_7AC此题,感到不明觉厉,于是撒了金坷垃打了正解。
如果x柱上的盘的权值在[l,r]之间,那么可以把[l,mid]放在y柱上,[mid+1,r]放在z柱上。
接着再对y、z柱上的盘分治,排序,然后移回来,那么x柱上的盘就完成了排序。
打完之后不停地WA。。。
然后发现数组开小了。。。(打Pascal的Debuff啊)
T2
交互题是什么不明觉厉的东西?
不会,弃坑。
T3
掐指一算,发现暴力拿不了20分。
弃疗了。。。
如果有丧病的OIer对T2或T3感兴趣的话请看链接:http://jiry_2.blog.uoj.ac/blog/1024
【Codes】
#include<cstdio> #include<algorithm> #include<cstring> int n,i,x,ans; int h[3][1000010]; int f[1000010][2]; using namespace std; void sol(int l,int r,int p){ if (l==r)return; int mid=l+r>>1; int x=(p+1)%3,y=(p+2)%3; for (i=h[p][0];i>=h[p][0]-r+l;i--) if (h[p][i]<=mid){ f[++ans][0]=p,f[ans][1]=x; h[x][++h[x][0]]=h[p][i]; }else{ f[++ans][0]=p,f[ans][1]=y; h[y][++h[y][0]]=h[p][i]; } h[p][0]-=r-l+1; sol(l,mid,x); sol(mid+1,r,y); for (i=h[y][0];i>=h[y][0]-r+mid+1;i--)f[++ans][0]=y,f[ans][1]=x; for (i=h[y][0]-r+mid+1;i<=h[y][0];i++){ f[++ans][0]=x,f[ans][1]=p; h[p][++h[p][0]]=h[y][i]; } for (i=h[x][0];i>=h[x][0]-mid+l;i--)f[++ans][0]=x,f[ans][1]=y; for (i=h[x][0]-mid+l;i<=h[x][0];i++){ f[++ans][0]=y,f[ans][1]=p; h[p][++h[p][0]]=h[y][i]; } h[x][0]-=mid-l+1; h[y][0]-=r-mid; } int main(){ scanf("%d",&n); for (i=1;i<=n;i++)scanf("%d",&x),h[0][++h[0][0]]=x; for (i=1;i<=n>>1;i++)swap(h[0][i],h[0][n-i+1]); sol(1,n,0); printf("%d\n",ans); for (i=1;i<=ans;i++)printf("%d %d\n",f[i][0]+1,f[i][1]+1); }