HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
时间:2019-08-19
本文章向大家介绍HDU 6681 Rikka with Cake(扫描线、动态开点线段树),主要包括HDU 6681 Rikka with Cake(扫描线、动态开点线段树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
http://acm.hdu.edu.cn/showproblem.php?pid=6681
题意
在矩形区域内有k条射线,问这些射线将矩形分成了多少区域
题解
容易发现答案为所有射线交点个数。
按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
- 用贝叶斯判别分析方法预测股票涨跌
- 开发 | 在 Mac OS X 装不上 TensorFlow?看了这篇就会装
- 【答疑解惑】Java中的默认构造器和equals方法
- 原生JS | 当兔子遇到鸡
- 【Android基础】Activity的生命周期函数
- 七种常用回归技术,如何正确选择回归模型?
- 爬取拉勾网大数据相关岗位薪资信息存到excel,并作数据分析
- 【Windows编程】系列第五篇:GDI图形绘制
- 抓取链家官网北京房产信息并用python进行数据挖掘
- 用R语言做钻石价格预测
- 2分钟完成30*15页拉勾网职位需求关键词的抓取
- 【专业技术】Linux设备驱动第七篇:高级字符驱动操作之阻塞IO
- Python抓取上海各地区房价平均值
- R语言分析 老九门 到底谁是主角
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel csrf排除路由,禁止,关闭指定路由的例子
- thinkphp框架类库扩展操作示例
- Laravel ORM 数据model操作教程
- Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
- laravel 解决Eloquent ORM的save方法无法插入数据的问题
- laravel框架中控制器的创建和使用方法分析
- php 使用expat方式解析xml文件操作示例
- laravel利用中间件做防非法登录和权限控制示例
- laravel框架中表单请求类型和CSRF防护实例分析
- Yii框架getter与setter方法功能与用法分析
- laravel框架中视图的基本使用方法分析
- laravel5 Eloquent 实现事务方式
- Laravel 微信小程序后端搭建步骤详解
- Laravel使用swoole实现websocket主动消息推送的方法介绍
- Laravel框架Eloquent ORM删除数据操作示例