Codeforces Round #252 (Div. 2)-C,D
阿新 • • 發佈:2018-02-11
++ con cli 排列 tor 節點 -c fin ios
D:首先依據環。把每個環分成一組。記錄下此時至少須要交換all次,才幹回歸到恒等排列。
C題就是一個簡單的模擬。首先給每一個人兩個。然後把剩下的都給一個人就好了。
給的時候蛇形給。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> using namespace std; #define LL __int64 #define maxn 330000 int main() { int n,m,k; while(~scanf("%d%d%d",&n,&m,&k)) { int leap=1; int stx=1; int sty=1; int ms=n*m-(k*2)+2; printf("%d",ms); while(ms--) { printf(" %d %d",stx,sty); sty+=leap; if(sty<1||sty>m) { if(sty<1)sty=1; if(sty>m)sty=m; stx++;leap=-leap; } } cout<<endl; k--; while(k--) { printf("%d ",2); printf("%d %d ",stx,sty); sty+=leap; if(sty<1||sty>m) { if(sty<1)sty=1; if(sty>m)sty=m; stx++;leap=-leap; } printf("%d %d\n",stx,sty); sty+=leap; if(sty<1||sty>m) { if(sty<1)sty=1; if(sty>m)sty=m; stx++;leap=-leap; } } } return 0; }
1。假設all大於p。
那麽我們就應該把all降低。
對於一個環。隨意兩個點交換都能夠把環分成兩份。all-1;
對於每次降低,我們尋找環的最小值最小的環,然後在這個環中尋找最小值,然後交換這兩個點。
2,假設all小於p。那麽我們應該把all增大。
那麽我們就能夠把1號節點和隨意節點交換。來達到增大all的目的。
註意,1號節點不和本身的環交換。
而且1號節點和隨意一個環僅僅交換一次。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> using namespace std; #define LL __int64 #define maxn 3300 int a[maxn]; int b[maxn]; int vis[maxn]; vector<int>vec; vector< vector<int> >ans; struct list { int x,y; } node; vector<list>pr; bool cmp(vector<int>a,vector<int>b) { return a[0]<b[0]; } struct listt { int x; int index; int l,r; friend bool operator <(const listt &a,const listt &b) { return a.x>b.x; } }tt; priority_queue<listt>que; int main() { int n,m; while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=a[i]; } scanf("%d",&m); memset(vis,0,sizeof(vis)); vec.clear(); ans.clear(); int all=0; for(int i=1; i<=n; i++) { if(vis[i])continue; int j=i; vec.clear(); while(b[j]!=j&&vis[j]==0) { vec.push_back(j); vis[j]=1; j=b[j]; } if(vec.size()) { // sort(vec.begin(),vec.end()); ans.push_back(vec); all+=vec.size()-1; } } sort(ans.begin(),ans.end(),cmp); pr.clear(); if(all<=m) { all=m-all; if(ans.size()==0) { node.x=1; for(int i=2; i<=all+1; i++) { node.y=i; pr.push_back(node); } } else { node.x=1; int j=0; if(ans[0][0]==1)j++; for(int i=2; i<=n&&all>0; i++) { if(b[i]==i) { all--; node.y=i; pr.push_back(node); } if(ans.size()>j&&ans[j][0]==i) { all--; node.y=i; j++; pr.push_back(node); } } } } else { int qian=all; all=all-m; int i=0; while(!que.empty())que.pop(); for(i=0;i<ans.size();i++) { tt.index=i; tt.x=ans[i][0]; que.push(tt); } while(all) { tt=que.top(); que.pop(); i=tt.index; node.x=ans[i][0]; int minn=9999; int st=0; for(int j=1;j<ans[i].size()&&all>0;j++) { if(minn>ans[i][j]) { minn=ans[i][j]; st=j; } } node.y=minn; all--; pr.push_back(node); vec.clear(); minn=9999; vec.push_back(ans[i][st]); for(int j=1;j<st;j++) { vec.push_back(ans[i][j]); } if(vec.size()>1) { ans.push_back(vec); tt.index=ans.size()-1; tt.x=vec[0]; que.push(tt); } vec.clear(); vec.push_back(ans[i][0]); for(int j=st+1;j<ans[i].size();j++) { vec.push_back(ans[i][j]); } if(vec.size()>1) { ans[i]=vec; tt.index=i; tt.x=vec[0]; que.push(tt); } i++; } } cout<<pr.size()<<endl; for(int i=0; i<pr.size(); i++) { printf("%d %d\n",pr[i].x,pr[i].y); } } return 0; }
Codeforces Round #252 (Div. 2)-C,D