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组成)。

哔哔是很忙的,他需要坐在旁边的你来帮他完成这个问题。

Solution

首先x是正数,在20000内只有30个数用贡献,我们用线段树维护每个数离最近有贡献数多少,维护区间最小,最小有多少个,及一个最小的位置。只要最小值小于0就暴力重构那个点,移到离下一个数的距离。

code

#include<set>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define fr(i,j) for(int i=begin[j];i;i=next[i])
using namespace std;
int const mn=3*1e5+9,inf=1e9+7;
int n,m,a[mn],b[mn],pos[mn*4],cnt[mn*4],mi[mn*4],tag[mn*4];
void uptag(int p){mi[p*2]-=tag[p];mi[p*2+1]-=tag[p];tag[p*2]+=tag[p];tag[p*2+1]+=tag[p];tag[p]=0;
}
void updata(int p){if(mi[p*2]==mi[p*2+1]){pos[p]=pos[p*2];cnt[p]=cnt[p*2]+cnt[p*2+1];mi[p]=mi[p*2];}else{int tmp=(mi[p*2]<mi[p*2+1])?p*2:p*2+1;pos[p]=pos[tmp];cnt[p]=cnt[tmp];mi[p]=mi[tmp];}
}
void oper(int p,int l,int r,int u,int v){if((l!=r)&&tag[p])uptag(p);int mid=(l+r)/2;if(l==r){pos[p]=l;cnt[p]=1;mi[p]=v;return;}if(u<=mid)oper(p*2,l,mid,u,v);else oper(p*2+1,mid+1,r,u,v);updata(p);
}
void ope2(int p,int l,int r,int u,int v,int w){if((l!=r)&&tag[p])uptag(p);int mid=(l+r)/2;if((l==u)&&(r==v)){mi[p]-=w;tag[p]+=w;return;}if(v<=mid)ope2(p*2,l,mid,u,v,w);else if(mid<u)ope2(p*2+1,mid+1,r,u,v,w);else ope2(p*2,l,mid,u,mid,w),ope2(p*2+1,mid+1,r,mid+1,v,w);updata(p);
}
int qury(int p,int l,int r,int u,int v){if((l!=r)&&tag[p])uptag(p);int mid=(l+r)/2;if((l==u)&&(r==v)){return (mi[p]==0)?cnt[p]:0;}if(v<=mid)return qury(p*2,l,mid,u,v);else if(mid<u)return qury(p*2+1,mid+1,r,u,v);else return qury(p*2,l,mid,u,mid)+qury(p*2+1,mid+1,r,mid+1,v);
}
int main(){freopen("d.in","r",stdin);freopen("d.out","w",stdout);scanf("%d%d",&n,&m);fo(i,1,20000){int ii=i,ok=1;while(ii){if((ii%10!=2)&&(ii%10!=3)){ok=0;break;}ii/=10;}if(ok)b[++b[0]]=i;}fo(i,1,n){scanf("%d",&a[i]);int tmp;fo(j,1,b[0])if(b[j]>=a[i]){oper(1,1,n,i,b[j]-a[i]);tmp=j;break;}if(a[i]>b[b[0]])oper(1,1,n,i,inf),tmp=b[0]+1;a[i]=tmp;}fo(cas,1,m){char ch=getchar();while((ch!='c')&&(ch!='a'))ch=getchar();if(ch=='c'){int l,r;scanf("ount%d%d",&l,&r);printf("%d\n",qury(1,1,n,l,r));}else{int l,r,x,tmp;scanf("dd%d%d%d",&l,&r,&x);ope2(1,1,n,l,r,x);while(mi[1]<0){oper(1,1,n,tmp=pos[1],(a[pos[1]]<b[0])?b[a[pos[1]]+1]-b[a[pos[1]]]+mi[1]:inf);a[tmp]++;}}}return 0;
}

【jzoj5289】【NOIP2017提高组A组模拟8.17】【偷笑】【数据结构】相关推荐

  1. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  2. NOIP2017提高组比赛总结

    NOIP2017提高组比赛总结 前言 转眼间,NOIP2017(经常叫他NOIP,其实全称是全国青少年信息学奥林匹克联赛)就这么过去了.回望这2个月,既有参加NOIP的激动,也有赛场上一些失利的遗憾. ...

  3. 【NOIP2017提高组】列队

    题目背景 NOIP2017提高组 DAY2 T3 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia 所在的方阵中 ...

  4. [NOIp2017提高组]奶酪(BFS)

    [NOIp2017提高组_Day2T1]奶酪 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> ...

  5. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  6. [NOIP2017 提高组] 时间复杂度

    题目 时间复杂度[NOIP2017提高组] 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明 ...

  7. P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

    [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每 ...

  8. 【NOIP2017提高组】小凯的疑惑

    小凯的疑惑 题目背景 NOIP2017提高组 DAY1 T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无 ...

  9. 【NOIP2017提高组】奶酪

    奶酪 题目背景 NOIP2017提高组 DAY2 T1 题目描述 现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标 ...

  10. 洛谷 P3953 [NOIP2017 提高组] 逛公园

    开始刷题单啦~,这部分的洛谷好题作为个人训练记录和以后复习用,有兴趣的可以一起做做 题目链接:P3953 [NOIP2017 提高组] 逛公园 题意都是中文就不翻译了 题解:这是一道记忆化+搜索的题目 ...

最新文章

  1. point-to-point(点对点) 网口
  2. 适合前端工作者的iPhone Web App开发
  3. c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐
  4. linux把root用户删了,linux root用户没法删除文件
  5. cpython vm_【协程原理】 - cPython的VM真变态
  6. Android笔记:invalidate()和postInvalidate() 的区别及使用(转载)
  7. VScode Settings Sync同步功能设置
  8. [原]VS2012入门图文教程——第一个程序Hello World
  9. 导出手机QQ聊天记录到电脑
  10. im2col的原理和实现
  11. 模式识别学习笔记(8)——隐马尔可夫模型
  12. 在那海的那边,山的那边,有一条蓝鲸鱼----它的名字叫Docker!!
  13. 数据库的基本查询语句
  14. 布道微服务_03服务的发布和引用
  15. ad19原理图标注_AD19如何让原理图的栅格显示更加清晰醒目
  16. 最快接收计算机sci,投稿到接收仅用四天,这大概是发表最快的sci了!?
  17. 华为、苹果,为何“盯”上二手机?
  18. PHP- 周易五格计算算法
  19. 不可思议!一个3D面具就能破解刷脸支付,还能进火车站?微信:盗刷,我赔!...
  20. mtk 添加app编译进系统

热门文章

  1. 计算机用户无法删除文件,教你几招解决电脑上的文件夹删不掉怎么办?
  2. 香港自由行攻略(自用)
  3. 数据可视化里 边框图片
  4. CRA图像 Clean Random Access (CRA) Pictures
  5. 小学信息技术信息与计算机课件,小学信息技术ppt课件
  6. 2020杭州区块链国际周圆满闭幕,这一份金句集锦不能错过
  7. 错误代码0x80004005
  8. 蒙特卡罗(Monte Carlo)方法简介
  9. 平板电脑桌面不显示此计算机,平板电脑桌面显示不出来怎么办
  10. 什么是SFP光模块?