这个题目,扫描线+玄学**

大概操作就是用个扫描线从上往下扫。

博主有点懒,就直接贴代码了,但是我还是给大家贴个比较详细的博客,除了代码都可以看wym的博客,我基本上就是按wym大佬的思路来的,当然,我的代码里也加了点注释,大家也请凑合着看吧。

Ps:

ycz:STL什么辣鸡,跑这么慢,你看手写splay多么快

wym:STL有啥不好啦,代码量短,如果手写splay还要各种操作,STL多简洁明了啊

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=3e5;
int Ans[N+10],last[N+10],cnt[N+10];
struct S1{
int x,y,t;
void join(int i){x=read(),y=read(),t=i;}
bool operator <(const S1 &a)const{return y!=a.y?y>a.y:x<a.x;}
}A[N*2+10];
struct S2{
//splay的维护需要按照x坐标为第一关键字,时间为第二关键字来维护
#define ls(x) tree[x][0]
#define rs(x) tree[x][1]
#define T(x) (rs(f[x])==x)
struct S3{
int x,t;
void clear(){x=t=0;}
void join(int a,int b){x=a,t=b;}
bool operator <(const S3 &a)const{return x!=a.x?x<a.x:t<a.t;}
}val[N*4+10],tmp;
int f[N*4+10],tree[N*4+10][2];
int root,len;
void clear(int x){ls(x)=rs(x)=f[x]=0,val[x].clear();}
void move(int x){
int fa=f[x],son=tree[x][T(x)^1];
tree[x][T(x)^1]=fa;
tree[fa][T(x)]=son;
if (son) f[son]=fa;
f[x]=f[fa];
if (f[x]) tree[f[x]][T(fa)]=x;
f[fa]=x;
}
void splay(int x){
while (f[x]){
if (f[f[x]]) T(x)==T(f[x])?move(f[x]):move(x);
move(x);
}
root=x;
}
void insert(int x,int t){
val[++len].join(x,t);
if (!root){
root=len;
return;
}
int i=root;
while (true){
if (val[len]<val[i]){
if (!ls(i)){f[ls(i)=len]=i;break;}
i=ls(i);
}else{
if (!rs(i)){f[rs(i)=len]=i;break;}
i=rs(i);
}
}
splay(len);
}
int get_pre(){
int x=ls(root);
while (rs(x)) x=rs(x);
return x;
}
int get_suc(){
int x=rs(root);
while (ls(x)) x=ls(x);
return x;
}
void Delete(int x){
splay(x);
if (!(ls(x)&&rs(x))){
f[root=ls(x)+rs(x)]=0;
clear(x);
return;
}
//删除必须找后继节点,这样才能保证根不变
int i=get_suc();
splay(i);
f[ls(i)=ls(x)]=i;
clear(x);
}
}Splay;
struct S4{
int f[N+10];
int find(int x){return f[x]?f[x]=find(f[x]):x;}
void merge(int x,int y){
x=find(x),y=find(y);
if (x!=y) f[x]=y,cnt[y]+=cnt[x];
//merge有顺序
}
}F;
int main(){
int n=read();
for (int i=1;i<=n;i++){
A[i].join(0);
(A[i].x<<=1)--;
(A[i].y<<=1)--;
}
int m=read();
for (int i=1;i<=m;i++){
A[i+n].join(i);
A[i+n].x<<=1;
A[i+n].y<<=1;
}
//消去0.5的影响,所以位移一位
sort(A+1,A+1+n+m);
for (int i=1;i<=n+m;i++){
Splay.insert(A[i].x,A[i].t);
//因为if语句里两个都要insert,虽然用处不同,但是我懒
if (A[i].t){
int suc=Splay.get_suc();
if (suc) last[A[i].t]=Splay.val[suc].t;
//记录右边的第一个时间比其大的点,方便并查集维护
while (true){
//保证根不变,一个个删掉前驱节点,类似于单调栈
int pre=Splay.get_pre();
if (!pre||Splay.val[pre].t<A[i].t) break;
Splay.Delete(pre);
}
}else{
//insert之后才能找到其后继,但是这个点不能加进去,所以直接删掉
int T=Splay.get_suc();
Splay.Delete(Splay.root);
if (T) cnt[Splay.val[T].t]++;
//初步统计答案
}
}
for (int i=m;i;i--){
Ans[i]=cnt[F.find(i)];
if (last[i]) F.merge(i,last[i]);
//merge操作有顺序,如果说last[i]的时间大于i的时间,加不加没有任何影响,为了方便,都加
}
for (int i=1;i<=m;i++) printf("%d\n",Ans[i]);
return 0;
}

[CERC2017]Buffalo Barricades的更多相关文章

  1. 【做题】CERC2017B. Buffalo Barricades——时间倒流

    原文链接 https://www.cnblogs.com/cly-none/p/CERC2017B.html 题意:在一个网格平面上,有\(n\)个点,其中第\(i\)个点在以\((x_i, y_i) ...

  2. 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)

    A. Assignment Algorithm 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string ...

  3. 2017 CERC

    2017 CERC Problem A:Assignment Algorithm 题目描述:按照规则安排在飞机上的座位. solution 模拟. 时间复杂度:\(O(nm)\) Problem B: ...

  4. Buffalo最佳实践

    本文将介绍Buffalo AJAX的两种配置的最佳实践,这个AJAX框架还是中国大师开发的,用起来估计是最方便.最简单的一个 准备工作:官网下载buffalo-2.0-bin,也可以下载buffalo ...

  5. 史上最全面的Buffalo WHR-G300N CH v2 刷OpenWrt教程

    Buffalo WHR-G300N CH v2 刷OpenWrt.有两种办法.一种是Windows下刷.一种是在linux下使用tftp刷.Buffalo WHR-G300N-CH v2的openwr ...

  6. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  7. [BZOJ5197] [CERC2017]Gambling Guide

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

  8. BZOJ5259/洛谷P4747: [Cerc2017]区间

    BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...

  9. [Buffalo]ASP.NET MVC路由映射

    Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Act ...

随机推荐

  1. 【TFS 2017 CI/CD系列 - 01】-- Agent篇

    一.环境要求: PowerShell 3.0 或者更高版本 VS2015或者更高版本 二.下载Agent: 用浏览器打开TFS,[Settings]--> [Agent Pools]--> ...

  2. Java时间戳转化为今天、昨天、明天(字符串格式)

    原文:http://www.open-open.com/code/view/1435301895825 时间戳,相信大家一定都不陌生,服务器经常会传回来时间戳,需要我们对时间戳进行处理.各种麻烦不断, ...

  3. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  4. linux 下的特殊文件 /dev/null 和 /de/zero

    生成一个100Mb的文件 : time dd of=2Gb.file if=/dev/zero  bs=1024 count=100000 ubuntu 下测试磁盘的读写性能: 测试写: time d ...

  5. Linux 网络工具

    1 nethogs nethogs 是一个免费的工具,当要查找哪个 PID (注:即 process identifier,进程 ID) 给你的网络流量带来了麻烦时,它是非常方便的.它按每个进程来分组 ...

  6. 运算符与类型转换 mogondb简介

    运算符与类型转换   1.运算符 (1)分类 算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符.其他运算符 >.算术运算符: 运算符 描述 + 把两个操作数相加 - 从第一个操作数中减去 ...

  7. malloc内存分配

    网上总结到的信息: (1) 静态分派:是在栈上分配,是由用户自己申请,是由操作系统自己释放的 动态分配:是由编译器分配,操作系统没有提供这样的机制,所以自己申请,必须自己删除! (2)你也要明确.栈的 ...

  8. css3动画入门transition、animation

    css3动画 transition.animation CSS3 transition demo <!DOCTYPE html> <html> <head> < ...

  9. DRF的认证,频率,权限

    1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...

  10. Responsive Nav

    引入文件 <!-- 引入这些文件至 <head> 中 --> <link rel="stylesheet" href="responsive ...