wordpress适合做什么网站吗,建设部网站资质公示,wordpress局域网无法访问,德阳中恒网站建设题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2...An表示第i个布丁的颜色从第三行起有M行,…题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 第一行给出N,M表示布丁的个数和好友的操作次数. 第二行N个数A1,A2...An表示第i个布丁的颜色从第三行起有M行,对于每个操作,若第一个数字是1表示要对颜色进行改变其后的两个整数X,Y表示将所有颜色为X的变为YX可能等于Y. 若第一个数字为2表示要进行询问当前有多少段颜色这时你应该输出一个整数. Solution 膜了一发hzwer。 我们对于每一种颜色开邻接表把它搞成一个队列的形式开一个数组记录它的开头。 对于一个修改我们采用启发式合并的方式可以把均摊复杂度将至llogn。 合并两个队列的方式就是把第一个队列接到第二个队列后面就可以了。 e[st[x]]head[y];head[y]head[x];就是这样 为了避免启发式合并之后颜色出现错乱if(!st[a[i]])st[a[i]]i;if(size[ji[x]]size[ji[y]])swap(ji[x],ji[y]);xji[x];yji[y]; Code #includeiostream
#includecstdio
#define NN 1000002
#define N 100002
using namespace std;
int head[NN],ans,size[NN],e[N1],a[N],n,m,x,y,st[NN],ji[NN];
inline void solve(int x,int y){for(int ihead[x];i;ie[i]){if(a[i1]y)ans--;if(a[i-1]y)ans--; }for(int ihead[x];i;ie[i])a[i]y;size[y]size[x];e[st[x]]head[y];head[y]head[x];size[x]0;
}
int main(){scanf(%d%d,n,m);for(int i1;in;i){scanf(%d,a[i]);ji[a[i]]a[i];if(!st[a[i]])st[a[i]]i;if(a[i]!a[i-1])ans;e[i]head[a[i]];head[a[i]]i;size[a[i]];}for(int i1;im;i){scanf(%d,x);if(x2)printf(%d\n,ans);else{scanf(%d%d,x,y);if(xy)continue;if(size[ji[x]]size[ji[y]])swap(ji[x],ji[y]);xji[x];yji[y];if(size[x]0)continue;solve(x,y);}}return 0;
} 转载于:https://www.cnblogs.com/ZH-comld/p/9696538.html