2019杭电多校第九场 Rikka with Cake (hdu6681)
题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块
题解:显然,蛋糕的块数就是那么多线段的交点数 + 1。先离散,考虑向左切和向上切的,那么按照 y 的坐标递减排序,之后每一刀向上的切都是可以碰到之前向左切的线段的(如果之前的线段的x值比这刀向上的起点x大的话,图一话就很显然了)。之后向右切的和向上切的考虑的话,就是只要保证向右的起点x比向上的起点x小即可。同理讨论向右和向左分别和向下的情况。
贴一下丑陋的代码。。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<stack> #include<cstdlib> #include<queue> #include<set> #include<string.h> #include<vector> #include<deque> #include<map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-4 #define bug printf("*********\n") #define debug(x) cout<<#x"=["<<x<<"]" <<endl typedef long long LL; typedef long long ll; const int MAXN = 2e5 + 5; const int maxn = 2e5 + 10; const int mod = 998244353;int c[MAXN]; struct line {int x, y, id, sx, sy;//sx sy 为离散后坐标 }s[maxn]; bool cmp1(line a,line b) {return a.sy > b.sy; } bool cmp2(line a,line b) {return a.sy < b.sy; } int lowbit(int x) {return x & (-x); }void update(int p) {while (p <= MAXN) {c[p] ++;p += lowbit(p);} }int getsum(int p) {int res = 0;while(p) {res += c[p];p -= lowbit(p);}return res; }bool cmpx(const line& a, const line& b) {return a.x < b.x; } bool cmpy(const line& a, const line& b) {return a.y < b.y; } int arrx[maxn], arry[maxn]; int main() {int t;scanf("%d", &t);while (t--) {int n, m, k;char str[3];scanf("%d %d %d", &n, &m, &k);char dir[5];for (int i = 0; i < k; ++i) {scanf("%d %d %s", &s[i].x, &s[i].y, dir);arrx[i] = s[i].x;arry[i] = s[i].y;if (dir[0] == 'L')s[i].id = 1;else if (dir[0] == 'R')s[i].id = 2;else if (dir[0] == 'U')s[i].id = 3;else if (dir[0] == 'D')s[i].id = 4;}sort(s, s + k, cmpx);sort(arrx, arrx + k);n = unique(arrx, arrx + k) - arrx;int idx = 0;for (int i = 0; i < k; ++i) {if (s[i].x != arrx[idx])++idx;s[i].sx = idx + 1;}sort(s, s + k, cmpy);sort(arry, arry + k);m = unique(arry, arry + k) - arry;idx = 0;for (int i = 0; i < k; ++i) {if (s[i].y != arry[idx])++idx;s[i].sy = idx + 1;}sort(s, s + k, cmp1);LL sum = 1;memset(c, 0, sizeof c);for (int i = 0; i < k; i++) {if (s[i].id == 1)update(s[i].sx);if (s[i].id == 3)sum += (getsum(MAXN) - getsum(s[i].sx - 1));}memset(c, 0, sizeof c);for (int i = 0; i < k; i++) {if (s[i].id == 2)update(s[i].sx);if (s[i].id == 3)sum += getsum(s[i].sx);} // cout << sum << endl; sort(s, s + k, cmp2);// for(int i = 0; i < k; i++) // printf("%d %d\n",s[i].sx,s[i].sy); memset(c, 0, sizeof c);for (int i = 0; i < k; i++) {if (s[i].id == 1)update(s[i].sx);if (s[i].id == 4)sum += getsum(MAXN) - getsum(s[i].sx - 1);}memset(c, 0, sizeof c);for (int i = 0; i < k; i++) {if (s[i].id == 2)update(s[i].sx);if (s[i].id == 4)sum += getsum(s[i].sx);}printf("%lld\n", sum);} }
转载于:https://www.cnblogs.com/smallhester/p/11380370.html
2019杭电多校第九场 Rikka with Cake (hdu6681)相关推荐
- hdu 6681 2019 杭电多校九1002 Rikka with Cake(扫描线+树状数组)
题意:给一个矩形,在矩形内部有很多射线,这些射线的起点不会碰到矩形边界,问这些射线把矩形分成了几部分 题解:分成的区域数等于线段交点数加一,推导还是看jls的题解把 单说求交点个数的问题,我的方法就是 ...
- 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)
咕咕咕了太久 多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场-- 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...
- 2019杭电多校第一场 Operation HDU - 6579
题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...
- 2019杭电多校第一场 HDU 6599
题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...
- 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量
hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...
- 2019杭电多校第9场1002 Rikka with Cake HDU6681
2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...
- 2019年杭电多校第一场 1001题blank(DP)HDU6578
2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...
- 2019杭电多校 第七场 Kejin Player 6656(求期望值)
2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...
- 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)
[2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...
最新文章
- configure,pkg-config和PKG_CONFIG_PATH
- 云服务优缺点_什么是云服务器,云服务器的优缺点
- STM32开发 -- Git的详细使用
- Linux驱动编程 step-by-step (十一)
- 基于display:table的CSS布局
- 高精度加减乘法小程序
- anaconda安装python包_Anaconda:安装或更新 Python 第三方包
- c 传string 给java_JNI基础 将字符串传递给c,在c中拼接后返回给java
- Nexus 安装与配置
- 阿里云运行python项目_荐个人博客开发-06:Nginx + uWSGI + Django项目部署到阿里云服务器运行...
- Debian10: 安装iF.SVNAdmin
- mac tree命令
- 生活娱乐 WIFI机器人(某机器发烧友自己动手做一台)
- uipath sequence传递参数_湛江压铸模温机工作原理参数图
- 织梦列表页list标签调用支持flag属性方法
- css-绘制平行四边形
- 磁盘显示无法访问数据错误循环冗余检查的资料恢复法子
- HELIOS模拟平台介绍
- 【标签画像系列】标签体系建设方法论
- 回答完数据库连接池原理,面试官跪着求我入职他们公司