题意:给一个矩形,在矩形内部有很多射线,这些射线的起点不会碰到矩形边界,问这些射线把矩形分成了几部分
题解:分成的区域数等于线段交点数加一,推导还是看jls的题解把
单说求交点个数的问题,我的方法就是扫描线+线段树/树状数组,但是树状数组不太了解,那就用树状数组做吧!
1e9的数据肯定先离散化
我把横线(平行于x轴的)当做枚举的对象,那些竖线(平行于y轴的)就记录他们的头尾,然后头设置值为1,尾设置值为-1,把横线记录左边的x右边的x和高度y,然后按y排序,扫描线扫到第一条横线的时候,把所有高度小于等于这条横线的竖线的起始点和结尾点都用树状数组单点更新,更新完毕就用树状数组查询横线包含的区间内所有值的和,就是这条线的交点个数
注意一下不是记录竖线结尾点设置为-1,而是记录比竖线结尾y值大1的点为-1,为了表示射线无线延长的特点,我在离散的时候还加入了0作为最小值,和max(m,n)作为最大值

#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <math.h>
#include <time.h>
#include <algorithm>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const ll mod=998244353;
const int maxn=1e6+100;int n,m,k;
int sum[maxn];struct Line
{int xl,xr,y;Line(){}Line(int xl,int xr,int y):xl(xl),xr(xr),y(y){}
};struct PO
{int x,y,f;PO(){}PO(int x,int y,int f):x(x),y(y),f(f){}
};struct nn
{int x,y;char a[2];
}o[maxn];vector<Line>H;
vector<PO>S;
vector<int>ls;int cmpPO(PO a,PO b)
{return a.y<b.y;
}int cmpL(Line a,Line b)
{return a.y<b.y;
}void update(int i,int tot,int c)
{for(;i<tot;i+=i&(-i))sum[i]+=c;
}int query(int i)
{int res=0;for(;i>0;i-=i&(-i))res+=sum[i];return res;
}int main() {//    freopen("in1.txt","r",stdin);
//    freopen("out.txt","w",stdout);int t;scanf("%d",&t);while(t--){H.clear();S.clear();ls.clear();memset(sum,0,sizeof sum);scanf("%d%d%d",&n,&m,&k);ls.push_back(max(n,m));ls.push_back(0);for(int i=1;i<=k;i++){scanf("%d%d%s",&o[i].x,&o[i].y,o[i].a);ls.push_back(o[i].x);ls.push_back(o[i].y);}sort(ls.begin(),ls.end());int tot=unique(ls.begin(),ls.end())-ls.begin();for(int i=1;i<=k;i++){int x=lower_bound(ls.begin(),ls.begin()+tot,o[i].x)-ls.begin();int y=lower_bound(ls.begin(),ls.begin()+tot,o[i].y)-ls.begin();if(o[i].a[0]=='U'){S.push_back(PO(x,y,1));S.push_back(PO(x,tot-1,-1));}else if(o[i].a[0]=='D'){S.push_back(PO(x,1,1));S.push_back(PO(x,y+1,-1));}else if(o[i].a[0]=='L'){H.push_back(Line(1,x,y));}else if(o[i].a[0]=='R'){H.push_back(Line(x,tot-1,y));}}sort(H.begin(),H.end(),cmpL);sort(S.begin(),S.end(),cmpPO);int ans=1,posP=0;for(int i=0;i<H.size();i++){while(posP<S.size() && S[posP].y<=H[i].y){update(S[posP].x,tot,S[posP].f);posP++;}ans+=query(H[i].xr)-query(H[i].xl-1);}printf("%d\n",ans);}
}

hdu 6681 2019 杭电多校九1002 Rikka with Cake(扫描线+树状数组)相关推荐

  1. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  2. hdu 6656 2019杭电多校第7场 期望题

    设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也可以用前缀和推导 设sum[i]=f[1]+f ...

  3. 2019牛客多校第七场 F Energy stones 树状数组+算贡献转化模拟

    Energy stones 题意 有n块石头,每块有初始能量E[i],每秒石头会增长能量L[i],石头的能量上限是C[i],现有m次时刻,每次会把[s[i],t[i]]的石头的能量吸干,问最后得到了多 ...

  4. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  5. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  6. 2022杭电多校九 1008-Shortest Path in GCD Graph(质因子+容斥)

    题目链接:杭电多校九 - Virtual Judge 题目: 样例输入: 6 2 4 5 3 6 样例输出: 1 1 2 2 题意:给定n个点的完全图,两个点之间的距离为他们的gcd,q次询问,每次询 ...

  7. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  8. 2019杭电多校第7场 K Kejin Player HDU 6656(数学推导)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题目大意:对于每一个等级,可以花ai元,有pi概率升级,如果升级失败就退到xi级,问从li级升到 ...

  9. 2019杭电多校第七场 Kejin Player HDU - 6656 (期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意:一种游戏,从i级升到i+1级,需要氪金a[i]RMB,有的概率成功,有1-的概率变成x[i ...

最新文章

  1. 离职那天!同龄的CTO悄悄私信我,他的年薪是我的10倍
  2. 计算机开不开机是什么原因是什么原因,电脑开不了机的原因,详细教您电脑开不了机怎么办...
  3. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?
  4. spring加载顺序
  5. MySQL 中 AUTO_INCREMENT 的“坑” --重复值问题
  6. Oracle interview
  7. python gridsearch_python gridsearch中的内存错误
  8. NDK 在 Android studio如何使用(Android studio NDK)
  9. “拼木头”算法挑战赛:禁忌搜索算法,用Javascript 跑
  10. 阿里广告技术最新突破!全链路联动——面向最终目标的全链路一致性建模
  11. Ural_1586. Threeprime Numbers (DP)
  12. 【luogu1816】忠(RMQ问题、线段树)
  13. 替罪羊树模板(封装版)-----转自知乎
  14. 房地产“产权分割制”是什么大杀器?
  15. 21种网页在线客服代码实例演示
  16. 曲线拟合最小二乘法对数c语言实现,基于最小二乘法的曲线拟合
  17. 柳州铁一中机器人_柳州铁一中学学子在2020年广西中小学电脑机器人竞赛中勇创佳绩...
  18. 苹果 M1 革了 Intel x86 的命?
  19. 福州三中 计算机竞赛,第一时间对话钟子谦!世界信息学奥赛金牌得主载誉归来!...
  20. Emacs快捷键 转自:http://www.engr.uvic.ca/~dastone/emacs-keys.html

热门文章

  1. abaqus遇到Tosca Configuration Error
  2. 专访易快报马春荃:建设业财税档一体化体系,是企业数字化转型的关键
  3. 计算机组成原理浮点规格化,规格化浮点数
  4. 有道云笔记不同步_有道云笔记笔记不能同步怎么办 有道云笔记无法同步解决教程...
  5. simulink抖动_基于Simulink的高速电磁阀动态响应分析
  6. 计算机软件大全学习,[计算机软件及应用]CAD入门学习大全.ppt
  7. 机器学习相关概念总结
  8. 面对流氓软件,是逃避还是反击?(连载一、流氓软件的危害)
  9. mac连接mysql出现 Access denied for user ‘Lampard‘@‘localhost‘ (using password: NO)
  10. Quartus 18 新手教程