1. 程式人生 > >Codeforces Round #418 B

Codeforces Round #418 B

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;
#define
mem(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