题意:给出一个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)相关推荐

  1. hdu 6681 2019 杭电多校九1002 Rikka with Cake(扫描线+树状数组)

    题意:给一个矩形,在矩形内部有很多射线,这些射线的起点不会碰到矩形边界,问这些射线把矩形分成了几部分 题解:分成的区域数等于线段交点数加一,推导还是看jls的题解把 单说求交点个数的问题,我的方法就是 ...

  2. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场-- 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  3. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  4. 2019杭电多校第一场 HDU 6599

    题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...

  5. 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量

    hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...

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

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

  7. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

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

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

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

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

最新文章

  1. configure,pkg-config和PKG_CONFIG_PATH
  2. 云服务优缺点_什么是云服务器,云服务器的优缺点
  3. STM32开发 -- Git的详细使用
  4. Linux驱动编程 step-by-step (十一)
  5. 基于display:table的CSS布局
  6. 高精度加减乘法小程序
  7. anaconda安装python包_Anaconda:安装或更新 Python 第三方包
  8. c 传string 给java_JNI基础 将字符串传递给c,在c中拼接后返回给java
  9. Nexus 安装与配置
  10. 阿里云运行python项目_荐个人博客开发-06:Nginx + uWSGI + Django项目部署到阿里云服务器运行...
  11. Debian10: 安装iF.SVNAdmin
  12. mac tree命令
  13. 生活娱乐 WIFI机器人(某机器发烧友自己动手做一台)
  14. uipath sequence传递参数_湛江压铸模温机工作原理参数图
  15. 织梦列表页list标签调用支持flag属性方法
  16. css-绘制平行四边形
  17. 磁盘显示无法访问数据错误循环冗余检查的资料恢复法子
  18. HELIOS模拟平台介绍
  19. 【标签画像系列】标签体系建设方法论
  20. 回答完数据库连接池原理,面试官跪着求我入职他们公司

热门文章

  1. JavaScript学习(三十六)—移动的小球
  2. 女同志50岁退休可以早领养老金,55岁退休拿的养老金比较高,哪个更划算?
  3. 抱团股大跌,亏了谁的钱?
  4. iPhone8用的全面屏是什么屏幕?
  5. 华为p40为何没有搭载鸿蒙系统?
  6. Codeforces Round #661-C Boats Competition
  7. [leetcode] Reverse Integer 反转一个整数
  8. java ee 类切换_eclipse的工程类型切换
  9. 使用SQL Server ROWCOUNT
  10. 使用SQL Server进行时间点恢复