【HDOJ6681】Rikka with Cake(扫描线,线段树)
题意:给定一个n*m的平面,有k条垂直或平行的直线,问将平面分成了几个互不联通的部分
n,m<=1e9,k<=1e5
思路:

刻在DNA里的二维数点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
#define N 410000
#define M 4100000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
int da[]={-,,,};
int db[]={,,-,}; char ch[N][];
int t[N<<],x[N],y[N],c[N],p; struct arr1
{
int t,x,y;
}a[N]; bool cmp1(arr1 a,arr1 b)
{
return a.t<b.t;
} struct arr2
{
int x1,x2,y;
}b[N]; bool cmp2(arr2 a,arr2 b)
{
return a.y<b.y;
} int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} int lisan(int x)
{
int l=,r=p,last=;
while(l<=r)
{
int mid=(l+r)>>;
if(c[mid]>x) r=mid-;
if(c[mid]==x){last=mid; r=mid-;}
if(c[mid]<x) l=mid+;
}
return last;
} void build(int l,int r,int p)
{
t[p]=;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,ls);
build(mid+,r,rs);
} int query(int l,int r,int x,int y,int p)
{
if(x<=l&&r<=y) return t[p];
int mid=(l+r)>>;
int s=;
if(x<=mid) s+=query(l,mid,x,y,ls);
if(y>mid) s+=query(mid+,r,x,y,rs);
return s;
} void update(int l,int r,int x,int v,int p)
{
if(l==r)
{
t[p]+=v;
return;
}
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,v,ls);
else update(mid+,r,x,v,rs);
t[p]=t[ls]+t[rs];
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout); int cas;
scanf("%d",&cas); while(cas--)
{
int n=read(),m=read(),K=read();
ll ans=;
int m1=,m2=;
p=;
rep(i,,K)
{
x[i]=read(),y[i]=read();
scanf("%s",ch[i]+);
//if(ch[i][1]=='U'&&y[i]==) ans++;
//if(ch[i][1]=='R'&&x[i]==1) ans++;
c[++p]=x[i];
c[++p]=y[i];
}
//printf("ans=%I64d\n",ans);
c[++p]=n;
c[++p]=m;
c[++p]=;
sort(c+,c+p+);
rep(i,,K)
{
x[i]=lisan(x[i]);
y[i]=lisan(y[i]);
}
n=lisan(n),m=lisan(m);
rep(i,,K)
{
if(ch[i][]=='U')
{
m1++;
a[m1].t=y[i];
a[m1].x=x[i];
a[m1].y=;
//a[m1].x=x[i];
//a[m1].y1=y[i];
//a[m1].y2=m;
}
if(ch[i][]=='D')
{
m1++;
a[m1].t=;
a[m1].x=x[i];
a[m1].y=; m1++;
a[m1].t=y[i]+;
a[m1].x=x[i];
a[m1].y=-;
//a[m1].x=x[i];
//a[m1].y1=1;
//a[m1].y2=y[i];
}
if(ch[i][]=='L')
{
m2++;
b[m2].x1=;
b[m2].x2=x[i];
b[m2].y=y[i];
}
if(ch[i][]=='R')
{
m2++;
b[m2].x1=x[i];
b[m2].x2=n;
b[m2].y=y[i];
}
}
sort(a+,a+m1+,cmp1);
sort(b+,b+m2+,cmp2);
build(,p,);
int j1=,j2=;
rep(i,,p)
{
while(j1<=m1&&a[j1].t==i)
{
update(,p,a[j1].x,a[j1].y,);
j1++;
}
while(j2<=m2&&b[j2].y==i)
{
ans+=query(,p,b[j2].x1,b[j2].x2,);
j2++;
}
}
printf("%I64d\n",ans+); } return ;
}
【HDOJ6681】Rikka with Cake(扫描线,线段树)的更多相关文章
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- BZOJ 2584: [Wc2012]memory(扫描线+线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...
- HDU 5828 Rikka with Sequence (线段树)
Rikka with Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- zoj 3511 Cake Robbery(线段树)
problemCode=3511" target="_blank" style="">题目链接:zoj 3511 Cake Robbery 题目 ...
- [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】
题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...
随机推荐
- unittest框架扩展(基于代码驱动)自动化-下
一.数据驱动/代码驱动优缺点: 使用数据驱动的好处:- 代码复用率高.同一测试逻辑编写一次,可以被多条测试数据复用,提高了测试代码的复用率,同时可以提高测试脚本的编写效率.- 异常排查效率高.测试框架 ...
- http://blog.csdn.net/sdksdk0/article/details/50749326
http://blog.csdn.net/sdksdk0/article/details/50749326
- 类ThreadGroup
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 默认的情况下,所有的线程都属于主线程组. public final Thread ...
- beego 注解路由无效问题分析
问题描述:学习 beego 框架发现注解路由无效,除了不能找到路由外,未见任何异常. 问题解决:将配置文件中的 runmode 更改为 dev 模式. 问题分析: 如果没有设置过 runmode 不会 ...
- Vue Router:使用 props 将组件和路由解耦
在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...
- Python解决ModuleNotFoundError: No module named 'Queue'的问题
我们知道Python2和Python3两个版本之间,有些不兼容的地方,Python3中引入Queue会报出这个问题. Python3中要这样引入: import queue Python2中要这样引入 ...
- SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思 sql server 2005 2008
原文:http://www.cnblogs.com/ForFreeDom/archive/2009/10/16/1584680.html 在sqlserver2005或SQL2008数据库项目中,创建 ...
- 解决在data里面获取一个固定的img值
正常情况下在data里面申明,在img标签里面通过 :src应用就行了,但是如果是直接申明引用是没效果的: html: <div class="logo"> <i ...
- jupyter notebook使用时路径问题和kernel error,安装opencv
修改路径: 在C:\Users\Administrator\ .jupyter 目录下面只有一个“migrated”文件. 打开命令窗口(运行->cmd),进入python的Script目录下输 ...
- SCUT - 365 - 鹏哥的数字集合 - wqs二分 - 斜率优化dp
https://scut.online/p/365 https://www.luogu.org/problemnew/solution/P2365 写这篇的时候还不是很明白,看一下这个东西. http ...