传送门

Descroption

给了你一个长为n的序列a,有m次操作

1.把区间[l,r]中大于x的数减去x

2.查询区间[l,r]中x的出现次数

Solution

分块

对于每个块,我们都分别维护:

  • 每种数出现的次数,需要用到并查集,即把相同的数合并在一起

  • 标记tag,表示这个块总共减了多少

  • maxx,表示这个块的最大值

对于查询,按照分块的套路直接查询就可以了

修改的时候,为了保证复杂度正确,我们考虑每次通过\(O(x)\)的复杂度,实现整个块的极差减少\(x\).

这样,我们就能保证总修改的复杂度是\(O(n\log n)\)了

怎么做到呢?

假设当前数组的极差为\(M\),我们近似的将它看成是\(maxx-tag\)

  • \(M< x\) 显然是不存在大于x的数,直接返回即可
  • \(x \leq M \leq 2x\) 这个时候,把大于x的数直接减去x即可,fa[j]=fa[j-x],这样极差减少\(x\)
  • \(M>2x\) 直接把小于等于\(x\)的数加上\(x\),然后整个区间打上减\(x\)的标记,极差同样减少\(x\)

Code 

#include<bits/stdc++.h>
#define ll long long
using namespace std; char B[1<<26],*S=B;
inline int read(){
int x;char c;
while((c=*S++)<'0'||c>'9');
for(x=c-'0';(c=*S++)>='0'&&c<='9';)x=x*10+c-'0';
return x;
}
const int MN=1e5,T=650;
int a[MN+5],fa[MN/T+5][MN+5],sz[MN/T+5][MN+5],minn[T+5],maxx[T+5];
int getf(int*f,int k){return f[k]?f[k]=getf(f,f[k]):k;}
int main()
{
B[fread(B,1,1<<26,stdin)]=0;
int n,m,i,j,o,l,r,x,lk,rk,ans;
n=read();m=read();
for(i=1;i<=n;++i)a[i]=read(),++sz[(i-1)/T][a[i]];
for(i=1;i<=n;i+=T) minn[i/T]=0,maxx[i/T]=MN;
while(m--)
{
o=read();l=read();r=read();x=read();
lk=(l-1)/T;rk=(r-1)/T;
if(o==1)
{
for(i=l;i<=r&&i<=lk*T+T;++i)
if((a[i]=getf(fa[lk],a[i]))-minn[lk]>x)--sz[lk][a[i]],++sz[lk][a[i]-=x];
for(i=lk;++i<rk;)
if(maxx[i]-minn[i]>2*x)
{
for(j=1;j<=x;++j)sz[i][fa[i][minn[i]+j]=minn[i]+j+x]+=sz[i][minn[i]+j];
minn[i]+=x;
}
else
{
for(j=x+1;j<=maxx[i]-minn[i];++j)sz[i][fa[i][minn[i]+j]=minn[i]+j-x]+=sz[i][minn[i]+j];
maxx[i]=min(maxx[i],minn[i]+x);
}
if(lk!=rk)for(i=r;i>rk*T;--i)
if((a[i]=getf(fa[rk],a[i]))-minn[rk]>x)--sz[rk][a[i]],++sz[rk][a[i]-=x];
}
else
{
ans=0;
for(i=l;i<=r&&i<=lk*T+T;++i)if(getf(fa[lk],a[i])-minn[lk]==x)++ans;
for(i=lk;++i<rk;)if(x+minn[i]<=maxx[i])ans+=sz[i][x+minn[i]];
if(lk!=rk)for(i=r;i>rk*T;--i)if(getf(fa[rk],a[i])-minn[rk]==x)++ans;
printf("%d\n",ans);
}
}
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[bzoj 5143][Ynoi 2018]五彩斑斓的世界的更多相关文章

  1. 解题:由乃OI 2018 五彩斑斓的世界

    题面 写在前面的扯淡: 分块的总体学习告一段落,这算是分块集中学习的最后一题么:以后当然也可能会写,就是零零散散的题了=.= 在洛谷上搜ynoi发现好像只有这道题和 由乃OI 2018 未来日记 是分 ...

  2. [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程

    [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...

  3. [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士

    [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...

  4. Solution -「Ynoi 2018」「洛谷 P4117」五彩斑斓的世界

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),处理 \(m\) 次操作: 给定 \(l,r,x\),把 \([l,r]\) 内所有 \(&g ...

  5. 【BZOJ】2055 80人环游世界

    [算法]有源汇上下界最小费用可行流 [题解]上下界 因为上下界相同,所以无所谓最小流了,可行流(初始流+附加流)就是答案了. 记得源点向新建节点连一条容量为m(人)的边. bzoj 2055 80人环 ...

  6. bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计

    Description 大家的好朋友小 L 来到了博弈的世界.Alice 和 Bob 在玩一个双人游戏.每一轮中,Alice 有 p 的概率胜利,1 -p 的概率失败,不会出现平局.双方初始时各有 0 ...

  7. [Ynoi2018]五彩斑斓的世界

    题目描述 二阶堂真红给了你一个长为n的序列a,有m次操作 1.把区间[l,r]中大于x的数减去x 2.查询区间[l,r]中x的出现次数 题解 做YNOI真**爽... 我们发现这道题的操作非常诡异,把 ...

  8. 洛谷P4117 [Ynoi2018]五彩斑斓的世界 [分块,并查集]

    洛谷 Codeforces 又是一道卡常题-- 思路 YNOI当然要分块啦. 分块之后怎么办? 零散块暴力,整块怎么办? 显然不能暴力改/查询所有的.考虑把相同值的用并查集连在一起,这样修改时就只需要 ...

  9. [YNOI2018]五彩斑斓的世界&CF896E(分块+并查集)

    由于晚上比赛二连(Atcoder&codeforces),外加复习学考,所以暂时没时间写了. 贴个O(n√n)的分块代码,洛谷和cf上都过了,但垃圾bzoj卡不过去,不改了. #include ...

随机推荐

  1. dapper 参数不定时用这种方法动态参数

    string where = null; var p = new DynamicParameters(); if (classId != null) { where = " and clas ...

  2. php 调用 webservice 中文乱码解决方案

    webservice中有中文的话,返回的值就变成了乱码.查看了一下response的结果,是正确的.应该是用nusoap处理的时候出现了问题. 更改了nusoap.php两个地方就OK了. 更改的地方 ...

  3. 读取经纬度坐标并存储为字典格式,即key为ID,value为轨迹点

    示例数据: #格式为txt文本 ID,L,B 001,116.5154,45.1154 001,116.5160,45.1153 ... 002,xxx,xxx ... 目标:建立轨迹数据结构,即di ...

  4. nginx热加载、热升级、回滚

    修改完配置文件后使用 nginx -s reload 命令进行热加载 编译好新的 nginx 二进制文件后,运行nginx 开启nginx服务,然后使用 kill -USR2 新的nginx_mast ...

  5. 通透理解viewport

    摘自:https://blog.csdn.net/u014787301/article/details/44466697 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewpor ...

  6. idea+maven使用

    maven 1. 打开软件,点击configure-project default-settings.配置maven目录. 后续还需要配置一个地方是本地仓库的优先,在runner-VM Options ...

  7. 只需五分钟-用Maven快速搭建Spring Cloud微服务

    Maven安装手册 1.准备安装包 安装包: apache-maven-3.5.4-bin.zip  (最好JDK 1.7及以上版本) 集成包: eclipse-maven3-plugin.zip 2 ...

  8. Django:ContentType组件

    一.项目背景 二.版本一 三.版本二 三.终极版(使用ContentType) 一.项目背景 luffy项目,有课程有学位课(不同的课程字段不一样),价格策略 问题:1.如何设计表结构,来表示这种规则 ...

  9. Spring Boot配置多数据源并实现Druid自动切换

    原文:https://blog.csdn.net/acquaintanceship/article/details/75350653 Spring Boot配置多数据源配置yml文件主数据源配置从数据 ...

  10. MyBatis3-topic-01 -安装/下载/官方文档 -执行输入一条已经映射的sql语句

    mybatis XML 映射配置文件 (官方文档) -对象工厂(objectFactory) -配置环境(environments) -映射器(mappers) 本地IDEA搭建/测试步骤 创建数据库 ...