每个时刻都形成若干段满足段内任意两点可达。将其视为若干正方形。则查询相当于求历史上某点被正方形包含的时刻数量。并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就是裸的三维偏序,cdq分治+树状数组即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 1000000010
  5. #define N 300010
  6. #define mp(x,y) make_pair((x),(y))
  7. #define fi first
  8. #define se second
  9. #define time se.fi
  10. #define ans se.se
  11. #define val se.se
  12. #define left fi.fi
  13. #define right fi.se
  14. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  15. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  16. int read()
  17. {
  18. int x=0,f=1;char c=getchar();
  19. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  20. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  21. return x*f;
  22. }
  23. typedef pair<int,int> pii;
  24. typedef pair<pii,pii> ppp;
  25. int n,m,t,u,v,a[N],tree[N];
  26. char s[N];
  27. set<ppp> seg;
  28. ppp b[N<<1],q[N];
  29. pii o;
  30. struct data
  31. {
  32. ppp x;int op;
  33. bool operator <(const data&a) const
  34. {
  35. return x.time<a.x.time||x.time==a.x.time&&x.fi<a.x.fi||x.time==a.x.time&&x.fi==a.x.fi&&op<a.op;
  36. }
  37. }c[N*3],d[N*3];
  38. void add(int k,int x){while (k<=n) tree[k]+=x,k+=k&-k;}
  39. int query(int k){int s=0;while (k) s+=tree[k],k-=k&-k;return s;}
  40. void solve(int l,int r)
  41. {
  42. if (l==r) return;
  43. int mid=l+r>>1;
  44. solve(l,mid);
  45. solve(mid+1,r);
  46. int cur=l-1;
  47. for (int i=mid+1;i<=r;i++)
  48. if (c[i].op==1)
  49. {
  50. while (cur<mid&&(c[cur+1].op==1||c[cur+1].x.left<=c[i].x.left))
  51. {
  52. cur++;
  53. if (c[cur].op==0) add(c[cur].x.right,c[cur].x.val);
  54. }
  55. c[i].x.ans+=query(c[i].x.right);
  56. }
  57. for (;cur>=l;cur--) if (c[cur].op==0) add(c[cur].x.right,-c[cur].x.val);
  58. int i=l,j=mid+1;
  59. for (int k=l;k<=r;k++)
  60. if (i<=mid&&(j>r||c[i].x.left<c[j].x.left)) d[k]=c[i++];else d[k]=c[j++];
  61. for (int k=l;k<=r;k++) c[k]=d[k];
  62. }
  63. signed main()
  64. {
  65. #ifndef ONLINE_JUDGE
  66. freopen("a.in","r",stdin);
  67. freopen("a.out","w",stdout);
  68. #endif
  69. n=read(),m=read();
  70. scanf("%s",s+1);
  71. for (int i=1;i<=n;i++) a[i]=s[i]-'0';
  72. if (!a[1]) seg.insert(mp(o,o));
  73. for (int i=1;i<=n;i++)
  74. if (a[i])
  75. {
  76. int t=i;
  77. while (t<n&&a[t+1]==1) t++;
  78. seg.insert(mp(mp(i-1,t),o));
  79. i=t;
  80. }
  81. else if (!a[i+1]) seg.insert(mp(mp(i,i),o));
  82. for (int i=1;i<=m;i++)
  83. {
  84. /*for (auto it=seg.begin();it!=seg.end();it++)
  85. cout<<(*it).left<<' '<<(*it).right<<' '<<(*it).time<<endl;
  86. cout<<endl;*/
  87. char c=getc();
  88. if (c=='q')
  89. {
  90. int l=read()-1,r=read()-1;
  91. q[++t]=mp(mp(l,r),mp(i-1,0));
  92. auto it=seg.upper_bound(mp(mp(l,n+1),o));
  93. if (it!=seg.begin())
  94. {
  95. it--;
  96. if ((*it).right>=r) q[t].ans=i-(*it).time;
  97. }
  98. }
  99. else
  100. {
  101. int x=read();
  102. if (a[x])
  103. {
  104. auto it=seg.lower_bound(mp(mp(x,0),o));it--;
  105. ppp tmp=*it;seg.erase(it);
  106. b[++u]=mp(tmp.fi,mp(i-1,i-tmp.time));
  107. seg.insert(mp(mp(tmp.left,x-1),mp(i,0)));
  108. seg.insert(mp(mp(x,tmp.right),mp(i,0)));
  109. }
  110. else
  111. {
  112. auto it=seg.lower_bound(mp(mp(x,0),o));
  113. auto it2=it;it2--;
  114. ppp tmp=*it;seg.erase(it);
  115. ppp tmp2=*it2;seg.erase(it2);
  116. b[++u]=mp(tmp.fi,mp(i-1,i-tmp.time));
  117. b[++u]=mp(tmp2.fi,mp(i-1,i-tmp2.time));
  118. seg.insert(mp(mp(tmp2.left,tmp.right),mp(i,0)));
  119. }
  120. a[x]^=1;
  121. }
  122. }
  123. n++;
  124. for (int i=1;i<=t;i++) q[i].right=n-q[i].right;
  125. for (int i=1;i<=u;i++) b[i].right=n-b[i].right;
  126. /*for (int i=1;i<=t;i++) cout<<q[i].left<<' '<<q[i].right<<' '<<q[i].time<<' '<<q[i].ans<<endl;
  127. cout<<endl;
  128. for (int i=1;i<=u;i++) cout<<b[i].left<<' '<<b[i].right<<' '<<b[i].time<<' '<<b[i].val<<endl;*/
  129. //求left<=q[i].left right<=q[i].right time<=q[i].time 的权值和
  130. /*for (int i=1;i<=t;i++)
  131. for (int j=1;j<=u;j++)
  132. if (b[j].left<=q[i].left&&b[j].right<=q[i].right&&b[j].time<=q[i].time) q[i].ans+=b[j].val;*/
  133. for (int i=1;i<=t;i++) c[++v].x=q[i],c[v].op=1;
  134. for (int i=1;i<=u;i++) c[++v].x=b[i],c[v].op=0;
  135. sort(c+1,c+v+1);
  136. solve(1,v);
  137. sort(c+1,c+v+1);
  138. for (int i=1;i<=v;i++) if (c[i].op==1) printf("%d\n",c[i].x.ans);
  139. return 0;
  140. //NOTICE LONG LONG!!!!!
  141. }

  

LOJ3146 APIO2019路灯(cdq分治+树状数组)的更多相关文章

  1. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  2. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  3. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  4. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  5. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  6. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  7. BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ第一题,warush了好久.. CDQ分治推荐论文: 1 <从<C ...

  8. Hdu4742-Pinball Game 3D(cdq分治+树状数组)

    Problem Description RD is a smart boy and excel in pinball game. However, playing common 2D pinball ...

  9. hdu 5126 stars cdq分治套cdq分治+树状数组

    题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...

随机推荐

  1. CF 768B

    CF 768B题意:In each operation Sam must remove any element x, such that x>1, from the list and inser ...

  2. 洛谷P1270 访问美术馆

    题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...

  3. Web前端开发规范之文件存储位置规范

    文件存放位置规范 1   文件夹说明 flash存放flash文件 p_w_picpaths存放图片文件 inc存放include文件 library存放DW库文件 media存放多媒体文件 scri ...

  4. 第06组 Alpha事后诸葛亮

    一.组长博客: https://www.cnblogs.com/mhq-mhq/p/11923194.html 二.Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚 ...

  5. 各大web服务器https的证书文件

    nginx  key+pem iis pfx+pfx-password.txt tomcat pfx+pfx-password.txt apache key+chain.crt+public.crt

  6. HBase 介绍

    HBase的列族式存储 列族式存储的概念 HBase Table的组成 Table = RowKey + Family + Column + Timestamp + Value 数据存储模式 (Row ...

  7. Python中的args和kwargs

    有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...

  8. LInux_CentosOS中yum安装jdk及配置环境变量

    系统版本 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #安装之前先查看一下有无系统 ...

  9. 【Java】单点登录(SSO)

    单点登录介绍 ​ SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一 ...

  10. 一起学习log4cxx

    目前成熟的日志系统有很多,比如log4cxx,log4cpp等,今天一起来学习log4cxx吧,之所以学习这个,首先,这个日志库比较成熟,一直由apach基金在维护,而log4cpp缺乏维护.再者,这 ...