【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 的二维前缀 ...
 
随机推荐
- UDP信号驱动IO
			
SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...
 - shell命令传参数(参数长度不定)
			
脚本 sudo echo "[mysqlMaster<$1>]" >> /home/admin/hostrecord count= ];do >> ...
 - 红黑树的删除操作---以JDK源码为例
			
删除操作需要处理的情况: 1.删除的是红色节点,则删除节点并不影响红黑树的树高,无需处理. 2.删除的是黑色节点,则删除后,删除节点所在子树的黑高BH将减少1,需要进行调整. 节点标记: 正在处理的节 ...
 - MySQL练习与小结
			
当你专注一件事的时候,时间总是过得很快! foreign key 练习 -- 切换数据库 use stumgr -- 删除班级表 drop table t_class1 -- 创建一个班级表 crea ...
 - poj1305 Fermat vs. Pythagoras(勾股数)
			
题目传送门 题意: 设不定方程:x^2+y^2=z^2若正整数三元组(x,y,z)满足上述方程,则称为毕达哥拉斯三元组.若gcd(x,y,z)=1,则称为本原的毕达哥拉斯三元组. 定理:正整数x,y, ...
 - OtterTune源码解析
			
为了方便后面对ottertune进行魔(hu)改(gao),需要先搞清楚它的源码结构和pipeline OtterTune分为两大部分: server side: 包括一个MySQL数据库(用于存储调 ...
 - MIT 6.824学习笔记3   Go语言并发解析
			
之前看过一个go语言并发的介绍:https://www.cnblogs.com/pdev/p/10936485.html 但这个太简略啦.下面看点深入的 还记得https://www.cnblog ...
 - MVC的view页面内嵌C#语法发现路径被转码的解决方法
			
一,上视图代码,如下 console.log('@urlquery.ToString()'); console.log('@Html.Raw(urlquery.ToString())'); 二,显示结 ...
 - RequireJS 入门(二)
			
简介 如今最常用的JavaScript库之一是RequireJS.最近我参与的每个项目,都用到了RequireJS,或者是我向它们推荐了增加RequireJS.在这篇文章中,我将描述RequireJS ...
 - jsp页面随页面初始化加载js函数
			
1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"% ...