思路

set+并查集+玄学乱搞……
一道对STL的灵活运用题……
这个我也是看了Claris大神的博客才写出来的(%%%)
好了废话不多说,我们进入正题。
这道题其实就是求一个点为右上角能围住多少点(废话)
按照官方题解的思路,首先要用一个玄学扫描线维护。
既然要扫描线,那么肯定首先排序啊。
按y轴从大到小排序,扫描从上往下。
好了现在我们抛开被围的点,只注意栅栏的顶点。
首先,一个栅栏的顶点向左和下发出射线。
向下发出的射线在x轴上就是它本身的位置,只要在set中保留这个点就相当于保存了这条射线。
那么我们现在只考虑向左发出的射线。
若有下面两个点:

这里如果A加入的时间比D早,那么最终形成的就是这样:

如果A比D晚,则是这样:

可以看出,在上面的第二种情况下,A点要在D加入时从set中删去。(见代码中的“注释1”)
好了,这一种情况我们就解决了。
但是样例中3号点和4号点的情况呢?
可以看出,样例中是3号点包含4号点。
统计时,3号点的答案要加上4号点的答案。
但是,如果是1和3的情况,虽然3也包含1,但是并不需要把3号点加上1号点的答案。(“注释5”)
那么我们可以建立一个并查集。
在每次加入一个点的时候,记录一个在它右侧且比它的时间大的点;(见代码中的“注释2”)
最后倒序枚举每一个点,用并查集维护,这个点的答案就是这个点所属并查集的数量之和。(“注释3”)
然后将这个点与插入时在他右侧的点,加入一个并查集中。

最后一个问题:上面斜体字有啥用?
“倒序枚举”,是由于在上面统计时我们已经把所有的点加入到整个图中。
而现在需要分开统计,倒序删去每一条边,就相当于一个拓扑排序。(“注释4”)

代码

//STL有啥不好啦,代码量短,如果手写splay还要各种操作,STL多简洁明了啊
#include <cstdio>
#include <set>
#include <utility>
#include <algorithm>const int maxn=300000;struct point
{int x,y,t;
};typedef std::set<std::pair<int,int> > set_pair;
typedef std::set<std::pair<int,int> >::iterator set_pair_iterator;set_pair s;
int cnt[maxn+10],n,m,par[maxn+10],ans[maxn+10];
point p[(maxn<<1)+10];struct union_find_set
{int fa[maxn+10];int find(int x){return fa[x]?fa[x]=find(fa[x]):x;}inline int merge(int x,int y){x=find(x);y=find(y);if(x!=y){fa[x]=y;cnt[y]+=cnt[x];}return 0;}
};union_find_set f;bool cmp(const point &a,const point &b)
{if(a.y==b.y){return a.x<b.x;}return a.y>b.y;
}int main()
{scanf("%d",&n);for(register int i=1; i<=n; ++i){scanf("%d%d",&p[i].x,&p[i].y);p[i].x=(p[i].x<<1)-1;p[i].y=(p[i].y<<1)-1;p[i].t=0;}scanf("%d",&m);for(register int i=1; i<=m; ++i){scanf("%d%d",&p[n+i].x,&p[n+i].y);p[n+i].x<<=1;p[n+i].y<<=1;p[n+i].t=i;}std::sort(p+1,p+n+m+1,cmp);for(register int i=1; i<=n+m; ++i){std::pair<int,int> q=std::make_pair(p[i].x,p[i].t);if(p[i].t){s.insert(q);set_pair_iterator now=s.find(q);if((++now)!=s.end()){par[p[i].t]=now->second;//注释2:记录在它右侧的点}while(1)//注释1:这个while循环就是在进行这个步骤{now=s.find(q);if(now==s.begin()){break;}if((--now)->second<p[i].t){break;}s.erase(now);}}else{set_pair_iterator it=s.lower_bound(q);if(it!=s.end()){++cnt[it->second];}}}for(register int i=m; i; --i)//注释3:这个for循环就是在进行这样的步骤//注释4:注意倒序枚举{ans[i]=cnt[f.find(i)];if(par[i]){f.merge(i,par[i]);//注释5:这里并没有特殊处理出上面的情况//因为如果par的时间大于i的时间,那么加入同一并查集了并不影响结果}}for(register int i=1; i<=m; ++i){printf("%d\n",ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376224.html

[CERC2017]Buffalo Barricades相关推荐

  1. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  2. java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流

    现代时尚的办公环境是怎样的?ADSL.无线网络.笔记本.还有咖啡,惬意地被沙发包裹起来,自由自在地网上冲浪--:当然仅仅有这些还是不够,我们需要视频会议.需要网络下载.甚至打印.扫描,还有需要随时随地 ...

  3. 布法罗计算机专业怎么样,布法罗大学 University at Buffalo

    布法罗大学(University at Buffalo)--即纽约州立大学水牛城分校成立于1846年,前身是一所小型私人医学院,经过百年的发展,逐渐壮大成一所公立的综合性研究大学,培养了来自全国和世界 ...

  4. u2硬盘测试软件,Buffalo HD-PET320U2移动硬盘检测报告

    [IT168 厂商资讯]近期,笔者对Buffalo HD-PET320U2移动硬盘,进行了一个评测,报告如下 时间:2010-04-16 09:32 型号:HD-PET320U2/BL-AP 序列号: ...

  5. 网络共享存储器巴法罗BUFFALO的LS-WXL/E出现EM模式的解决方案

    Buffalo LS-WXL/E 资料来源:http://www.vodd.cn/index.php/post/19.html 开启nas 后报 12 错误,一查是一块盘坏了,把nas的前面板打开,果 ...

  6. [BZOJ5197] [CERC2017]Gambling Guide

    [BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...

  7. 无线路由Buffalo G300N V2 CH小测

    硬件是日本的,固件是美国的.产品是日本的,钓鱼岛是中国的! Buffalo是一家正宗日资企业,在这个敏感时期本来还是准备用华硕的RT-N10+,但是公司采购华硕的RT-N10+/N12+/N13U的价 ...

  8. Buffalo G450h 变砖刷机

    G450刷openwrt的时候,采用mtd刷,发现变砖.红色diag灯一直闪烁,无法开机进入系统. 遇到这种情况有两种处理办法:1.采用tftp刷机:2.采用ttl线刷 建议采用tftp刷,该方法最简 ...

  9. 【Xbox360】 Party Buffalo Xbox360 硬盘读写程序 使用教程

    更新日志 20220610 新增硬盘退出提醒. Party Buffalo Xbox360 硬盘读写程序 使用教程 由于 Xbox360 硬盘格式 Windows 系统不能直接读取,因此必须使用 Pa ...

最新文章

  1. 移动端省际联动插件mobiscroll
  2. idea从gitlab拉项目到本地_Git入门-基础命令,用github免费服务器域名部署小项目...
  3. BAT 批处理脚本教程
  4. 每日一言学做人,古之学问,博大精深
  5. 深入理解C++ 虚函数表
  6. 技能树 Web前端/php/JavaWeb/数据库
  7. mysql自动安装脚本
  8. 西安计算机二级12月,2017年12月计算机二级MS Office习题答案(一)
  9. laravel的表单验证(下面有些信息未验证,转的)
  10. 【zoj1004 vector stack STL】anagrams by stack
  11. win10怎么更新显卡驱动_更新Win10设备驱动程序的4种方法,方便实用,你知道几种...
  12. 解决Windows11能登录QQ微信,但不可以使用浏览器上网
  13. AutoCAD Civil 3D-部件-部件编辑器自定义边坡与材质
  14. 删除打印机重新安装驱动
  15. Swift 语言概览
  16. NPN和PNP开关电路使用
  17. 2019前端工程师的自检清单
  18. 去千户苗寨为什么说不要为了节约钱住普通客栈,而要住商务酒店
  19. 利用栈的基本操作,将十进制数转换为八进制数
  20. 数商云采购系统解决方案 | 建筑工程行业采购管理之招标业务场景应用

热门文章

  1. 一步一步学Ruby(九):Ruby正则表达式(上)
  2. SQL Server 之AdventureWorks 2008 安
  3. Sencha Touch 2 DataView / List 分页
  4. squid在企业网中的应用
  5. SNMP在windows linux router上的配置笔记
  6. [转]Linux文件搜索
  7. Visual Studio 2008 和 .NET 3.5 发布了
  8. 自定义异常类: 运行期间跟编译期间的区别
  9. 使用Command模式实现撤销机制 (Code Project 精选翻译)
  10. 使用python爬取教程生成PDF