写了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 }
View Code

相关文章: