題目鏈接
題意
一排娃娃,每一個都有自己本來的顏色。重新塗色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;
}