ACdream1157 Segments(CDQ分治 + 线段树)

题目这么说的:

进行如下3种类型操作:
1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]
2)C i (1-base) 删除第i条增加的线段,保证每条插入线段最多插入一次,且这次删除操作一定合法
3) Q L R(1 <= L <= R <= 1000000000) 查询目前存在的线段中有多少条线段完全包含[L,R]这个线段,线段X被线段Y完全包含即LY <= LX <= RX <= RY)

 

初学CDQ分治是看了Balkan OI 2007 Mokia那题的解法。两题类似,这题做法也不难想出:

  • 每次对操作的区间进行分治时,统计左半边更新操作对右半边查询操作的影响,影响的前提是更新操作的L小于等于查询操作的L且R要大于等于查询的R,这个通过一开始把L按从小到大排序,分治时便可从大到小遍历,同时用线段树维护R出现次数即可。

其实我一开始看错题,以为询问的是有几条线段包含在给定区间里面,写完后发现才样例过不了。。不过改一下就好了,然后1A感觉还是不错的。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 
  6 int tree[222222<<2],N,x,y;
  7 void update(int i,int j,int k){
  8     if(i==j){
  9         tree[k]+=y;
 10         return;
 11     }
 12     int mid=i+j>>1;
 13     if(x<=mid) update(i,mid,k<<1);
 14     else update(mid+1,j,k<<1|1);
 15     tree[k]=tree[k<<1]+tree[k<<1|1];
 16 }
 17 int query(int i,int j,int k){
 18     if(x<=i && j<=y){
 19         return tree[k];
 20     }
 21     int mid=i+j>>1,res=0;
 22     if(x<=mid) res+=query(i,mid,k<<1);
 23     if(y>mid) res+=query(mid+1,j,k<<1|1);
 24     return res;
 25 }
 26 
 27 struct Query{
 28     int idx,type,anspos;
 29     int x,y;
 30     bool operator<(const Query &q)const{
 31         return x<q.x;
 32     }
 33 }que[111111],tmp[111111];
 34 
 35 int ans[111111];
 36 
 37 void cdq(int l,int r){
 38     if(l>=r) return;
 39     int mid=l+r>>1,i=l,j=mid+1;
 40     for(int k=l; k<=r; ++k){
 41         if(que[k].idx<=mid) tmp[i++]=que[k];
 42         else tmp[j++]=que[k];
 43     }
 44     for(int k=l; k<=r; ++k) que[k]=tmp[k];
 45 
 46     for(i=mid+1,j=l; i<=r; ++i){
 47         if(que[i].type!=3) continue;
 48         for( ; j<=mid && que[j].x<=que[i].x; ++j){
 49             if(que[j].type==3) continue;
 50             x=que[j].y; y=(que[j].type==1) ? 1 : -1;
 51             update(0,N-1,1);
 52         }
 53         x=que[i].y; y=N-1;
 54         ans[que[i].anspos]+=query(0,N-1,1);
 55     }
 56     for(i=l; i<j; ++i){
 57         if(que[i].type==3) continue;
 58         x=que[i].y; y=(que[i].type==1) ? -1 : 1;
 59         update(0,N-1,1);
 60     }
 61     cdq(l,mid); cdq(mid+1,r);
 62 }
 63 
 64 int segx[111111],segy[111111],sn;
 65 int point[222222],pn;
 66 int main(){
 67     char op;
 68     int n,a,b;
 69     while(~scanf("%d",&n)){
 70         int cnt=0;
 71         memset(ans,0,sizeof(ans));
 72         sn=0; pn=0;
 73         for(int i=0; i<n; ++i){
 74             scanf(" %c",&op);
 75             if(op=='D'){
 76                 scanf("%d%d",&a,&b);
 77                 segx[++sn]=a; segy[sn]=b;
 78                 point[pn++]=a; point[pn++]=b;
 79                 que[i].idx=i; que[i].type=1; que[i].x=a; que[i].y=b;
 80             }else if(op=='C'){
 81                 scanf("%d",&a);
 82                 que[i].idx=i; que[i].type=2; que[i].x=segx[a]; que[i].y=segy[a];
 83             }else{
 84                 scanf("%d%d",&a,&b);
 85                 point[pn++]=a; point[pn++]=b;
 86                 que[i].idx=i; que[i].type=3; que[i].x=a; que[i].y=b; que[i].anspos=++cnt;
 87             }
 88         }
 89 
 90         sort(point,point+pn);
 91         pn=unique(point,point+pn)-point;
 92         for(N=1; N<pn; N<<=1);
 93 
 94         for(int i=0; i<n; ++i){
 95             que[i].x=lower_bound(point,point+pn,que[i].x)-point;
 96             que[i].y=lower_bound(point,point+pn,que[i].y)-point;
 97         }
 98 
 99         sort(que,que+n);
100         cdq(0,n-1);
101 
102         for(int i=1; i<=cnt; ++i){
103             printf("%d\n",ans[i]);
104         }
105     }
106     return 0;
107 }

 

转载于:https://www.cnblogs.com/WABoss/p/5701844.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过set方式注入的bean为null_Spring 注入集合

注入集合你已经看到了如何使用 value 属性来配置基本数据类型和在你的 bean 配置文件中使用标签的 ref属性来配置对象引用。这两种情况下处理奇异值传递给一个 bean。现在如果你想传递多个值&#xff0c;如 Java Collection 类型 List、Set、Map 和 Properties&#xff0c;应该…

Express与传统Web应用(服务端渲染、art-template模板引擎、配置静态资源托管)

一、服务端渲染相关的概念 什么是渲染&#xff1f; 例如对于我们前端开发者来说最常见的一种场景就是&#xff1a;请求后端接口数据&#xff0c;然后将数据通过模板绑定语法绑定到页面中&#xff0c;最终呈现给用户。 数据&#xff1a; 模板&#xff1a; 渲染&#xff08;…

税收分类编码2020_增值税开票系统你会吗?2020最新开票(金税盘版)图文教程详细版...

做会计的都或多或少的涉及到增值税&#xff0c;增值税也算是我们税务里面占比比较大的&#xff0c;那么增值税发票怎么开&#xff1f;增值税开票软件怎么操作&#xff1f;你都会吗&#xff1f;你曾经会是不是都忘记了&#xff1f;今天会计君和大家分享一份完整的增值税发票开票…

传统Web应用案例(采用服务端渲染)

一、准备静态页面 https://www.expressjs.com.cn/resources/middleware/errorhandler.html 静态页面&#xff1a; https://github.com/gothinkster/realworld-starter-kit/blob/master/FRONTEND_INSTRUCTIONS.md 二、提取控制器模块 三、用户注册的表单提交 3.1 同步方式提…

【miscellaneous】北斗短报文

北斗系统最大的特色在于有源定位和短报文特色服务&#xff0c;不止解决了中国有无卫星导航系统的问题&#xff0c;还能将短信和导航结合&#xff0c;是中国北斗卫星导航系统的独特发明&#xff0c;也是一大优势。 北斗的短报文功能&#xff0c;在国防、民生和应急救援等领域&am…

teamviewer无法建立连接原因未知_3389远程无法连接的5种原因分析

3389无法连接的5种原因分析1、服务器在内网。2、做了tcp/ip筛选。先执行下面cmd命令&#xff1a;cmd /c regedit -e c:1.reg HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpip&#xff0c;导出注册表里关于TCP/IP筛选的第一处cmd /c regedit -e c:2.reg HKEY_LOCAL_MACHINE…

Express框架实现原理

一、Express 源码的目录结构 首先&#xff0c;会去package.json项目&#xff08;包&#xff09;描述文件中寻找main属性的值&#xff0c; main&#xff1a;入口文件。这个main的值就是入口文件所在的路径。 这里并没有配置main属性的值&#xff0c;默认会去找index.js文件作为…

Java中的流程控制语句

if语句 if语句 : if&#xff08;条件表达式&#xff09;{ 执行语句&#xff1b; } if..else语句&#xff1a;       if&#xff08;条件表达式&#xff09;{ 执行语句&#xff1b; }else{ 执行语句&#xff1b; } if..else if..else语句 :…

nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

在互联网项目中&#xff0c;往往面临着高用户量、高并发的问题&#xff0c;造成服务器的压力非常大&#xff0c;特别是电商项目&#xff0c;以淘宝天猫为例&#xff0c;近年双十一的成交量屡创新高&#xff0c;可想而知淘宝天猫的服务器面临的并发量有多大&#xff0c;单一服务…

Nodejs之http模块详解

一、Web服务器 什么是Web服务器&#xff1f; 当应用程序&#xff08;客户端&#xff09;需要某一个资源时&#xff0c;可以向一个台服务器&#xff0c;通过Http请求获取到这个资源&#xff1b;提供资源的这个服务器&#xff0c;就是一个Web服务器&#xff1b; 目前有很多开源…

python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用

注&#xff1a;本文所指的YUV均为YUV420中的I420格式(最常见的一种)&#xff0c;其他格式不能用以下的代码。位深为8bit时&#xff0c;每个像素占用1字节&#xff0c;对应文件指针的fp.read(1)&#xff1b;位深为10bit时&#xff0c;每个像素占用2字节&#xff0c;对应文件指针…

linux的几个文本内容查看命令小结

1cat可以查看文本内容&#xff0c;tac就是反向查看文本内容&#xff0c;但是文本内容多了就全部显示不出来 2nl查看文本内容可以显示行号 3more翻页查看以及less翻页查看 more filename 按键使用&#xff1a; enter一行一行的查看 空格键 向下翻页查看 b或者Ctrl b向上翻页 f或…

iOS开源照片浏览器框架SGPhotoBrowser的设计与实现

简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器&#xff0c;在进一步优化后发布到了GitHub供大家使用&#xff0c;该框架虽然没有MWPhotoBrowser那么强大&#xff0c;但是使用起来更为方便&#xff0c;操作更符合常规相册习惯&#xff0c;自定义和修改源码也十分…

python公式计算器_Python-计算器

#计算器开发需求##1、实现加减乘除及拓号优先级解析#2、用户输入 1 - 2 * ( (60-30 (-40/5) * (9-2*5/3 7 /3*99/4*2998 10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后&#xff0c;#必须自己解析里面的(),,-,*,/符号和公式&#xff0c;运算后得出结果&#xff0c;结果必须…

网络流-SAP算法模板

node 表示当前讨论到的节点&#xff1b; flow 表示该节点被传入/要传出的流量&#xff1b;s, t, ver 分别是起点&#xff0c;终点&#xff0c;节点总数&#xff1b; SAP 函数返回增广路成功增大的流量&#xff1b; dlt 是当前已传出的流量&#xff1b; c 是残量。 1 const int …

python bp神经网络分类预测结果图_深度学习入门(四)BP神经网络——数字分类...

采用的是python中机器学习库sklearn图片数据sklearn简要介绍&#xff1a;#sklearn是Python中的一个机器学习包from sklearn.datasets import load_digits #载入Sklearnimport pylab as pldigitsload_digits()#载入数据集(都是数字图片)print(digits.data.shape)#一共有1797张图…

Koa框架

一、认识Koa 前面我们已经学习了express&#xff0c;另外一个非常流行的Node Web服务器框架就是Koa。 Koa官方的介绍&#xff1a; koa&#xff1a;next generation web framework for node.js&#xff1b;koa&#xff1a;node.js的下一代web框架&#xff1b; 事实上&#x…

SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

Can you answer these queries II 这是一道线段树的题目&#xff0c;维护历史版本&#xff0c;给出N(<100000)个数字(-100000<x<100000),要求求出在[l,r]区间里面的连续序列的最大值&#xff0c;并且重复的数字可以加入序列但是值不能再计算。 本题明显使用线段树,它只…

Node使用MySQL

一、认识mysql2 如何可以在Node的代码中执行SQL语句来&#xff0c;这里我们可以借助于两个库&#xff1a; mysql&#xff1a;最早的Node连接MySQL的数据库驱动&#xff1b;mysql2&#xff1a;在mysql的基础之上&#xff0c;进行了很多的优化、改进&#xff1b;目前相对来说&a…

java安装后在哪里打开_冷却塔声屏障安装后降噪效果不理想,原因出在哪里?...

现有冷却塔大部分产品都不能满足噪音环保标准&#xff0c;只有少数几种低吨位超低噪声型号的冷却塔可以满足少部分区域噪声标准要求。在一些商住混合区&#xff0c;冷却塔的出风口强烈的噪声和热气往往干扰附近居民不得安宁&#xff0c;所以冷却塔的噪声问题成为环境投诉的热点…