Description

berber走进机房,边敲门边喊:“我是哔哔”
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

第一行两个整数分别为n,m表示同学的数目和操作数。第二行n个整数a[i]表示同学一开始的笑声值。接下来m行表示操作数,描述如上。

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

对于20%的数据n,m≤2000
对于另外30%的数据n,m≤50000
对于另外50%的数据n,m≤300000
本题时限3s

题意就是区间修改和区间查询,其中查询是某区间内不含2,3以外的数的个数。

区间修改我们可以用线段树来维护,但问题就在查询。线段树查询并不支持直接查询题目要求的数的个数,我们虽然可以一个一个检查,但除法取模运算相比也比较慢,每次查询的nlogn复杂度也接受不了。

直接维护不好做,我们可以尝试改变一下线段树维护的信息。

我们注意到题目给出的a[i]的最大值不会超过20000,在20000内符合题目的233数一共也只有31个,我们可以预处理这些,然后维护每个数a[i]与这些数相差最小的且比a[i]大的数的差值,很明显,当差值为0的时候就说明它是个233数,如果差值小于0,我们就要找下一个比它大且相差最小的233数,作差比较,由于每个数最多被修改31次,所以复杂度为O(31mlogn)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<ctime>
 5 #define N 1600000
 6 using namespace std;
 7 struct data{
 8     int cnt,min,mark;
 9 }tree[N];
10 int f[32]={2,3,22,23,32,33,222,223,232,233,322,323,332,333,2222,2223,2232,2233,2322,2323,2332,2333,3222,3223,3232,3233,3322,3323,3332,3333,22222};
11 int n,m,voi[N/4],x,y,z,top[N/4];
12 char str[10];
13 void build(int root,int l,int r){
14     tree[root].mark=0;
15     if (l==r){
16         while (f[top[l]]<voi[l]) top[l]++;
17         tree[root].min=f[top[l]]-voi[l];
18         if (tree[root].min==0) tree[root].cnt=1;
19         return;
20     }
21     int mid=(l+r)>>1;
22     build(root<<1,l,mid);
23     build(root<<1|1,mid+1,r);
24     tree[root].min=min(tree[root<<1].min,tree[root<<1|1].min);
25     tree[root].cnt=tree[root<<1].cnt+tree[root<<1|1].cnt;
26 }
27 void pushdown(int root,int l,int r){
28     if (tree[root].mark){
29         tree[root<<1].mark+=tree[root].mark;
30         tree[root<<1|1].mark+=tree[root].mark;
31         tree[root<<1].min+=tree[root].mark;
32         tree[root<<1|1].min+=tree[root].mark;
33         tree[root].mark=0;
34     }
35     return;
36 }
37 void updata(int root,int l,int r){
38     if (tree[root].min>0) return;
39     if (l==r){
40         if (tree[root].min<0){
41             voi[l]-=tree[root].mark;
42             tree[root].mark=0;
43             while (f[top[l]]<voi[l]) top[l]++;
44             tree[root].min=f[top[l]]-voi[l];
45         }
46         if (tree[root].min==0) tree[root].cnt=1;
47         else tree[root].cnt=0;
48         return;
49     }
50     pushdown(root,l,r);
51     int mid=(l+r)>>1;
52     updata(root<<1,l,mid);
53     updata(root<<1|1,mid+1,r);
54     tree[root].min=min(tree[root<<1].min,tree[root<<1|1].min);
55     tree[root].cnt=tree[root<<1].cnt+tree[root<<1|1].cnt;
56 }
57 void add(int root,int l,int r,int x,int y,int z){
58     if ((x<=l)&&(y>=r)){
59         tree[root].min+=z;
60         tree[root].mark+=z;
61         if (tree[root].min<=0)
62             updata(root,l,r);
63         return;
64     }
65     pushdown(root,l,r);
66     int mid=(l+r)>>1;
67     if (x<=mid) add(root<<1,l,mid,x,y,z);
68     if (y>mid) add(root<<1|1,mid+1,r,x,y,z);
69     tree[root].min=min(tree[root<<1].min,tree[root<<1|1].min);
70     tree[root].cnt=tree[root<<1].cnt+tree[root<<1|1].cnt;
71 }
72 int count(int root,int l,int r,int x,int y){
73     if ((x<=l)&&(y>=r)) return tree[root].cnt;
74     int ans=0;
75     int mid=(l+r)>>1;
76     if (x<=mid) ans+=count(root<<1,l,mid,x,y);
77     if (y>mid) ans+=count(root<<1|1,mid+1,r,x,y);
78     return ans;
79 }
80 int main(){
81     scanf("%d%d",&n,&m);
82     for (int i=1;i<=n;i++)
83      scanf("%d",&voi[i]);
84     build(1,1,n);
85     while (m--){
86         scanf("%s",str);
87         if (str[0]=='c'){
88             scanf("%d%d",&x,&y);
89             printf("%d\n",count(1,1,n,x,y));
90         }
91         else{
92             scanf("%d%d%d",&x,&y,&z);
93             add(1,1,n,x,y,-z);
94         }
95     }
96     return 0;
97 }

神奇的代码

(cin只读入字符串还是巨慢QAQ改成scanf瞬间从3000ms+变成300ms+)

转载于:https://www.cnblogs.com/Lanly/p/7387541.html

JZOJ.5289【NOIP2017模拟8.17】偷笑相关推荐

  1. 农庄规划软件测试,《模拟农场17》游戏评测:现代化农场让你学会如何种田

    作者:Ind4V 来源:游侠攻略组 转载请注明出处. [游戏介绍] 游戏将包含所有农场类型,包括畜牧业,种植业,销售,林木业,游戏采用沙盒世界.管理超大地图的农场.根据游戏系统,用户将掌控众多农场载具 ...

  2. 2020.03.18模拟赛17(第二题)

    2.[GDKOI训练]音乐节拍(mnotes) 题目描述 FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000)种音节组成,编号为1到N,而且一定按照从1到N的顺序进行弹奏, ...

  3. 2020.03.18模拟赛17(第三题)

    3.[GDKOI训练]电视游戏问题(vidgame) 题目描述 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶教授的做法拿她们去电击戒瘾的,可是后来他发现奶牛们玩游戏之后比原先产更多的奶.很明显,这是 ...

  4. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  5. JZOJ 5373. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人

    Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample Output 1 0 1 7 0 5 Data Constra ...

  6. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  7. JZOJ.5234【NOIP2017模拟8.7】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  8. JZOJ 5344. 【NOIP2017模拟9.3A组】摘果子

    Description Input Output Sample Input 7 9 39 6 13 2 22 6 7 4 -19 5 28 6 -17 1 2 1 3 2 4 1 5 4 6 2 7 ...

  9. JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  10. JZOJ.5264【NOIP2017模拟8.12】化学

    Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint 搜索.考虑到m很大,我们不 ...

最新文章

  1. Linux之 手动释放内存
  2. Linux之Qt利用Sqlite静态编译库(转)
  3. python的深造方向_自动化深造方向有哪些?
  4. css3---( 框架)
  5. HTMO DOM部分---小练习;列表之间移动、日期选择、好友选中、滑动效果、滚动条效果、飞入飞出效果。...
  6. VxRack与VxRail遭受Power的“全面入侵”
  7. 实验一 熟悉常用的Linux操作,实验2-熟悉常用的HDFS操作
  8. Photoshop CS6 安装教程
  9. Win10系统下安装CAD2006与CASS
  10. html页面访pdf样式,html网页布局模板.pdf
  11. [Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
  12. word文档怎么找回误删的文件_怎样找回误删除的word文件?
  13. Python语言特性和优缺点及什么是鸭子类型?
  14. 国产服务器飞腾/鲲鹏/龙芯下Linux(统信UOS、麒麟系统)下GB28181/Onvif/RTSP监控视频平台的部署操作
  15. linux归档和压缩的区别,文件的归档和压缩
  16. java 发送邮件和读取邮件(163邮箱为例)
  17. 手机报彩信易操作平台
  18. 基础练习 回形取数 C语言 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
  19. RS232 / TTL / CMOS 电平
  20. 一个上网APP如何让全民拥有免费wifi的秘诀

热门文章

  1. SAD—系统分析和设计 “机票预订系统”_软件工程导论大作业
  2. Clonezilla SE---克隆linux------转载
  3. 盘点阿里巴巴 34 个牛逼 GitHub 项目
  4. linux系统文件颜色含义
  5. hdu3987(最小割最小边数)
  6. camille mumu 模拟器 frida 踩坑记录
  7. matlab 电路频率响应_电力电子模型频率响应估计
  8. 0基础学习音视频路线,以及重磅音视频资料下载
  9. pod健康检查详解(liveness,readiness,滚动更新)
  10. 澳大利亚维多利亚州旅游局力推高尔夫主题体验