https://www.lydsy.com/JudgeOnline/problem.php?id=4942

http://uoj.ac/problem/314

https://www.luogu.org/problemnew/show/P3822

题面是markdown形式的所以我传不上……

UPD:18.5.11改成对参考代码的理解失误。

参考:http://www.cnblogs.com/RabbitHu/p/UOJ314.html仔细思考之后发现lazy标记可以不下传,因为区间修改都是改0/INF,单点修改就直接改就行了……

(晚上睡前突然发现这个sb问题然后太晚了只好现在改。)

暴力修改显然是不行的。

考虑让你改的是a*2^b,已经明示了想让你直接修改二进制位,于是把a用O(log)时间拆成二进制然后log次加减,期间的进位退位问题用参考博客的方法可以O(log)实现。

但问题是位数一共有3e7……显然会T的。

于是压60位,这样时间复杂度就有保证了。

(我记得以前有人批评松松松就是因为他WC出神题然后NOI出签到题……woc我怕不是送分题都做不出来我退役吧。)

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<iostream>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef long long ll;
  10. const int N=5e5+;
  11. const int B=;
  12. const ll INF=(1LL<<B)-;
  13. inline ll read(){
  14. ll X=,w=;char ch=;
  15. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
  16. while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
  17. return w?-X:X;
  18. }
  19. ll lazy[N*+],val[N*+];
  20. int pos[N*+];
  21. bool tag[N*+][];
  22. inline void upt(int a){
  23. tag[a][]=tag[a<<][]&tag[a<<|][];
  24. tag[a][]=tag[a<<][]&tag[a<<|][];
  25. }
  26. inline void mdy(int a,ll x){
  27. if(pos[a]!=-)val[pos[a]]=x;
  28. if(x==)tag[a][]=,tag[a][]=;
  29. else if(x==INF)tag[a][]=,tag[a][]=;
  30. else tag[a][]=tag[a][]=;
  31. lazy[a]=x;
  32. }
  33. inline void push(int a){
  34. if(lazy[a]==-)return;
  35. mdy(a<<,lazy[a]);
  36. mdy(a<<|,lazy[a]);
  37. lazy[a]=-;
  38. }
  39. void build(int a,int l,int r){
  40. tag[a][]=;lazy[a]=-;pos[a]=-;
  41. if(l==r){
  42. pos[a]=l;
  43. return;
  44. }
  45. int mid=(l+r)>>;
  46. build(a<<,l,mid);build(a<<|,mid+,r);
  47. }
  48. void modify(int a,int l,int r,int l1,int r1,ll x){
  49. if(r<l1||r1<l||l1>r1)return;
  50. if(l1<=l&&r<=r1){
  51. mdy(a,x);
  52. return;
  53. }
  54. push(a);
  55. int mid=(l+r)>>;
  56. modify(a<<,l,mid,l1,r1,x);
  57. modify(a<<|,mid+,r,l1,r1,x);
  58. upt(a);
  59. }
  60. ll query(int a,int l,int r,int p){
  61. if(l==r)return val[l];
  62. push(a);
  63. int mid=(l+r)>>;
  64. if(p<=mid)return query(a<<,l,mid,p);
  65. else return query(a<<|,mid+,r,p);
  66. }
  67. int find(int a,int l,int r,int p,int o){
  68. if(tag[a][!o])return -;
  69. if(l==r)return l;
  70. push(a);
  71. int mid=(l+r)>>,tmp;
  72. if(p<=mid&&(tmp=find(a<<,l,mid,p,o))!=-)return tmp;
  73. return find(a<<|,mid+,r,p,o);
  74. }
  75. void add(int p,ll x){
  76. ll tmp=query(,,N,p);
  77. modify(,,N,p,p,(tmp+x)&INF);
  78. if(tmp+x>INF){
  79. int r=find(,,N,p+,);
  80. modify(,,N,r,r,val[r]+);
  81. modify(,,N,p+,r-,);
  82. }
  83. }
  84. void del(int p,ll x){
  85. ll tmp=query(,,N,p);
  86. modify(,,N,p,p,(tmp-x)&INF);
  87. if(tmp-x<){
  88. int r=find(,,N,p+,);
  89. modify(,,N,r,r,val[r]-);
  90. modify(,,N,p+,r-,INF);
  91. }
  92. }
  93. int main(){
  94. int n=read();read(),read(),read();
  95. build(,,N);
  96. for(int i=;i<=n;i++){
  97. int op=read();
  98. if(op==){
  99. ll a=read(),b=read();
  100. ll p=b/B,m=b%B;
  101. if(a>){
  102. ll x=(ll)a<<m&INF;
  103. if(x)add(p,x);
  104. p++;a>>=(B-m);
  105. if(a)add(p,a);
  106. }else{
  107. a=-a;
  108. ll x=(ll)a<<m&INF;
  109. if(x)del(p,x);
  110. p++;a>>=(B-m);
  111. if(a)del(p,a);
  112. }
  113. }else{
  114. ll k=read();
  115. printf("%lld\n",query(,,N,k/B)>>(k%B)&);
  116. }
  117. }
  118. return ;
  119. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4942 & UOJ314:[NOI2017]整数——题解的更多相关文章

  1. 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

    [BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...

  2. 【BZOJ4942】[NOI2017]整数(分块)

    [BZOJ4942][NOI2017]整数(分块) 题面 BZOJ 洛谷 题解 暴力就是真正的暴力,直接手动模拟进位就好了. 此时复杂度是模拟的复杂度加上单次询问的\(O(1)\). 所以我们需要优化 ...

  3. 【bzoj4942】[Noi2017]整数 压位+线段树

    题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...

  4. [Bzoj4942][Noi2017]整数(线段树)

    4942: [Noi2017]整数 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 237[Submit][Status][D ...

  5. NOI2017整数

    NOI2017 整数 题意: ​ 让你实现两个操作: 1 \(a\) \(b\):将\(x\)加上整数\(a \cdot 2 ^ b\),其中 \(a\)为一个整数,\(b\)为一个非负整数 2 \( ...

  6. C#版 - Leetcode 13. 罗马数字转整数 - 题解

    C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...

  7. [NOI2017]整数

    [NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...

  8. BZOJ4942【noi2017】整数

    题目背景 在人类智慧的山巅,有着一台字长为10485761048576 位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 ...

  9. [BZOJ4942] [NOI2017]整数

    题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...

随机推荐

  1. oracle 建立一个视图,然后授权其他用户访问

    grant select on V_LIC_ENTRY_HZ_STATUS to ielicr2013; create or replace view dept_sum_vw (name,minsal ...

  2. CentOS6.5进不去系统,修复

    今天进系统出现问题了,然后在网上搜索了一下解决方案解决了,把解决方法记录下来,方便以后查阅. 输入root密码 #mount | grep "on /" //得到root用户所在分 ...

  3. redis 学习笔记三

    一.redis 复制 数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常由被复制方和复制方组成,被复制方和复制方之间建立网络连接,复制方式通常为被复制方主动将数据发送到复制方,复制方 ...

  4. JQuery.extend扩展实现同步post请求

    有时需要在jQuery中实现同步post请求,而jquery自带的是异步,需要通过JQuery.extend扩展. 支持ie和firefox,方法转载而来.需要在submit前将form.append ...

  5. Cannot assign requested address (connect failed)

    压测时,应用服务器报错:Cannot assign requested address (connect failed) 经检查,由于应用服务器,频繁发起http请求,由于每次连接都在很短的时间内结束 ...

  6. PyCharm 2018 最新激活方式总结(最新最全最有效)!!!

    PyCharm 2018 最新激活方式总结(最新最全最有效!!!) pycharm2018 是目前python编程的主要应用工具,具有非常广泛的应用,不过对于它的破解一直比较麻烦,这里我为大家提供了三 ...

  7. MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)

    关于MATLAB实现连续信号的频谱分析,以正余弦波信号频谱分析为例分析如下: 1.含有频率f ,2f和3f的正弦波叠加信号,即: 其中,f =500Hz.试采用Matlab仿真软件对该信号进行频谱分析 ...

  8. flume-kafka-storm-hdfs-hadoop-hbase

    # bigdata-demo 项目地址: https://github.com/windwant/bigdata-demo.git hadoop: hadoop hdfs操作 log输出到flume ...

  9. 加油吧 骚年QAQ

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2017 年 11 月 08 日 原地址:https://niaobulashi.com/archives/fighting.html --- 想 ...

  10. 181. Flip Bits【LintCode, by java】

    Description Determine the number of bits required to flip if you want to convert integer n to intege ...