CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
题目链接
/*
如果用线段树,每个节点要再开k的空间,显然不行。但是分块可以(虽然空间依旧爆炸)分块。用bloans[i][j]表示 第i块 模k为j 的有多少个
对于不是整块的,查询时应判断 A[i]+tag[belong[i]] ==k || ==0
对于整块,维护两个tag,一个是整块的加标记,另一个是整块的mod数标记tag2,初始时tag2为0
当整块+v时,tag2 -=v。因为查询的应是 模k=0 的数的个数,整块+v后,这块要查的就是 模k=k-v ((k-v+v)%k=0)的个数
这样就很巧妙地将整块加变成了改询问
*/
#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=2e5+5,MAXSZ=460;int n,m,k,size,A[N],belong[N],bloans[MAXSZ][N],tag[MAXSZ],tag2[MAXSZ];inline int read()
{int now=0,f=1;register char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-') f=-1;for(;isdigit(c);now=now*10+c-'0',c=getchar());return now*f;
}void Update(int p,int v)
{--bloans[belong[p]][A[p]];A[p]+=v;if(A[p]>=k) A[p]-=k;++bloans[belong[p]][A[p]];
}
void Add(int l,int r,int v)
{int t=min(r,belong[l]*size);for(int i=l; i<=t; ++i)Update(i,v);if(belong[l]!=belong[r])for(int i=(belong[r]-1)*size+1; i<=r; ++i)Update(i,v);for(int i=belong[l]+1; i<belong[r]; ++i){tag[i]+=v, tag2[i]-=v;if(tag[i]>=k) tag[i]-=k;if(tag2[i]<0) tag2[i]+=k;}
}
int Query(int l,int r)
{int res=0, t=min(r,belong[l]*size);for(int i=l; i<=t; ++i)if(A[i]+tag[belong[l]]==k || !(A[i]+tag[belong[l]]))++res;if(belong[l]!=belong[r])for(int i=(belong[r]-1)*size+1; i<=r; ++i)if(A[i]+tag[belong[r]]==k || !(A[i]+tag[belong[r]]))//beblong[l] belong[r]别写反了 ++res;for(int i=belong[l]+1; i<belong[r]; ++i)res+=bloans[i][tag2[i]];return res;
}int main()
{n=read(),m=read(),k=read();size=sqrt(n);for(int i=1;i<=n;++i){A[i]=read()%k, belong[i]=(i-1)/size+1;if(A[i]<0) A[i]+=k;++bloans[belong[i]][A[i]];}char opt[9];int l,r,v;while(m--){scanf("%s",opt);l=read(),r=read();if(opt[0]=='a')v=read(), Add(l,r,(v%k+k)%k);elseprintf("%d\n",Query(l,r));}return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/8435078.html
CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)相关推荐
- [Codevs] 1082 线段树练习3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- 线段树模板题3:区间染色问题
1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...
- [Codevs] 1081 线段树练习 2 ----“分块!”
1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所 ...
- 分块试水--CODEVS5037 线段树练习4加强版
感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...
- CodeVS 1081 线段树练习 2
1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所 ...
- codevs 4927 线段树练习5 线段树基本操作模板
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b ...
- szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]
寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...
- NYOJ 1068 ST(线段树之 成段更新+区间求和)
ST 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 "麻雀"lengdan用随机数生成了后台数据,但是笨笨的他被妹纸的问题给难住了... 已知len ...
最新文章
- 第八章 异常控制流 笔记
- mysql random_Mysql中随机函数笔记
- 2.3系列系统中不支持SimpleDateFormat作字段被序列化
- CentOS7的firewall和安装iptables
- 图解Oracle RMAN备份入门
- [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)
- 【JS 逆向百例】W店UA,OB反混淆,抓包替换CORS跨域错误分析
- Intel 收购计算机视觉开发公司 Itseez
- centos7 网卡配置vlan_centos 7 下多网卡绑定+ vlan 网卡配置
- Linux学习总结(55)——Linux 运维常用脚本
- python自动化办公-Python自动化办公室(1),python,一
- [渝粤教育] 中国地质大学 运筹学1 复习题
- 计算机相关专业的,快毕业时要不要参加培训机构培训班?
- 易企秀 伪静态 linux,最新仿易企秀V15.1完整版开源版源码分享,修复采集功能,新增同行站模板采集功能等等...
- 阿里acp认证是什么?阿里acp考试内容是什么?
- Simulink如何添加模块到Library Browser
- C# 操作Excel数据透视表详解 – 创建、操作和删除
- 做外贸用什么邮箱,外贸邮箱用哪个好
- Web 安全恩仇录:漏洞原理
- 16S扩增子分析专题研讨论会——背景介绍
热门文章
- mysql导出txt到client_mysql导出导入txt以及sftp自动下载(一)
- mysql数据库2013_MySQL数据库备份(2)2013-6-13
- mysql中非主键不能自增吗_mysql非主键自增长用法实例分析
- rpm安装的mysql如何数据迁移_linux下mysql数据库的rpm安装步骤及常见问题的解决
- 使用Maven管理的项目,如何设置Context Root
- mysql置疑原因_SQLSERVER数据库经常置疑的原因
- 图片怎么等比缩放_mac图像缩放工具Teorex iResizer
- 计算机专业核心技术,计算机系多媒体核心技术实验室建设专业方案(10页)-原创力文档...
- cd rw 多少次_程序员:想知道你每天按了多少次键盘吗?
- Pytorch详解NLLLoss和CrossEntropyLoss、以及softmax和log_softmax