Codeves-5037线段树4加强版(线段树? 。。。分块)
维护一个序列,要求支持下列2种操作:
add a b c:区间[a,b]中每个数加上c
count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数)
第一行三个数n,m,k,分别表示序列长度、操作数和count中的k
接下来一行n个整数,表示原始序列
接下来m行,每行是题面中的操作之一
对于每个count操作,输出一行答案
10 10 5
5 5 8 3 5 6 7 8 3 0
add 2 7 1
count 3 4
add 2 5 4
count 1 5
count 2 6
count 1 3
add 4 8 3
count 3 7
add 4 8 2
count 1 2
0
3
2
2
1
2
10%:n,m<=10,k<=10000;
另外的20%:n,m<=100000,k<=10;
另外的20%:n,m<=50000,k<=100;
100%:n,m<=200000,k<=200000.
题解:这题,题目说线段树。。。我觉得线段树不可做,,,自己太菜了QWQ。我用的分块的思想;
对于块内维护,对于L~R完整的块,我们只需记录所加的数x,然后统计块内对K取模后值为看k-x%k的数的数量的和,对于两边不完整的块,暴力即可(最坏2*√n));
参考代码为:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL inf=0x3f3f3f3f3f3f3f3fLL;
const int maxn=2e5+;
const int block=;
int n,q,k,a[maxn],x,y,z,seg[],v[][maxn];
char str[]; inline void read(int &x)
{
char c;int sign = ;x = ;
do { c = getchar(); if(c == '-') sign = -; } while(!isdigit(c));
do { x = x * + c - ''; c = getchar(); } while(isdigit(c));
x *= sign;
} int main()
{
memset(seg,,sizeof seg);
read(n),read(q),read(k);
for(int i=;i<=n;i++)
{
read(a[i]);
if(a[i]>=k) a[i]%=k;
v[(i-)/block+][a[i]]++;
} while(q--)
{
scanf("%s",str);
read(x),read(y);
int l=(x-)/block+,r=(y-)/block;
if(str[]=='a')
{
read(z);
if(l<=r)
{
for(int i=l;i<=r;i++)
{
seg[i]+=z;
if(seg[i]>=k) seg[i]%=k;
}
for(int i=x;i<=(l-)*block;i++)
{
v[l-][a[i]]--;
a[i]+=z;
if(a[i]>=k) a[i]%=k;
v[l-][a[i]]++;
}
for(int i=r*block+;i<=y;i++)
{
v[r+][a[i]]--;
a[i]+=z;
if(a[i]>=k) a[i]%=k;
v[r+][a[i]]++;
}
}
else
{
for(int i=x;i<=y;i++)
{
v[(i-)/block+][a[i]]--;
a[i]+=z;
if(a[i]>=k) a[i]%=k;
v[(i-)/block+][a[i]]++;
}
}
}
else
{
int ans=;
if(l<=r)
{
for(int i=l;i<=r;i++)
{
int temp=;
if(k<seg[i]) temp=k-seg[i]%k;
else temp=k-seg[i];
if(temp==k) temp=;
ans+=v[i][temp];
}
for(int i=x;i<=(l-)*block;i++)
if(a[i]+seg[l-]==k || a[i]+seg[l-]==) ans++;
for(int i=r*block+;i<=y;i++)
if(a[i]+seg[r+]==k || a[i]+seg[r+]==) ans++;
}
else
{
for(int i=x;i<=y;i++)
if(a[i]+seg[(i-)/block+]==k || a[i]+seg[(i-)/block+]==) ans++;
}
printf("%d\n",ans);
}
}
return ;
}
Codeves-5037线段树4加强版(线段树? 。。。分块)的更多相关文章
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- HDU4897 (树链剖分+线段树)
Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...
随机推荐
- keeplived离线安装openssl-devel依赖包
转载自素文宅博客:https://blog.yoodb.com/yoodb/article/detail/1434 由于公司业务并发比较高需要高可用使用LVS keeplived.在linux系统ce ...
- getClass()和instanceof以及类的equals方法
在比较两个类时,常见有两种做法,一种是x.getClass() == y; 一种是x instanceof y,下面我们来比较这两种做法的区别. getClass()返回一个对象所属的类 public ...
- pandas的使用(3)
pandas的使用(3)
- hdu 1533 Going Home (KM)
Going HomeTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- nyoj 63-小猴子下落 (模拟)
63-小猴子下落 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:2 submit:5 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同 ...
- pandas的使用(5)
pandas的使用(5)-- 缺失值的处理
- 攻克数通,斩获云计算!誉天Double HCIE学员考证秘笈揭晓
不知不觉,已经过了四个月的时间了,我是六月多报名云计算的,本来是奔着邹Sir去的,但是当时邹sir已经上到HCIE的课程了,只能蹭学弟之前的录屏看.等到七月八号,又正式跟了曾曦老师上了一次完整的课程. ...
- Mac usr/bin 目录 权限问题
Mac进行 usr/bin 目录下修改权限问题,operation not permitted 一般情况下我们在使用mac系统过程中下载一些文件.新建一些项目之后,这些文件都会默认是只读状态,这时我们 ...
- DNS name
DNS name 指的反向解析的域名.
- C#变量---xdd
cshape(c#)学习笔记 1. string str1=Console.ReadLine();//键盘输入的默认为字符串 2. Console.WriteLine('你的成绩是'+a+'分'); ...