JZOJ.5289【NOIP2017模拟8.17】偷笑
Description
CRAZY转过头:“我警告你,哔哔刚刚来过!”
“呵呵呵呵……”
这时,哔哔站了起来,环顾四周:“你们笑什么?……”
巧了,发出笑声的人都排成了一排,每个人刚开始发出的笑声值为a[i]的笑声。但是有些笑声哔哔是听不出来的,他只听得出笑声值只包含2和3的数字,比如说什么2333。
但是同学们还是很会秀操作的。对于操作add l r x表示l到r的同学的笑声值同时加上x。数据保证操作完的x在2*10^4以内。
但是,哔哔还是很想知道哪些人在笑。对于count l r表示询问l到r的同学中有多少个笑声值是哔哔听得出来的(就是只由2和3组成)。
哔哔是很忙的,他需要坐在旁边的你来帮他完成这个问题。
Input
Output
Sample Input
3 6
2 3 4
count 1 3
count 1 2
add 1 3 2
count 1 3
add 2 3 3
count 1 3
Sample Output
2
2
0
0
Data Constraint
对于另外30%的数据n,m≤50000
对于另外50%的数据n,m≤300000
题意就是区间修改和区间查询,其中查询是某区间内不含2,3以外的数的个数。
区间修改我们可以用线段树来维护,但问题就在查询。线段树查询并不支持直接查询题目要求的数的个数,我们虽然可以一个一个检查,但除法取模运算相比也比较慢,每次查询的nlogn复杂度也接受不了。
直接维护不好做,我们可以尝试改变一下线段树维护的信息。
我们注意到题目给出的a[i]的最大值不会超过20000,在20000内符合题目的233数一共也只有31个,我们可以预处理这些,然后维护每个数a[i]与这些数相差最小的且比a[i]大的数的差值,很明显,当差值为0的时候就说明它是个233数,如果差值小于0,我们就要找下一个比它大且相差最小的233数,作差比较,由于每个数最多被修改31次,所以复杂度为O(31mlogn)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#define N 1600000
using namespace std;
struct data{
int cnt,min,mark;
}tree[N];
int f[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
int n,m,voi[N/],x,y,z,top[N/];
char str[];
void build(int root,int l,int r){
tree[root].mark=;
if (l==r){
while (f[top[l]]<voi[l]) top[l]++;
tree[root].min=f[top[l]]-voi[l];
if (tree[root].min==) tree[root].cnt=;
return;
}
int mid=(l+r)>>;
build(root<<,l,mid);
build(root<<|,mid+,r);
tree[root].min=min(tree[root<<].min,tree[root<<|].min);
tree[root].cnt=tree[root<<].cnt+tree[root<<|].cnt;
}
void pushdown(int root,int l,int r){
if (tree[root].mark){
tree[root<<].mark+=tree[root].mark;
tree[root<<|].mark+=tree[root].mark;
tree[root<<].min+=tree[root].mark;
tree[root<<|].min+=tree[root].mark;
tree[root].mark=;
}
return;
}
void updata(int root,int l,int r){
if (tree[root].min>) return;
if (l==r){
if (tree[root].min<){
voi[l]-=tree[root].mark;
tree[root].mark=;
while (f[top[l]]<voi[l]) top[l]++;
tree[root].min=f[top[l]]-voi[l];
}
if (tree[root].min==) tree[root].cnt=;
else tree[root].cnt=;
return;
}
pushdown(root,l,r);
int mid=(l+r)>>;
updata(root<<,l,mid);
updata(root<<|,mid+,r);
tree[root].min=min(tree[root<<].min,tree[root<<|].min);
tree[root].cnt=tree[root<<].cnt+tree[root<<|].cnt;
}
void add(int root,int l,int r,int x,int y,int z){
if ((x<=l)&&(y>=r)){
tree[root].min+=z;
tree[root].mark+=z;
if (tree[root].min<=)
updata(root,l,r);
return;
}
pushdown(root,l,r);
int mid=(l+r)>>;
if (x<=mid) add(root<<,l,mid,x,y,z);
if (y>mid) add(root<<|,mid+,r,x,y,z);
tree[root].min=min(tree[root<<].min,tree[root<<|].min);
tree[root].cnt=tree[root<<].cnt+tree[root<<|].cnt;
}
int count(int root,int l,int r,int x,int y){
if ((x<=l)&&(y>=r)) return tree[root].cnt;
int ans=;
int mid=(l+r)>>;
if (x<=mid) ans+=count(root<<,l,mid,x,y);
if (y>mid) ans+=count(root<<|,mid+,r,x,y);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&voi[i]);
build(,,n);
while (m--){
scanf("%s",str);
if (str[]=='c'){
scanf("%d%d",&x,&y);
printf("%d\n",count(,,n,x,y));
}
else{
scanf("%d%d%d",&x,&y,&z);
add(,,n,x,y,-z);
}
}
return ;
}
神奇的代码
(cin只读入字符串还是巨慢QAQ改成scanf瞬间从3000ms+变成300ms+)
JZOJ.5289【NOIP2017模拟8.17】偷笑的更多相关文章
- JZOJ.5288【NOIP2017模拟8.17】球场大佬
Description 每天下午,古猴都会去打羽毛球.但是古猴实在是太强了,他必须要到一些比较强的场去打.但是每个羽毛球场都有许多的人排着队,每次都只能上四个人,每个人都有自己的能力值,然 ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
[NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
- 【NOIP2017提高A组模拟9.17】组合数问题
[NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
随机推荐
- Android成长之路-手势库的创建
手势库的创建: 使用SDK自带的例子GestureBuilder建立手势库,这个文件夹存在于android\android-sdk-windows \samples\android-10\Gest ...
- 错了:用流量能够放肆,有wifi则要节制
网络上疯传的节制体中就有这么一句:有wifi就会放肆,但用流量就会节制.榜上有名,也说明了人们对wifi网络的需求.尤其是免费wifi.从对无线网络需求方面,毫无疑问,可是从还有一角度,我则觉得是流量 ...
- Atitit.分布式远程调用 rpc rmi CORBA的关系
Atitit.分布式远程调用 rpc rmi CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...
- 使用API Gateway
http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选择. Do ...
- jQuery 插件分享-非常优秀的tab插件tabulous- 学徒帮
干货jquery插件分享之tab. tab 选项卡切换,在日常开发中也是一种比较常见的呈现控件,今天这个tab控件效果还是蛮喜欢的,推荐给大家有用到的场景可以试试: tabulous.js A jQu ...
- JS学习笔记(5)--一道返回整数数组的面试题(经验之谈)
说明: 1. 微信文章里看到的,作者是马超 网易高级前端技术经理,原文在网上搜不到,微信里可以搜“为什么你的前端工作经验不值钱?”,里面写着“转载自网易实践者社区”.(妈蛋,第二天网上就有了http: ...
- VBA 获得绝对地址控制焦点的设置
先上代码,有时间再补上说明. Dim Mefoucs As String MsgBox "你选定的当前单元格是:" & Selection.Address Mefoucs ...
- PHP uxf framework 在模版中加入url标签
1. 确保不修改discuz代码: 2. 继承discuz template类,重载parse_template 方法:由于discuz在模版引擎这一块没有考虑扩展性,对标签的解析全部写在一个方法中, ...
- curses库--libncurses5-dev--游标移动及屏幕的显示
curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形. curses的名字起源于"cursor optimization" ...
- 框架Iframe的退出,IE 火狐都没问题 到360就不跳转页面 刷新一遍才跳转到登录页
遇到这种情况 ,郁闷死了,来回折腾好几种跳转方法,最后有一个灵感,当我点击退出按钮的时候,我是用jquery $("#ID").click(function(){}) 这种方法异步 ...