loj #6091. 「Codeforces Round #418」幻想特快

#6091. 「Codeforces Round #418」幻想特快

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 #define maxn 10000
 8 int n,a[maxn],b[maxn],p[maxn],nxt1,nxt2,tot,x1,x2,y1,y2;
 9 bool vis[maxn];
10 char ch;
11 inline void read(int &now)
12 {
13     int f=1; ch=getchar(); now=0;
14     while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f*=-1; ch=getchar();}
15     while(ch>=‘0‘&&ch<=‘9‘) now=now*10+ch-‘0‘,ch=getchar();
16     now*=f;
17 }
18
19 int main()
20 {
21     read(n);
22     for(int i=1;i<=n;i++) read(a[i]);
23     for(int i=1;i<=n;i++) read(b[i]);
24     for(int i=1;i<=n;i++)
25     {
26         if(a[i]!=b[i])
27         {
28             tot++;
29             if(tot==1) nxt1=i,x1=a[i],x2=b[i];
30             else nxt2=i,y1=a[i],y2=b[i];
31         }
32     }
33     if(tot==1)
34     {
35         for(int i=1;i<=n;i++)
36             if(i!=nxt1) p[i]=a[i],vis[p[i]]=1;
37         for(int i=1;i<=n;i++)
38         {
39             if(i==nxt1)
40             {
41                 for(int j=1;j<=n;j++)
42                 {
43                     if(j!=x1&&j!=x2&&!vis[j])
44                     {
45                         p[i]=j;
46                         break;
47                     }
48                 }
49             }
50         }
51     }
52     if(tot==2)
53     {
54         for(int i=1;i<=n;i++)
55             if(i!=nxt1&&i!=nxt2) p[i]=a[i],vis[p[i]]=1;
56         for(int i=1;i<=n;i++)
57         {
58             if(i==nxt1)
59             {
60                 if(!vis[a[i]]) p[i]=a[i],vis[a[i]]=1;
61                 else p[i]=b[i],vis[b[i]]=1;
62             }
63             if(i==nxt2)
64             {
65                 if(!vis[a[i]]) p[i]=a[i],vis[a[i]]=1;
66                 else p[i]=b[i],vis[b[i]]=1;
67             }
68         }
69         int cnt[maxn],if_=0;
70         for(int i=1;i<=n;i++) cnt[p[i]]++;
71         for(int i=1;i<=n;i++) if(cnt[i]>1) if_=1;
72         if(if_==1)
73         {
74             memset(vis,0,sizeof(vis));
75             memset(p,0,sizeof(p));
76             for(int i=1;i<=n;i++)
77                 if(i!=nxt1&&i!=nxt2) p[i]=a[i],vis[p[i]]=1;
78             for(int i=1;i<=n;i++)
79             {
80                 if(i==nxt1)
81                 {
82                     if(!vis[b[i]]) p[i]=b[i],vis[b[i]]=1;
83                     else p[i]=a[i],vis[a[i]]=1;
84                 }
85                 if(i==nxt2)
86                 {
87                     if(!vis[b[i]]) p[i]=b[i],vis[b[i]]=1;
88                     else p[i]=a[i],vis[a[i]]=1;
89                 }
90             }
91         }
92     }
93     for(int i=1;i<=n;i++)
94         printf("%d ",p[i]);
95     return 0;
96 }

时间: 2024-11-07 10:14:55

loj #6091. 「Codeforces Round #418」幻想特快的相关文章

loj #6090. 「Codeforces Round #418」尘封思绪

https://loj.ac/problem/6090 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define maxn 10900 9 int n,k,a[maxn],b[maxn],cnt

【LOJ #6094. 「Codeforces Round #418」归乡迷途】

题目大意: 传送门. lca说的很明白就不重复了. 题解: 先膜一发lca. 大体读完题以后我们可以知道对于第i个节点最短路一定是连向1到i-1中的某个点. 然后我们考虑将到1距离(这里及以下均是最短路)相等的点放到同一层,显然最后的总体结构应该是一棵树,再加上在同一层/深度相同的点之间连接一些边的并. 很容易发现一层的转移只需要知道上一层度数为2/3的个数,以及当前层之间的相互连接. 先说一下$n^5$做法. 设$f_{i,p1,p2,u_1,u_2}$表示插入第i个点时,上一层度数为2/3还

loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分

$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinobu 早有准备,Alice.Ayaya.Karen.Shinobu.Yoko 五人又能继续愉快地玩耍啦! 「噢--!不是有放上天的烟花嘛!」Karen 兴奋地喊道. 「啊等等--」Yoko 惊呼.Karen 手持点燃引信的烟花,「嗯??」 Yoko 最希望见到的是排列优美的烟火,当然不会放过这个机会-

[LOJ#525]「LibreOJ β Round #4」多项式

试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k?1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) mod k=0.你给出的多项式次数不能超过 60000,且最高次系数必须非 0. 输入 输入一行,包含一个正整数 k. 输出 若无解,则只输出一个整数 ?1.否则首先输出一个整数 n 表示你寻找的多项式的次数,随后 n+1 个整数按照从低位到高位的顺序输出多项式的系数. 在此之后的输出将被忽略. 输入示例 3 输出示例 4 0 1 2 2 1 数据规模及约定 1

「Codeforces Round #441」 Classroom Watch

Discription Eighth-grader Vova is on duty today in the class. After classes, he went into the office to wash the board, and found on it the number n. He asked what is this number and the teacher of mathematics Inna Petrovna answered Vova that n is th

LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例

二次联通门 : LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例 /* LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例 很显然 贪心方程哦不 dp方程为 f[i][j]=f[i-1][j-k*k] 但是这样的话复杂度就是O(N ^ 5) 那么就用bitset优化一下 就ok了 */ #include <iostream> #include <cstdio> #include <bitset> void

LibreOJ「LibreOJ β Round #4」 游戏

二次联通门 : LibreOJ「LibreOJ β Round #4」 游戏 /* LibreOJ「LibreOJ β Round #4」 游戏 找找规律就会发现.. 当有X的时候,答案跟X个数的奇偶有关 否则就求一下逆序对就好了.. 由于SB的错误..WA了3发才过 然后就签完到走人了 */ #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #defi

LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意

二次联通门 : LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意 /* LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意 本想打个暴力找找规律 结果交上去就A了... 读入所有数 处理出前缀和 然后枚举区间长度 处理处1~n的答案 后O(1)查询即可 复杂度O(n^2 + m) */ #include <iostream> #include <cstring> #include <cstdio> voi

LibreOJ #525. 「LibreOJ β Round #4」多项式

二次联通门 : LibreOJ #525. 「LibreOJ β Round #4」多项式 官方题解 : /* LibreOJ #525. 「LibreOJ β Round #4」多项式 由于会有多种解 所以只需要找出一组特殊解即可 */ #include <cstdio> #include <iostream> void read (int &now) { register char c = getchar (); for (now = 0; !isdigit (c);