题意:给定一个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(扫描线,线段树)的更多相关文章

  1. HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  2. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  3. 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 ...

  4. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  5. hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

    题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...

  6. P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)

    题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...

  7. BZOJ 2584: [Wc2012]memory(扫描线+线段树)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...

  8. HDU 5828 Rikka with Sequence (线段树)

    Rikka with Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  9. zoj 3511 Cake Robbery(线段树)

    problemCode=3511" target="_blank" style="">题目链接:zoj 3511 Cake Robbery 题目 ...

  10. [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】

    题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...

随机推荐

  1. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_07 Collections工具类_3_Collections集合工具类的方法

    第二个参数传递了一个匿名内部类.结果就出现了下面的代码 源码里面有Compare方法,对比两个参数 要重写比较的方法 对对象进行排序 创建学生类.对学生类进行排序 重写Person的ToString方 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_5_Entry键值对对象

  3. Jmeter之ForEach控制器(配合正则表达式使用)

    在使用正则表达式提取响应信息时,存在部分信息有多个值,为了能使用所有的值,可以结合ForEach控制器使用. 一.界面显示 二.配置说明 1.名称:标识 2.注释:备注 3.输入变量前缀:是指需要提取 ...

  4. jdbc步骤:

    一.注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 二.建立连接(Connection) Connection conn = Dri ...

  5. Java课堂笔记(三):抽象类和接口

    在面向对象一文中,我们说了多态的一个功能是将“做什么”和“怎么做”分离开来,所采用的方法是将不同的具体实现放在不同的子类中,然后向接口中传入一个父类对象的引用.而本篇博客要说的内容则为接口(此处&qu ...

  6. levelDB SSTable-1

    创建sstable文件 了解了sstable文件的存储格式,以及Data Block的组织,下面就可以分析如何创建sstable文件了.相关代码在table_builder.h/.cc以及block_ ...

  7. SQL基本语法和书写格式

    插入 insert [into] 表名 [(列名列表)] values (值列表) insert into 新表名 (列名列表) select 列名列表 from 表名 select 表名.列名 in ...

  8. 2018 我要告诉你的 Vue 知识大全

    Vue ,React ,Angular 三大主流框架,最后我选择学习 Vue ,接触过 React ,自己感觉学习曲线有些陡峭,进而我选择了学习 Vue ,他的学习曲线平稳很多:不管选择什么框架,除了 ...

  9. LCD应用程序测试

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl ...

  10. python里的排序

    本篇文章主要讲: 自定义规则排序 多字段排序 开讲之前,先讲一些简单sorted()或者sort(),两者返回值不同!大家自行学习,不是本文的重点! sorted([5, 2, 3, 1, 4]) # ...