HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6681
题意
在矩形区域内有k条射线,问这些射线将矩形分成了多少区域
题解
容易发现答案为所有射线交点个数+1。
按y从排序扫描矩形区域,动态开点线段树维护区间内竖线的个数,由于n,m范围较大,需要离散化处理,但这样比较麻烦且此题空间足够所以建议用动态开点。
1 #define bug(x) cout<<#x<<" is "<<x<<endl 2 #define IO std::ios::sync_with_stdio(0) 3 #include <bits/stdc++.h> 4 #define iter ::iterator 5 #define pa pair<int,ll> 6 using namespace std; 7 #define ll long long 8 #define mk make_pair 9 #define pb push_back 10 #define se second 11 #define fi first 12 ll mod=998244353; 13 const int N=1e5+5; 14 int T; 15 struct node{ 16 int x1,x2,y,z; 17 bool operator <(const node &t)const{ 18 if(y==t.y)return z<t.z; 19 return y<t.y; 20 } 21 }a[N]; 22 int cnt; 23 int sum[N*32],ls[N*32],rs[N*32]; 24 void up(int &o,int l,int r,int p,int v){ 25 if(!o)o=++cnt; 26 sum[o]+=v; 27 if(l==r)return; 28 int m=(l+r)/2; 29 if(p<=m)up(ls[o],l,m,p,v); 30 else up(rs[o],m+1,r,p,v); 31 } 32 int qu(int o,int l,int r,int ql,int qr){ 33 if(l>=ql&&r<=qr){ 34 return sum[o]; 35 } 36 int res=0; 37 int m=(l+r)/2; 38 if(ql<=m)res+=qu(ls[o],l,m,ql,qr); 39 if(qr>m)res+=qu(rs[o],m+1,r,ql,qr); 40 return res; 41 } 42 43 int main(){ 44 scanf("%d",&T); 45 while(T--){ 46 int n,m,k; 47 scanf("%d%d%d",&n,&m,&k); 48 int rt=0; 49 cnt=0; 50 for(int i=1;i<=k;i++){ 51 int x,y; 52 char s[10]; 53 scanf("%d%d%s",&x,&y,s); 54 char op=s[0]; 55 a[i].x1=a[i].x2=x; 56 a[i].y=y; 57 if(op=='U')a[i].z=1; 58 else if(op=='L'){ 59 a[i].z=2; 60 a[i].x1=1; 61 } 62 else if(op=='R'){ 63 a[i].z=2; 64 a[i].x2=n; 65 } 66 else{ 67 a[i].z=3; 68 up(rt,1,n,a[i].x1,1); 69 } 70 } 71 sort(a+1,a+1+k); 72 ll ans=1; 73 for(int i=1;i<=k;i++){ 74 if(a[i].z==1)up(rt,1,n,a[i].x1,1); 75 else if(a[i].z==2){ 76 ans+=qu(rt,1,n,a[i].x1,a[i].x2); 77 } 78 else up(rt,1,n,a[i].x1,-1); 79 } 80 printf("%lld\n",ans); 81 for(int i=1;i<=cnt;i++) 82 sum[i]=ls[i]=rs[i]=0; 83 } 84 }
转载于:https://www.cnblogs.com/ccsu-kid/p/11379483.html
HDU 6681 Rikka with Cake(扫描线、动态开点线段树)相关推荐
- hdu 6681 Rikka with Cake(扫描线)
题意:给你一个n*m的的矩形框 现在又k条射线 问这个矩形框会被分为多少个区域 思路:之前的想法是枚举边界然后线段树扫一遍计算一下矩形个数 复杂度果断不行 后面发现其实答案就是交点数+1 然后就用线段 ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- 动态开点线段树(多棵线段树)的内存分配与回收
前言 线段树,是一个很好用的能支持O(logn)区间操作的数据结构,随着做一些稍微烦一点的题,有时候会发现有些情况要开一个数组的线段树,更有甚者要树套树,而在很多情况下线段树就不能把所有点都开满了(否 ...
- CF1045G AI robots(动态开点线段树)
题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
- codeforces 915E - Physical Education Lessons 动态开点线段树
题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...
- 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...
- HDU - 6681 Rikka with Cake
Rikka with Cake Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...
最新文章
- 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合
- html 弹出层插件,jQuery弹出层插件(原创)
- android:configChanges属性总结
- (39)FPGA原语设计(IDDR)
- OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台
- java(16) - 泛型
- ASP.NET MVC Html.BeginForm用法1
- Oracle的diag文件可以删除,oracle11g rac diag/tnslsnr/pgis2/listener/alert 中的文件能删除吗...
- Oracle数据脱敏REPLACE()和SUBSTR()
- OSI网络七层协议详解
- php7.2 eregi,php – 函数eregi()已弃用
- 如果延迟退休势在必行,区块链如何助力“养老助老”?
- [译]如何打造以人为本的移动游戏
- 网易游戏互娱 笔试题2021.8.7 Java版
- ijkplayer系列1:ijkplayer介绍
- java综合知识点总结基础篇
- PS怎样把低像素图片变成高像素图片
- [网络应用]新迅雷会员皮肤开启+去除部分广告方法{推荐}
- 跨越华为职业生涯的沟沟坎坎
- 一个字符串吧大写字母转换为小写字母