颜色问题
XX城堡有n个房间, 每个房间都被装饰成一种颜色( 房间颜色可以重
复),记第i个房间的颜色为ci,外面的人无法进入这个城堡,但是可以通过 里面的仆人了解到这些房间的颜色。这些仆人正好有n个,他们要打扫这些 房间。他们有奇怪的规则:第一天第i个仆人打扫第i
个房间,第二天第i个仆 人打扫第i + 1个房间(若i = n,则他打扫第1个房间),第三天第i个仆人打 扫第i + 2个房间(若i = n − 1,他打扫第1个房间:若i = n,他打扫第2个房
间),以此递推循环下去。每个仆人都有自己最喜欢的颜色,当他打扫一个房 间后,他会告诉你这个房间颜色是不是c(c为这个仆人最喜欢的颜色)。某人
对这个城堡很有兴趣,你想知道他在第几天才能完全了解到所有房间的颜色。
【输入】
输入文件为color.in。 输入有3行,第一行有一个正整数n。第二行有n个整数,表示每个房间的
颜色。第三行有n个整数,表示每个仆人最喜欢的颜色。
【输出】
输出文件为color.out。 输出只有一个正整数,如题所述:如果答案为无穷大,请输出−1。
【输入输出样例1】
color.in | color.out |
4 |
4 |
【样例1解释】
第一天仆人不会说出什么有用的信息,第二天第一个房间和第三个房间的 颜色会被知道,第三 天不会有什么有用信息,第四天第二个房间和第四个房间 的颜色会被知道,故答案为 4。
【输入输出样例2】
color.in | color.out |
3 |
-1 |
【数据范围】
对于50%的数据,0 < n ≤ 1000;
对于100%的数据,0 < n ≤ 100000, 0 ≤ c, ci ≤ 1000000.
光想着ac了。。结果手残打爆了。。。论邻接表的使用姿势。。。。
其实就是一个链表(邻接表)来把每个相同颜色的房间连接起来,然后对于每一个仆人不断向前更新每个房间即可。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector> 10 #define maxn 1500000 11 #define maxm 500010 12 #define inf 10000000 13 #define ll long long 14 using namespace std; 15 int n,f[maxn],head[maxn]; 16 struct edge{int go,next;}e[maxn]; 17 int main(){ 18 freopen("input.txt","r",stdin); 19 freopen("output.txt","w",stdout); 20 int n,m; 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++){ 23 int x; 24 scanf("%d",&x); 25 e[i].go=i;e[i].next=head[x];head[x]=i; 26 f[i]=inf; 27 } 28 for(int i=1;i<=n;i++){ 29 int x; 30 scanf("%d",&x); 31 for(int j=head[x];j;j=e[j].next){ 32 int y=e[j].go; 33 if(y>=i)f[y]=min(f[y],y-i+1);else f[y]=min(f[y],n-i+y+1); 34 } 35 } 36 int ans=1; 37 for(int i=1;i<=n;i++)ans=max(ans,f[e[i].go]); 38 printf("%d\n",ans==inf?-1:ans); 39 return 0; 40 }