维护一个序列,要求支持下列2种操作:

add a b c:区间[a,b]中每个数加上c

count a b:查询区间[a,b]中有多少数是k的倍数(k为给定常数)

输入描述 Input Description

第一行三个数n,m,k,分别表示序列长度、操作数和count中的k

接下来一行n个整数,表示原始序列

接下来m行,每行是题面中的操作之一

输出描述 Output Description

对于每个count操作,输出一行答案

样例输入 Sample Input

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

样例输出 Sample Output

0

3

2

2

1

2

数据范围及提示 Data Size & Hint

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加强版(线段树? 。。。分块)的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  3. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  5. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  6. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  8. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  9. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  10. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

随机推荐

  1. keeplived离线安装openssl-devel依赖包

    转载自素文宅博客:https://blog.yoodb.com/yoodb/article/detail/1434 由于公司业务并发比较高需要高可用使用LVS keeplived.在linux系统ce ...

  2. getClass()和instanceof以及类的equals方法

    在比较两个类时,常见有两种做法,一种是x.getClass() == y; 一种是x instanceof y,下面我们来比较这两种做法的区别. getClass()返回一个对象所属的类 public ...

  3. pandas的使用(3)

    pandas的使用(3)

  4. hdu 1533 Going Home (KM)

    Going HomeTime Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. nyoj 63-小猴子下落 (模拟)

    63-小猴子下落 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:2 submit:5 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同 ...

  6. pandas的使用(5)

    pandas的使用(5)-- 缺失值的处理

  7. 攻克数通,斩获云计算!誉天Double HCIE学员考证秘笈揭晓

    不知不觉,已经过了四个月的时间了,我是六月多报名云计算的,本来是奔着邹Sir去的,但是当时邹sir已经上到HCIE的课程了,只能蹭学弟之前的录屏看.等到七月八号,又正式跟了曾曦老师上了一次完整的课程. ...

  8. Mac usr/bin 目录 权限问题

    Mac进行 usr/bin 目录下修改权限问题,operation not permitted 一般情况下我们在使用mac系统过程中下载一些文件.新建一些项目之后,这些文件都会默认是只读状态,这时我们 ...

  9. DNS name

    DNS name 指的反向解析的域名.

  10. C#变量---xdd

    cshape(c#)学习笔记 1. string str1=Console.ReadLine();//键盘输入的默认为字符串 2.  Console.WriteLine('你的成绩是'+a+'分'); ...