[YNOI2018]五彩斑斓的世界&CF896E(分块+并查集)
由于晚上比赛二连(Atcoder&codeforces),外加复习学考,所以暂时没时间写了。
贴个O(n√n)的分块代码,洛谷和cf上都过了,但垃圾bzoj卡不过去,不改了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,B,a[N],b[N],pos[N],l[N],r[N],fa[N],mx[N],sum[N],c[][N],tag[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void build(int id)
{
for(int i=l[id];i<=r[id];i++)a[i]=b[find(i)],c[id][a[i]]=;
for(int i=l[id];i<=r[id];i++)fa[i]=i,sum[i]=;
for(int i=l[id];i<=r[id];i++)
if(!c[id][a[i]])c[id][a[i]]=i,b[i]=a[i];
else sum[c[id][a[i]]]+=sum[i],fa[i]=c[id][a[i]];
while(!c[id][mx[id]])mx[id]--;
}
void update(int id,int x,int y,int v)
{
for(int i=l[id];i<=r[id];i++)a[i]=b[find(i)];
for(int i=l[id];i<=r[id];i++)c[id][a[i]]=;
for(int i=x;i<=y;i++)if(b[find(i)]-tag[id]>v)a[i]-=v;
for(int i=l[id];i<=r[id];i++)b[i]=a[i],fa[i]=i;
build(id);
}
void modify(int x,int y,int v)
{
if(pos[x]==pos[y]){update(pos[x],x,y,v);return;}
update(pos[x],x,r[pos[x]],v),update(pos[y],l[pos[y]],y,v);
for(int i=pos[x]+;i<pos[y];i++)
if(v<mx[i]-tag[i]&&mx[i]-tag[i]<*v)
{
for(int j=tag[i]+v+;j<=mx[i];j++)
if(c[i][j])
if(!c[i][j-v])c[i][j-v]=c[i][j],b[c[i][j]]=j-v,c[i][j]=;
else fa[c[i][j]]=c[i][j-v],sum[c[i][j-v]]+=sum[c[i][j]],c[i][j]=;
while(!c[i][mx[i]])mx[i]--;
}
else if(mx[i]-tag[i]>=*v)
{
for(int j=tag[i]+;j<=tag[i]+v;j++)
if(c[i][j])
if(!c[i][j+v])c[i][j+v]=c[i][j],b[c[i][j]]=j+v,c[i][j]=;
else fa[c[i][j]]=c[i][j+v],sum[c[i][j+v]]+=sum[c[i][j]],c[i][j]=;
tag[i]+=v;
}
}
int query(int x,int y,int v)
{
int ret=;
if(pos[x]==pos[y])
{
for(int i=x;i<=y;i++)if(b[find(i)]-tag[pos[i]]==v)ret++;
return ret;
}
for(int i=x;i<=r[pos[x]];i++)if(b[find(i)]-tag[pos[i]]==v)ret++;
for(int i=l[pos[y]];i<=y;i++)if(b[find(i)]-tag[pos[i]]==v)ret++;
for(int i=pos[x]+;i<pos[y];i++)if(v+tag[i]<N)ret+=sum[c[i][v+tag[i]]];
return ret;
}
int main()
{
scanf("%d%d",&n,&m),B=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i],fa[i]=i;
for(int i=;i<=n;i++)
{
r[pos[i]=(i-)/B+]=i;
if(!l[pos[i]])l[pos[i]]=i;
}
for(int i=;i<=pos[n];i++)mx[i]=1e5,build(i);
while(m--)
{
int op,x,y,v;scanf("%d%d%d%d",&op,&x,&y,&v);
if(op==)modify(x,y,v);else printf("%d\n",query(x,y,v));
}
}
[YNOI2018]五彩斑斓的世界&CF896E(分块+并查集)的更多相关文章
- 洛谷P3247 最小公倍数 [HNOI2016] 分块+并查集
正解:分块+并查集 解题报告: 传送门! 真的好神仙昂QAQ,,,完全想不出来,,,还是太菜了QAQ 首先还是要说下,这题可以用K-D Tree乱搞过去(数据结构是个好东西昂,,,要多学学QAQ),但 ...
- [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...
- P5443 [APIO2019]桥梁 [分块+并查集]
分块+并查集,大板子,没了. 并查集不路径压缩,可撤销,然后暴力删除 这样对于每个块都是独立的,所以直接搞就行了. 然后块内修改操作搞掉,就是单独的了 // powered by c++11 // b ...
- 洛谷P4117 [Ynoi2018]五彩斑斓的世界 [分块,并查集]
洛谷 Codeforces 又是一道卡常题-- 思路 YNOI当然要分块啦. 分块之后怎么办? 零散块暴力,整块怎么办? 显然不能暴力改/查询所有的.考虑把相同值的用并查集连在一起,这样修改时就只需要 ...
- [Ynoi2018]五彩斑斓的世界
题目描述 二阶堂真红给了你一个长为n的序列a,有m次操作 1.把区间[l,r]中大于x的数减去x 2.查询区间[l,r]中x的出现次数 题解 做YNOI真**爽... 我们发现这道题的操作非常诡异,把 ...
- [BZOJ4537][HNOI2016]最小公倍数(分块+并查集)
4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1687 Solved: 607[Submit][Stat ...
- BZOJ4320 ShangHai2006 Homework(分块+并查集)
考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过 ...
- HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)
题目链接 2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块. 分块的时候满足每个块是一个 ...
- bzoj 4537: [Hnoi2016]最小公倍数 分块+并查集
题目大意: 给定一张n个点m条边的无向图,每条边有两种权.每次询问某两个点之间是否存在一条路径上的边的两种权的最大值分别等于给定值. n,q <= 50000. m <= 100000 题 ...
随机推荐
- Bulma CSS - 开始
Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 有数种方法可以 ...
- CodeForces - 402B Trees in a Row (暴力)
题意:给定n个数,要求修改其中最少的数,使得这n个数满足ai + 1 - ai = k. 分析: 暴力,1000*1000. 1.这n个数,就是一个首项为a1,公差为k的等差数列.k已知,如果确定了a ...
- jQuery琐碎
函数(以click事件为例)在jsp页面和js中的不同写法 onclick="getInfo(this);" function getInfo(obj){ var $this=$( ...
- 2. Jetson TX2--python3下编译安装opencv3.4
https://cloud.tencent.com/developer/article/1327273 jetpack3.2自带了opencv3.3,但是只提供了python2.7的编译版本,所以也只 ...
- 22 ~ express ~ 内容评论实现
1,使用 ajax 提交评论内容 给 api.js 2,数据库 contents 增加评论字段 3,后台路由 api.js 接收并完成存储 /** 增加评论(用户,内容,时间) */ router.p ...
- PHP常用的数学函数和字符串函数
PHP常用函数总结 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2); //4.2 数字绝对值数字 2.ceil(): 进一法取整 echo ceil(9.999); // 10 ...
- 基于云开发开发 Web 应用(四):引入统计及 Crash 收集
在完成了产品的基础开发以后,接下来需要进行一些周边的工作,这些周边工具将会帮助下一步优化产品. 为什么要加应用统计和 Crash 收集 不少开发者在开发的时候,很少会意识到需要添加应用统计和 Cras ...
- Community Cloud零基础学习(三)Partner Account
本篇参考:http://salesforce.vidyard.com/watch/bLE3QNRSej2iasw9vvc6Tk http://salesforce.vidyard.com/watch/ ...
- Flexslider插件实现图片轮播、文字图片相结合滑动切换效果
插件下载: 点击下载 密码: fbeg Flexslider具有以下特性: 支持滑动和淡入淡出效果. 支持水平.垂直方向滑动. 支持键盘方向键控制. 支持触控滑动. 支持图文混排,支持各种html元素 ...
- consul集群配置
consul agent -server -bootstrap-expect 1 -data-dir /etc/consul -node=consul1 -bind=ip1 -ui -client=0 ...