【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 的二维前缀 ...
随机推荐
- C#模块初始化注入
这个功能可以实现很多很有用的功能,比如程序集加密,Hook安装等.英文转载备忘. 原地址:https://www.coengoedegebure.com/module-initializers-i ...
- Java ——方法
本节重点思维导图 方法的定义 例题:1!+2!+3!+4!+…..+15!=? public class Demo { public static void main(String[] args) ...
- 【SD系列】SAP SD模块-公司间销售简介
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD模块-公司间销售简介 ...
- oracle--对象权限
sys用户查询ww用户创建的表(已经commited) select * from ww.wwTable; 普通用户lisi查询ww用户的表 grant select on wwTable to li ...
- MySQL-第十五篇使用连接池管理连接
1.数据库连接池的解决方案是: 当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池.每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不 ...
- 《剑指offer》面试题18 树的子结构 Java版
(输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于 ...
- [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6621 题意为求区间[l,r]内第k小|a[i]-p|的值. 可以二分答案,如果二分的值为x,则判断区间 ...
- IETester——用来测试IE5.5~IE11兼容性的工具
IETester是一款ie浏览器多版本测试工具,能很方便在ie5.5,ie6,ie7,ie8,ie9,ie10,ie11切换,只需安装一个软件,就可以解决N多ie浏览器的问题,满足大部分IE浏览器兼容 ...
- 高性能和可扩展的React-Redux
注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...
- PHP实现简单的万年历
<?php /*********************** *** 功能:万年历 *** *** 时间:2015/05/23 *** ***********************/ //1. ...