Codeforces Round #418 B
阿新 • • 發佈:2017-06-30
ref cin break define 位置 ble col ace ==
An express train to reveries
題意:給2長度為n的數列a b,a b中至少存在一個i使得ai!=bi,構造一個數列p,使得恰好存在一個i使得ai!=pi,且恰好存在一個j使得aj!=pj,且p裏面的數為1-n且無重復,輸出p,保證有解
思路:題目保證有解,可知,最多存在2個i使得ai!=bi,最少一個,如果只有一個,那麽好辦,令p=a,將pi換成1-n中沒有出現的那個數就可以了,如果有存在2個不等的數,那麽令p=a(除開兩個ai!=bi的位置),找出未出現的2個數,將2個數分別放在ai!=bi的位置上,判斷一下是否滿足要求(使得恰好存在一個i使得ai!=pi,且恰好存在一個j使得aj!=pj),若滿足輸出答案,若不滿足,則調換2個數的位置,此時一定滿足,輸出答案
AC代碼:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #definemem(a) memset(a,0,sizeof(a)) using namespace std; const int N=1e5+100; int a[1005],b[1005],p[1005],mp[1005],n,mk1,mk2,k1,k2,k; int main(){ cin>>n; for(int i=1; i<=n; ++i){ cin>>a[i]; } for(int i=1; i<=n; ++i){ cin>>b[i]; if(a[i]!=b[i] && !mk1){ mk1=mk2=i; k++; } else if(a[i]!=b[i]){ mk2=i; k++; } else p[i]=a[i],mp[p[i]]++; } if(k==1){ for(int i=1; i<=n; ++i){ if(!mp[i]){ p[mk1]=i; break; } } } else{ for(int i=1; i<=n; ++i){ if(!mp[i] && k1==0){ k1=i; k--; } else if(!mp[i]){ k2=i; k--; } if(!k) break; } p[mk1]=k1,p[mk2]=k2; if((p[mk1]!=a[mk1] && p[mk1]!=b[mk1]) || (p[mk2]!=a[mk2] && p[mk2]!=b[mk2])){ p[mk1]=k2,p[mk2]=k1; } } for(int i=1; i<=n; ++i){ cout<<p[i]<<" "; } return 0; } /* 5 1 2 3 4 3 1 2 5 4 5 5 4 4 2 3 1 5 4 5 3 1 4 1 1 3 4 1 4 3 4 */
Codeforces Round #418 B