青蛙们正遭遇一次史无前例的危机!为了解救族人,青蛙王子必须完成一个古老而艰难
的游戏——zuma 游戏。
zuma 游戏中,一条通道中有一些玻璃珠,每个珠子有各自的颜色,如图 1 所示。青蛙
王子可以做的是选择一种颜色的珠子射入某个位置。
图 2 中青蛙王子选择一颗蓝色珠子,射入图示的位置,于是得到一个图 3 的局面。
当青蛙王子射入一颗珠子后,如果射入的珠子与其他珠子组成了三颗以上连续相同颜色
的珠子,这些珠子就会消失。例如,将一颗白色珠子射入图 4 中的位置,就会产生三颗颜色
相同的白色珠子。这三颗珠子就会消失,于是得到图 5 的局面。
需要注意的一点是,图 4 中的三颗连续的黄色珠子不会消失,因为并没有珠子射入其中。
珠子的消失还会产生连锁反应。当一串连续相同颜色的珠子消失后,如果消失位置左右
的珠子颜色相同,并且长度大于 2,则可以继续消失。例如,图 6 中,射入一颗红色珠子后,
产生了三颗连续的红色珠子。当红色珠子消失后,它左右都是白色的珠子,并且一共有四颗,
于是白色珠子也消失了。之后,消失位置的左右都是蓝色珠子,共有三颗,于是蓝色珠子也
消失。最终得到图 7 的状态。注意,图 7 中的三颗黄色珠子不会消失,因为蓝色珠子消失的
位置一边是紫色珠子,另一边是黄色珠子,颜色不同。
除了上述的情况,没有其他的方法可以消去珠子。
现在,请你协助青蛙王子消除通道中的珠子。给出每一轮选择的珠子的颜色、射入的位
置,请你计算出最后还剩下多少颗珠子。
大模拟,不讲。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;
int main(){
v.push_back(0);
int n,m,i;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
int x;
cin>>x;
v.push_back(x);
}
for(i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v.insert(v.begin()+y+1,x);
y++;
int l=y,r=y;
while(v[l-1]==v[y]&&l-1>0)l--;
while(v[r+1]==v[y]&&r+1<v.size())r++;
if(r-l>1){
for(int j=l;j<=r;j++)v.erase(v.begin()+l);
y=l-1;
}
while(v.size()>2){
int l=y,r=y;
while(v[l-1]==v[y]&&l-1>0)l--;
while(v[r+1]==v[y]&&r+1<v.size())r++;
if(r-l+1<3||r==y)break;
else{
v.erase(v.begin()+l,v.begin()+r+1);
y=l-1;
}
}
}cout<<v.size()-1;
return 0;
}