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的路径中的所有边的颜色翻转. 操作 ...
随机推荐
- Havok Physics 2012(2)
目录 Havok Physics 2012 Chapter 2. Creating a Simulation 创建一个模拟世界 1. Creating Physics 2012 Objects Hav ...
- 201871010114-李岩松《面向对象程序设计(java)》第八周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- Java面向对象程序设计第15章5
5. 利用URLConnetction对象编写程序返回某网站的首页,并将首页的内容存放到文件当中. import java.net.*; import java.io.*; public class ...
- 【微信小程序】踩坑指南(持续更新)
前言 说明: 基于mpvue框架:mpvue官方文档 语法同vue框架:vue官方文档 小程序中会有一些坑点,这里会就工作中遇到的坑一一列举出来 无说明时请直接看代码注释 v-show无法使用在小程序 ...
- 小白学习React官方文档看不懂怎么办?3.元素渲染
直接上代码 const element = <h1>Hello, world</h1>; ReactDOM.render( element, document ...
- 论文阅读:Face Recognition: From Traditional to Deep Learning Methods 《人脸识别综述:从传统方法到深度学习》
论文阅读:Face Recognition: From Traditional to Deep Learning Methods <人脸识别综述:从传统方法到深度学习> 一.引 ...
- 超速入门AT指令集 | 我的物联网成长记
[摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...
- python3基础之 字符串切片
一.python3中,可迭代对象有:列表.元组.字典.字符串:常结合for循环使用:均可使用索引切片 实例: str = ' #str[start:stop:step] 遵循[左闭右开]规则 prin ...
- 2019-10-28:渗透测试学习,sqlmap的使用,笔记
sqlmap工具的使用sql注入工具,明小子,啊D,萝卜头,穿山甲,sqlmap等开源自动化注入利用工具,支持的数据库有12种,在/plugins中可以看到支持的数据库种类,在所有注入利用工具中是最好 ...
- C博客作业05--2019-指针
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.2 本章学习体会 2.PTA实验作业 2.16 -7 输出月份英文名 2.1.1 伪代码 char* getmonth(int n) { ...