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的路径中的所有边的颜色翻转. 操作 ...
随机推荐
- 201871010114-李岩松《面向对象程序设计(java)》第八周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 反射与泛型--使用泛型反射API打印出给定类的所有内容
package chapter8Demos; import java.lang.reflect.*; import java.util.Arrays; import java.util.Scanner ...
- JavaScript: 遍历Array的同时删除指定项
一个简单的需求是,在遍历一个数组时,移除指定的项. 下列代码是不能正常工作的: var elements = [1, 5, 5, 3, 5, 2, 4]; for(var i = 0; i < ...
- mysql查询不重复的行内容,不重复的记录数.count,distinct
有这么一个表 记录了id, p_id, p_name , p_content , p_time 1 343 aaa aaaaaa 2012-09-01 2 ...
- Python Excel 绘制柱形图
本文主要讲述如何使用Python操作Excel绘制柱形图. 相关代码请参考 https://github.com/RustFisher/python-playground 本文链接:https://w ...
- 云计算时代,你所不了解的 DevOps
在本文中,我们讨论如何快速地从更高的层面理解DevOps,介绍准备改变文化的最佳实践.我们将讨论DevOps的目标以及从组织管理层得到支持的方法,为DevOps的概念打下基础.我们将试着从根本上介绍使 ...
- nyoj 1364-治安管理 (INT_MAX)
1364-治安管理 内存限制:128MB 时间限制:3000ms 特判: No 通过数:6 提交数:6 难度:2 题目描述: SZ市是中国改革开放建立的经济特区,是中国改革开放的窗口,已发展为有一定影 ...
- 一文教你快速读懂MQTT网关
MQTT是一种发布(publish)/订阅(subscribe)协议,MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与 ...
- 附009.Kubernetes永久存储之GlusterFS独立部署
一 前期准备 1.1 基础知识 Heketi提供了一个RESTful管理界面,可以用来管理GlusterFS卷的生命周期.Heketi会动态在集群内选择bricks构建所需的volumes,从而确保数 ...
- linux网络测试命令
一.ping 它通过向目标主机发送一个个数据包以及接受数据包的回应来判断主机和目标主机之间网络连接情况.ping的两个功能:判断网络是否可达.网络性能统计. ping使用的是网络层的ICMP协议. p ...