codevs5037 线段树练习4加强版(暴力分块)
求大爷教线段树怎么写啊QAQ
只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T
f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询的时候直接加上标记查就行了
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=;
int n,m,k,blo,x,y,z;
int a[maxn],bl[maxn],blcnt[][maxn],bl2[maxn],bltag[maxn],bltag2[maxn];
char s[];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
#define update(x) x>=k&&(x-=k)
inline void change(int x,const int &delta)
{
int now=a[x];
blcnt[bl[x]][now]--;
now+=delta;update(now);
blcnt[bl[x]][now]++;
a[x]+=delta;update(a[x]);
}
inline void add(int l,int r,const int &delta)
{
for(int i=l;i<=min(r,bl[l]*blo);i++)change(i,delta);
if(bl[l]!=bl[r])for(int i=(bl[r]-)*blo+;i<=r;i++)change(i,delta);
for(int i=bl[l]+;i<bl[r];i++)
{
bltag[i]+=delta;update(bltag[i]);
bltag2[i]-=delta;bltag2[i]<&&(bltag2[i]+=k);
}
}
inline int min(int a,int b){return a<b?a:b;}
int query(int l,int r)
{
int ans=,tmp,mn=min(bl[l]*blo,r);
for(int i=l;i<=mn;i++)
ans+=((tmp=a[i]+bltag[bl[i]])==k||!tmp);
if(bl[l]!=bl[r])for(int i=(bl[r]-)*blo+;i<=r;i++)
ans+=((tmp=a[i]+bltag[bl[i]])==k||!tmp);
for(int i=bl[l]+;i<bl[r];i++)ans+=blcnt[i][bltag2[i]];
return ans;
}
int main()
{
read(n);read(m);read(k);blo=sqrt(n);
for(int i=;i<=n;i++)bl[i]=(i-)/blo+;
for(int i=;i<=n;i++)read(x),a[i]=x%k;
for(int i=;i<=n;i++)blcnt[bl[i]][a[i]]++;
for(int i=;i<=m;i++)
{
scanf("%s",s);read(x);read(y);
if(s[]=='a')
{
read(z);z%=k;
z<&&(z+=k);
add(x,y,z);
}
else printf("%d\n",query(x,y));
}
}
codevs5037 线段树练习4加强版(暴力分块)的更多相关文章
- 分块试水--CODEVS5037 线段树练习4加强版
感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...
- Codeves-5037线段树4加强版(线段树? 。。。分块)
维护一个序列,要求支持下列2种操作: add a b c:区间[a,b]中每个数加上c count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数) 输入描述 Input Descrip ...
- CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸) 分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[ ...
- HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...
- HDU4288:Coder(线段树单点更新版 && 暴力版)
Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...
- HDU 1394 逆序数 线段树单点跟新 | 暴力
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- TZOJ 4325 RMQ with Shifts(线段树查询最小,暴力更新)
描述 In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each que ...
- 线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216
poj-2104(区间第K大问题) #include <iostream> #include <algorithm> #include <cstdio> #incl ...
- hdu 4288 线段树 暴力 **
题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...
随机推荐
- Oracle 字段拆分替换在合并成一条
看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...
- Java enum类型笔记
用途: 定义命令行参数,菜单选项,星期,方向(东西南北)等 与普通类的不同 有默认的方法 value() 每个enum类都已默认继承java.lang.Enum,所以enum类不能继承其他类 构造方法 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第4章.事务
第4章--事务 事务原理与开发 事务Transaction: 什么是事务? 事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,且逻辑工作单元需满足ACID特性. i.e. 银行转账:开 ...
- 376. Binary Tree Path Sum【LintCode java】
Description Given a binary tree, find all paths that sum of the nodes in the path equals to a given ...
- sparkML原始数据转换成label-features方法
数据1:kaggle-旧金山犯罪分类数据 格式如下: Dates,Category,Descript,DayOfWeek,PdDistrict,Resolution,Address,X,Y -- :: ...
- python数据文件读写
CSV格式读写 Comma-Separated Values 有时也称为字符分隔值,因为分隔字符也可以不是逗号.以,分隔的文件叫csv,以\t分隔的叫tsv 需要注意的一点:分隔符 import cs ...
- TensorFlow | ReluGrad input is not finite. Tensor had NaN values
问题的出现 Question 这个问题是我基于TensorFlow使用CNN训练MNIST数据集的时候遇到的.关键的相关代码是以下这部分: cross_entropy = -tf.reduce_sum ...
- Solium代码测试框架
Solium, 在solid中,Linter用于标识和修复样式&安全问题 //调用测试 solium -d contracts --fix 源代码名称:Solium 源代码网址:http:// ...
- Kali渗透测试工具-nslookup
1.交互模式 终端输入nslookup进入交互模式 (1)查询A地址记录(默认) set q=a A记录简单理解将域名转换成对应的IP地址 (2)查询mail exchanger set q=mx m ...
- Linux系统查看系统版本命令
以下操作在centos系统上实现,有些方式可能只适用centos/redhat版本系统 uname -a |uname -r查看内核版本信息 [root@node1 ~]# uname -a Linu ...