博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj1483]梦幻布丁
阅读量:5055 次
发布时间:2019-06-12

本文共 1180 字,大约阅读时间需要 3 分钟。

对于每一个颜色用一个链表存储,并记录下:1.当前某种颜色的真实颜色;2.这种颜色的数量(用于启发式合并的判断);3.当前答案(即有几段),然后对于每一个操作简单处理一下就行了。

1 #include
2 using namespace std; 3 #define N 1000005 4 int n,m,ans,p,x,y,head[N],tru[N],sum[N],nex[N],last[N],a[N]; 5 void merge(int x,int y){ 6 for(int i=head[x];i!=-1;i=nex[i])ans-=(a[i-1]==y)+(a[i+1]==y); 7 for(int i=head[x];i!=-1;i=nex[i])a[i]=y; 8 sum[y]+=sum[x]; 9 nex[last[y]]=head[x];10 last[y]=last[x];11 head[x]=-1;12 sum[x]=last[x]=0;13 }14 int main(){15 scanf("%d%d",&n,&m);16 memset(head,-1,sizeof(head));17 for(int i=1;i<=n;i++)scanf("%d",&a[i]);18 for(int i=n;i;i--){19 if (a[i]!=a[i-1])ans++;20 tru[a[i]]=a[i];21 if (head[a[i]]==-1)last[a[i]]=i;22 sum[a[i]]++;23 nex[i]=head[a[i]];24 head[a[i]]=i;25 }26 for(int i=1;i<=m;i++){27 scanf("%d",&p);28 if (p==2)printf("%d\n",ans);29 else{30 scanf("%d%d",&x,&y);31 if (sum[tru[x]]>sum[tru[y]])swap(tru[x],tru[y]);32 if ((x!=y)&&(sum[tru[x]]))merge(tru[x],tru[y]);33 }34 }35 }
View Code

 

转载于:https://www.cnblogs.com/PYWBKTDA/p/11249602.html

你可能感兴趣的文章
node——模块分类,require执行顺序,require注意事项,原理
查看>>
回发或回调参数无效的各种情况分析及解决办法
查看>>
第14周总结
查看>>
tomcat访问
查看>>
取消元件库里的元件等比例缩放
查看>>
unity中使用代理(翻译)
查看>>
openWRT自学---初始化过程和主要脚本的分析--转
查看>>
planning algorithms chapter 3
查看>>
HDU 1166 敌兵布阵 树状数组
查看>>
基于第三方开源库的OPC服务器开发指南(1)——OPC与DCOM
查看>>
PHP重要知识点
查看>>
伪静态例子与APACHE伪静态配置
查看>>
把ISO文件加载到虚拟光驱
查看>>
[区块链] 密码学——椭圆曲线密码算法(ECC)
查看>>
第6周学习进度
查看>>
数据库运行在非归档模式下,数据文件被误删的解决方法
查看>>
再要你命3K的任务总结
查看>>
小白学数据分析------>描述性统计术语汇总
查看>>
mvc 在IIS5,iis6和iis7上的部署
查看>>
Spring HttpInvoker 从实战到源码追溯
查看>>