颜色问题

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.incolor.out

4
1 2 3 4
4 3 2 1

4


【样例1解释】
第一天仆人不会说出什么有用的信息,第二天第一个房间和第三个房间的 颜色会被知道,第三 天不会有什么有用信息,第四天第二个房间和第四个房间 的颜色会被知道,故答案为 4。
【输入输出样例2】

color.incolor.out

3
1 2 3
1 2 2

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

 

转载于:https://www.cnblogs.com/htwx/articles/4889666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值