hdu 6681 Rikka with Cake(扫描线)
题意:给你一个n*m的的矩形框 现在又k条射线 问这个矩形框会被分为多少个区域
思路:之前的想法是枚举边界然后线段树扫一遍计算一下矩形个数 复杂度果断不行 后面发现其实答案就是交点数+1 然后就用线段树上下扫两边
#include <bits/stdc++.h> using namespace std; const double pi = acos(-1.0); const int N = 1e5+7; const int inf = 0x3f3f3f3f; typedef long long ll; const ll mod = 1e7+9; struct tree{int l,r,v; }; tree t[N<<2]; struct node{int x,y,z; }up[N],down[N]; int xx[N]; bool cmp1(node a,node b){return a.y<b.y; //升 } bool cmp2(node a,node b){return a.y>b.y; //降 } void build(int p,int l,int r){t[p].l=l; t[p].r=r; t[p].v=0;if(l==r){return ;}int mid=(l+r)>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);t[p].v=t[p<<1].v+t[p<<1|1].v;} void update(int p,int x,int v){if(t[p].l==t[p].r&&t[p].l==x){t[p].v+=v;return ;}int mid=(t[p].l+t[p].r)>>1;if(x<=mid) update(p<<1,x,v);else update(p<<1|1,x,v);t[p].v=t[p<<1].v+t[p<<1|1].v; } ll query(int p,int l,int r){if(l<=t[p].l&&t[p].r<=r){return t[p].v;}int mid=(t[p].l+t[p].r)>>1;ll res=0;if(l<=mid) res+=query(p<<1,l,r);if(r>mid) res+=query(p<<1|1,l,r);return res; } int getpo(int x,int n){int po=lower_bound(xx,xx+n,x)-xx+1;return po; } int main(){ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int t; cin>>t;while(t--){int n,m,k; cin>>n>>m>>k;int cnt=0; int cntup=0; int cntdown=0;xx[cnt++]=1; xx[cnt++]=n-1;for(int i=1;i<=k;i++){int x,y; char ty;cin>>x>>y>>ty;xx[cnt++]=x;if(ty=='U'){up[cntup++]=node{x,y,1};}else if(ty=='D'){down[cntdown++]=node{x,y,1};}else if(ty=='L'){up[cntup++]=node{x,y,0};down[cntdown++]=node{x,y,0};}else{up[cntup++]=node{x,y,3};down[cntdown++]=node{x,y,3};}}sort(xx,xx+cnt);cnt=unique(xx,xx+cnt)-xx;sort(up,up+cntup,cmp1);sort(down,down+cntdown,cmp2);build(1,1,cnt);ll ans=1;for(int i=0;i<cntup;i++){if(up[i].z==1){int po=getpo(up[i].x,cnt);update(1,po,1);}else if(up[i].z==0){int l=getpo(1,cnt); int r=getpo(up[i].x,cnt);ans+=query(1,l,r);}else{int l=getpo(up[i].x,cnt); int r=getpo(n-1,cnt);ans+=query(1,l,r);}}build(1,1,cnt);for(int i=0;i<cntdown;i++){if(down[i].z==1){int po=getpo(down[i].x,cnt);update(1,po,1);}else if(down[i].z==0){int l=getpo(1,cnt); int r=getpo(down[i].x,cnt);ans+=query(1,l,r);}else{int l=getpo(down[i].x,cnt); int r=getpo(n-1,cnt);ans+=query(1,l,r);}}cout<<ans<<endl;} }
转载于:https://www.cnblogs.com/wmj6/p/11385131.html
hdu 6681 Rikka with Cake(扫描线)相关推荐
- HDU - 6681 Rikka with Cake
Rikka with Cake Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...
- HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...
- hdu - 6681 Rikka with Cake 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意:给定一个左下顶点为,右上顶点为的矩形,然后给你k条射线,每条射线的起点及方向(上下左右)都 ...
- HDU 6681 Rikka with Cake (可持久化线段树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意:一个n*m的矩形蛋糕,每次给一个点(x, y)和方向dir确定一条切的线,问最后把蛋糕分成了几 ...
- Rikka with Cake 【多校9 HDU 6681】【欧拉定理+扫描线】
题目链接 题目大意 有一个蛋糕是一个矩形,一个顶点在(0,0)另一个顶点在(n,m),现在对这个蛋糕进行切割,上下左右四个方向切,问最后这个蛋糕有多少块 解题思路 首先这个题的一个结论是:块数=交点数 ...
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- hdu 4454 Stealing a Cake(三分之二)
题目链接:hdu 4454 Stealing a Cake 题目大意:给定一个起始点s,一个圆形.一个矩形.如今从起点開始,移动到圆形再移动到矩形.求最短距离. 解题思路:在圆周上三分就可以.即对角度 ...
- hdu 6086 Rikka with String(AC自动机+状压dp)
题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...
- HDU - 6681
题目链接: HDU - 6681 显然这是一个平面图,我们可以根据欧拉公式:V - E + F = 2假设射线之间交点个数为x,有n条线段.那么V = 4 + x + 2*n , E = 4 + 2* ...
最新文章
- socket与TcpListener/TcpClient/UdpClient 的区别及联系
- [译] Bounds Check Elimination 边界检查消除
- C++表白代码---一颗心
- java get提交中文乱码_java get方法提交中文乱码问题
- 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条...
- Python基础之初识类和对象
- Modern CMake 翻译 2.1 变量和缓存
- java new Date()得到的时间和系统时间不一样
- 北邮2017计算机考研题,北邮通信考研2017年801真题.pdf
- sangerbox制作heapmap_ArcMap制作土地利用转移矩阵——图文详解版.pdf
- 2019 deecamp B题不完全的记录
- 软件测试黑马程序员课后答案_(完整版)软件测试技术基础课后习题答案
- 车载智能导航系统有没有采用嵌入式计算机,嵌入式车载导航系统的应用与研究...
- 女孩子的试炼html5魔塔
- ASCII出错的原因
- editor.md中markdown编辑器的实现
- 网络打印服务器存打印文件,网络打印机文件打印顺序问题
- 使用QGIS制作点密度专题图
- 视频图像侦查的有效途径和方法
- DDD学习(一)——通用语言