题目链接
题意
一排娃娃,每一个都有自己本来的颜色。重新涂色m次,问最少要重新涂色多少次能让所有娃娃的颜色一致。
如果不需要重新涂色输出0,经过m次涂色后仍不能同色输出-1;
解决
- 一开始因为每次涂色后都进行了judge(),所以被超时
- 之后更改了judge()函数,尝试了从两端开始检测是否相等,同时判断两端和中间是否相等。然而还是被超时
- 最后想到了本题核心没有必要每一次重新涂色后就进行judge()如果judge失败,记录本次涂色的玩偶的编号和颜色,等到下一次出现改编号或者该颜色的时候再进行judge,这样2s超时的程序被优化到100ms左右
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <complex>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define E 1e-6
#define INF 0x3f3f3f3f
void open(){freopen("data.txt","r",stdin);}
void out(){freopen("out.txt","w",stdout);}
const int N = 101010;
const int MOD = 1e9 + 7;
int num[100005];
int n;
bool judge()
{
int l=1,r=n;
while(l<r)
{
int mid=(l+r)/2;
if(num[mid]!=num[l]||num[mid]!=num[r]||num[l]!=num[r]) return false;
l++;
r--;
}
return true;
}
int main()
{
//open();
int m,a,b;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
if(judge())
{
printf("0\n");
return 0;
}
scanf("%d",&m);
int pre_a,pre_b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
num[a]=b;
if(a==pre_a||b==pre_b||i==1)
{
if(judge())
{
printf("%d\n",i);
return 0;
}
}
pre_a=a;pre_b=b;
}
printf("-1\n");
return 0;
}