「HNOI 2009」梦幻布丁

news/2024/11/29 11:56:41/

传送门


problem

n n n 个布丁摆成一行,每个布丁都有一个颜色 a i a_i ai。有 m m m 次操作,操作有 2 2 2 种:

  • 1 x y:将颜色为 x x x 的布丁全部变成颜色 y y y 的布丁。
  • 2:询问当前一共有多少颜色(例如颜色为 1 , 2 , 2 , 1 1,2,2,1 1,2,2,1 3 3 3 段颜色)。

数据范围: 1 ≤ n , m ≤ 1 0 5 1\le n,m\le 10^5 1n,m105 0 < a i , x , y < 1 0 6 0<a_i,x,y<10^6 0<ai,x,y<106


solution

感觉挺板的。

对每种颜色开一颗线段树,每个节点维护一下当前颜色最左边的位置 L,最右边的位置 R 以及颜色段数 sum

有了 LRsum 就很好维护了。

合并的时候,把颜色 x x x 的线段树合并到颜色 y y y 的线段树即可。

时间复杂度 O ( m log ⁡ n ) O(m\log n) O(mlogn)


code

#include<bits/stdc++.h>
using namespace std;
namespace IO{const int Rlen=1<<22|1;char buf[Rlen],*p1,*p2;inline char gc(){return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}template<typename T>inline T Read(){char c=gc();T x=0,f=1;while(!isdigit(c))  f^=(c=='-'),c=gc();while( isdigit(c))  x=((x+(x<<2))<<1)+(c^48),c=gc();return f?x:-x;}inline int in()  {return Read<int>();}
}
using IO::in;
const int N=1e5+5,M=1e6+5;
int n,m,ans,tot;
int root[M],lc[N<<5],rc[N<<5],L[N<<5],R[N<<5],sum[N<<5];
#define mid ((l+r)>>1)
void pushup(int root){L[root]=lc[root]?L[lc[root]]:L[rc[root]];R[root]=rc[root]?R[rc[root]]:R[lc[root]];sum[root]=sum[lc[root]]+sum[rc[root]]-(R[lc[root]]+1==L[rc[root]]);
}
void Insert(int &root,int l,int r,int pos){if(!root)  root=++tot;if(l==r)  {L[root]=R[root]=pos,sum[root]=1;return;}if(pos<=mid)  Insert(lc[root],l,mid,pos);else  Insert(rc[root],mid+1,r,pos);pushup(root);
}
int Merge(int x,int y,int l,int r){if(!x||!y)  return x+y;if(l==r)  {L[x]=R[x]=l,sum[x]=1;return x;}lc[x]=Merge(lc[x],lc[y],l,mid);rc[x]=Merge(rc[x],rc[y],mid+1,r);return pushup(x),x;
}
#undef mid
int main(){n=in(),m=in();for(int i=1;i<=n;++i){int x=in();ans-=sum[root[x]],Insert(root[x],1,n,i),ans+=sum[root[x]];}while(m--){int op=in();if(op==1){int x=in(),y=in();if(x==y)  continue;ans-=(sum[root[x]]+sum[root[y]]);root[y]=Merge(root[y],root[x],1,n),root[x]=0;ans+=sum[root[y]];}else  printf("%d\n",ans);}return 0;
}

http://www.ppmy.cn/news/745924.html

相关文章

羧基修饰青色乳胶微球100nm

名称&#xff1a;羧基修饰青色乳胶微球100nm 材质&#xff1a;苯乙烯高分子聚合物粒径&#xff1a; 20nm-100um&#xff08;可定制粒径范围&#xff09;颜色&#xff1a;白色表面基团&#xff1a;COOH固含量&#xff1a;10%密度&#xff1a;1.05 g/cm3分散介质&#xff1a;纯水…

简易版牛奶布丁的做法 没烤箱照样做布丁

简易版牛奶布丁怎么做?牛奶布丁是以牛奶为材料制作的一道营养可口的甜品&#xff0c;口感软滑&#xff0c;有点像果冻&#xff0c;非常适合小朋友&#xff0c;当然大人也可以作为零食。而今天给大家介绍的是不用烤箱就能做的牛奶布丁。 简易版牛奶布丁的做法 材料&#xff1…

聚丙烯酸叔丁酯修饰乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒

聚丙烯酸叔丁酯修饰乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒 白蛋白分子上存在许多药物结合位点&#xff0c;并且其疏水域也可以结合疏水性药物&#xff0c;因此白蛋白可以较好地结合多种药物。另外白蛋白可以作为肿瘤和炎症组织的能量和氨基酸来…

布丁老师re

第一天 一个模型输出两个结果&#xff1a; Bert : lstm: rnn: boem: 你个模型两个输出的数据集 &#xff01;&#xff01;&#xff01;数据最重要&#xff0c;爬虫加取数据。 jieba content音乐 状态码 200可访问 text 爬虫第一步&#xff1a;找到源码 提取方法&#…

【无机纳米材料科研制图——3ds Max 0108】3dmax细胞及磷脂双分子层细胞建模

此篇我们来把之前做好的细胞膜和所有细胞器组合在一起&#xff0c;完成细胞的建模&#xff0c;并实现将细胞膜换为磷脂双分子层。 一、细胞建模 1&#xff09;导入合并。 如果我们想把之前做好的细胞核和线粒体都添加到当前工作场景中的话&#xff0c;就需要用到导入这个渠道&a…

c花体复制_花体

路由器之家网今天精心准备的是《花体》,下面是详解! 26个英文字母花体和圆体写法 最好是大小写都有,要图片... 最好是大小写都有,要图片 26个花体和圆体英文字母如下 1、圆体 “圆体英文” 是国内的一种说法,国外并没有与“圆体”相关的英文单词。 国内常指代的圆体英文书…

中国成人脑白质分区与脑功能图谱

脑地图集在研究大脑解剖和功能方面起着重要的作用。随着对多模态磁共振成像(MRI)方法(如结合结构MRI、弥散加权成像(DWI)和静息态功能MRI (rs-fMRI))的兴趣的增加&#xff0c;有必要基于这三种成像方式构建集成的脑地图集。本研究构建了中国成年人群(年龄22-79岁&#xff0c;n …

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录 1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型 Ref 1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane) \blue{\text{质膜 (plasma membrane)}} 质膜 (plasma membr…