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(扫描线、动态开点线段树)相关推荐

  1. hdu 6681 Rikka with Cake(扫描线)

    题意:给你一个n*m的的矩形框 现在又k条射线 问这个矩形框会被分为多少个区域 思路:之前的想法是枚举边界然后线段树扫一遍计算一下矩形个数 复杂度果断不行 后面发现其实答案就是交点数+1 然后就用线段 ...

  2. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  3. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  4. 动态开点线段树(多棵线段树)的内存分配与回收

    前言 线段树,是一个很好用的能支持O(logn)区间操作的数据结构,随着做一些稍微烦一点的题,有时候会发现有些情况要开一个数组的线段树,更有甚者要树套树,而在很多情况下线段树就不能把所有点都开满了(否 ...

  5. CF1045G AI robots(动态开点线段树)

    题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...

  6. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

  7. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  8. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

  9. HDU - 6681 Rikka with Cake

    Rikka with Cake Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...

最新文章

  1. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合
  2. html 弹出层插件,jQuery弹出层插件(原创)
  3. android:configChanges属性总结
  4. (39)FPGA原语设计(IDDR)
  5. OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台
  6. java(16) - 泛型
  7. ASP.NET MVC Html.BeginForm用法1
  8. Oracle的diag文件可以删除,oracle11g rac diag/tnslsnr/pgis2/listener/alert 中的文件能删除吗...
  9. Oracle数据脱敏REPLACE()和SUBSTR()
  10. OSI网络七层协议详解
  11. php7.2 eregi,php – 函数eregi()已弃用
  12. 如果延迟退休势在必行,区块链如何助力“养老助老”?
  13. [译]如何打造以人为本的移动游戏
  14. 网易游戏互娱 笔试题2021.8.7 Java版
  15. ijkplayer系列1:ijkplayer介绍
  16. java综合知识点总结基础篇
  17. PS怎样把低像素图片变成高像素图片
  18. [网络应用]新迅雷会员皮肤开启+去除部分广告方法{推荐}
  19. 跨越华为职业生涯的沟沟坎坎
  20. 一个字符串吧大写字母转换为小写字母

热门文章

  1. golang环境安装异常【已解决】
  2. 黑马程序员15——OC之Fundation(了解常用结构体)
  3. ubuntu 安装软件(tar.gz / deb)
  4. redis命令之哈希表类型hset命令用法详情(返回值需要特别注意)
  5. css font-family的字体英文对照
  6. 手把手教你做复试简历~
  7. Vue可视化大屏(vue+datav)纯前端
  8. 保研经历--七月夏令营
  9. 深入浅出Java开发!java工程师短期培训
  10. 【热血传奇】 脚本开发之变量详解