看到全是线段树或者树状数组写法,就来提供一发全网唯一cdq分治三维偏序解法吧

容易发现,这个题的查询就是对于每个区间l,r,查询有多少个修改区间li,ri与l,r有交集

转化为数学语言,就是查询满足li<=r且ri>=l的修改个数

一个二维偏序问题,但是我们发现,这是个动态插入的二维偏序问题

_(:з」∠)_一时不知所措

再想一想,不妨把时间另开一个维度作为第三维,然后就是这样了

对于每个查询,我们要求出它之前有多少个修改区间与其相交

数学语言:

查询满足li<=r且ri>=l且[li,ri].time<[l,r].time的修改个数

思路清晰明了,而且敲好想,但是实现细节还是比较麻烦的(一部分是因为我的奇葩cdq写法),在代码注释里解释一下(模板这种的就不解释了)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1e5+;
struct node{
int a,b,c,q,w;
//a,b,c表示三个维度,q记录这个操作是修改还是查询
//w表示这个是否有效(和q差不多,查询是不需要统计的,w=0;修改的w=1)
}v[maxn];
int n,m,cnt,tot,c[maxn],ans[maxn];
bool vis[maxn];
bool cmpx(const node &a,const node &b)
{
return a.a==b.a?(a.b==b.b?a.c<b.c:a.b<b.b):a.a<b.a;
}
bool cmpy(const node &a,const node &b)
{
return a.b==b.b?a.c<b.c:a.b<b.b;
}
int lowbit(int x)
{
return x&-x;
}
void add(int x,int ch)
{
while(x<=n)
{
c[x]+=ch;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=;
while(x)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void cdq(int l,int r)
{
if(l==r)
return;
int mid=l+r>>;
cdq(l,mid),cdq(mid+,r);
sort(v+l,v+mid+,cmpy),sort(v+mid+,v+r+,cmpy);
int i=l,j=mid+;
for(;j<=r;j++)
{
while(v[i].b<=v[j].b&&i<=mid)
add(v[i].c,v[i].w),i++;
if(v[j].q==)
ans[v[j].a]+=sum(n)-sum(v[j].c-);
//统计贡献到ans数组中
}
for(j=l;j<i;j++)
add(v[j].c,-v[j].w);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&v[i].q,&v[i].b,&v[i].c);
v[i].w=;
if(v[i].q==)
swap(v[i].b,v[i].c),v[i].w=,vis[i]=;
//标记每个操作是否需要输出
v[i].a=i;
}
cdq(,m);
//枚举每个操作,需要输出就输出
for(int i=;i<=m;i++)
if(vis[i])
printf("%d\n",ans[i]);
return ;
}

最新文章

  1. 使用mosh取代ssh提高n2n网络连接稳定性
  2. 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
  3. QT QToolBox类
  4. BZOJ1035 : [ZJOI2008]Risk
  5. [SHELL进阶] (转)最牛B的 Linux Shell 命令 (三)
  6. Java基础(33):StringBuilder的方法与应用实例(String相关类)
  7. 转:Jeff Atwood倾情推荐——程序员必读之书
  8. SQL Server 2012 BI 学习 第一天
  9. Windows 窗体最小化和隐藏的区别及恢复
  10. nodejs小问题:[1]express不是内部或外部命令
  11. live555源码研究(一)------live555MediaServer的启动过程和基本类图
  12. mkimage的-a 和 –c参数和内核引导
  13. 蓝牙-b
  14. c - 逆序/正序输出每位.
  15. Immutable 详解及 React 中实践
  16. 《JavaScript高级程序设计》读书笔记 ---变量
  17. Java堆栈内存总结
  18. 将sqlserver导出的csv数据导入到ubuntu和mac上的mysql
  19. Python 列表增删改查排序统计
  20. PyCharm+Scrapy爬取安居客楼盘信息

热门文章

  1. Leetcode 503. 下一个更大元素 II
  2. Laravel 限流中间件 throttle 简析
  3. python【数据类型:集合】
  4. state.sls与state.highstate区别
  5. SQL2005函数大全
  6. UITableViewCell在非Nib及Cell重用下设置CellStyle
  7. 解决spring中不同配置文件中存在name或者id相同的bean可能引起的问题
  8. redis连接池 jedis-2.9.0.jar+commons-pool2-2.4.2.jar
  9. 2017 清北济南考前刷题Day 6 morning
  10. eclipse 无法解析导入 javax.servlet 的解决方法