写了300分得了120 被众多低年级大佬的暴力踩成了弱智
T1 avogadro
题目大意:
3行N列 第一行为N的排列 其余两行的数属于$[1,n]$
求最少删除多少列使剩下的列中 三行排序后一样
思路:
找到第二行或第三行里没有的 然后像拓扑一样搞就行了
(写的贼丑)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #define inf 2139062143 11 #define ll long long 12 #define MAXN 200100 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();} 18 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 //yyc score=0 22 int n,a[MAXN][3],hsh[MAXN],cnt[MAXN][3]; 23 int vis[MAXN],q[MAXN],l=1,r,ans; 24 int main() 25 { 26 freopen("avogadro.in","r",stdin); 27 freopen("avogadro.out","w",stdout); 28 n=read();int b,c; 29 for(int i=1;i<=n;i++) a[i][0]=read(),hsh[a[i][0]]=i; 30 for(int i=1;i<=n;i++) a[i][1]=read(),cnt[a[i][1]][1]++; 31 for(int i=1;i<=n;i++) a[i][2]=read(),cnt[a[i][2]][2]++; 32 for(int i=1;i<=n;i++) 33 if((!cnt[i][1]||!cnt[i][2])&&!vis[hsh[i]]) vis[hsh[i]]=1,q[++r]=hsh[i]; 34 while(l<=r) 35 { 36 c=q[l++],cnt[a[c][1]][1]--,cnt[a[c][2]][2]--; 37 if(!vis[hsh[a[c][1]]]&&!cnt[a[c][1]][1]) vis[hsh[a[c][1]]]=1,q[++r]=hsh[a[c][1]]; 38 if(!vis[hsh[a[c][2]]]&&!cnt[a[c][2]][2]) vis[hsh[a[c][2]]]=1,q[++r]=hsh[a[c][2]]; 39 } 40 for(int i=1;i<=n;i++) if(vis[i]) ans++; 41 printf("%d",ans); 42 }