【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解

  • 题意
  • 思路
  • 代码

题目来自于:HDU6681 Rikka with Cake

题意

题目的大意是给定你一个(n, m)的长方形,然后这个长方形里面有许多条射线,然后问这么多条射线把平面分割成了多少个区域,这些射线由起点加一个方向表示。
和这题题目像可是是不一样的题目 HDU 6665 Calabash and Landlord(题目大意是将两个矩形组合看能分成多少个区域)

思路

我们可以找规律并且猜想得出,其实分割的数量等于交点个数+1。然后我们可以用扫描线的方法(不会)来写这道题目,直接贴上标程:

代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int N=110000;
struct atom{int x,y;
};
vector<atom> A[4],x,y;
char ch[10];
int n,m,K;
void readpoint(){int x,y; scanf("%d%d%s",&x,&y,ch+1);int z=0;if (ch[1]=='L') z=0; else if (ch[1]=='R') z=1; else if (ch[1]=='D') z=2; else z=3;A[z].push_back((atom){x,y});
}
struct atom2{int x,y,pd;
};
vector<atom2>Q;
int B[N],len,C[N];
void add(int k1){for (;k1<=len;k1+=k1&(-k1)) C[k1]++;
}
int find(int k1){int ans=0;for (;k1;k1-=k1&(-k1)) ans+=C[k1];return ans;
}
int comparex(atom2 k1,atom2 k2){return k1.x<k2.x;
}
int comparey(atom2 k1,atom2 k2){return k1.y<k2.y;
}
long long getcross(){Q.clear();for (int i=0;i<x.size();i++) Q.push_back((atom2){x[i].x,x[i].y,0});for (int i=0;i<y.size();i++) Q.push_back((atom2){y[i].x,y[i].y,1});sort(Q.begin(),Q.end(),comparey); len=0;for (int i=0;i<Q.size();i++) Q[i].y=++len;sort(Q.begin(),Q.end(),comparex);//cout<<"getcross"<<endl;//for (int i=0;i<Q.size();i++) cout<<Q[i].x<<" "<<Q[i].y<<" "<<Q[i].pd<<endl;for (int i=1;i<=len;i++) C[i]=0;long long ans=0;int tot=0;for (int i=0;i<Q.size();i++)if (Q[i].pd==0) ans+=tot-find(Q[i].y); else {add(Q[i].y); ++tot;}return ans;
}
void solve(){scanf("%d%d%d",&n,&m,&K);for (int i=0;i<4;i++) A[i].clear();for (int i=1;i<=K;i++) readpoint();long long cross=0;x=A[0],y=A[2]; cross+=getcross();x=A[0],y=A[3];for (int i=0;i<x.size();i++) x[i].y=m-x[i].y;for (int i=0;i<y.size();i++) y[i].y=m-y[i].y;cross+=getcross();x=A[1]; y=A[2];for (int i=0;i<x.size();i++) x[i].x=n-x[i].x;for (int i=0;i<y.size();i++) y[i].x=n-y[i].x;cross+=getcross();x=A[1]; y=A[3];for (int i=0;i<x.size();i++) x[i].x=n-x[i].x,x[i].y=m-x[i].y;for (int i=0;i<y.size();i++) y[i].x=n-y[i].x,y[i].y=m-y[i].y;cross+=getcross();long long totV=cross+K*2+4;long long totE=4+K*2+cross*2;printf("%lld\n",totE-totV+1);
}
int main(){int t; scanf("%d",&t);for (;t;t--) solve();return 0;
}

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

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

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

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

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

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

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

  4. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

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

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

  6. 2019 杭电多校第六场 题解

    比赛记录 注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的 1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn 题解 1001 Salty Fi ...

  7. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)

    Problem Description 传送门 Farmer John keeps a website called 'FansBlog' .Everyday , there are many peo ...

  8. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)

    题目链接 题解: 用威尔逊定理变换,然后求逆元. 代码: #include <bits/stdc++.h> using namespace std; typedef long long l ...

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

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

最新文章

  1. div模拟textarea文本域轻松实现高度自适应——张鑫旭
  2. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
  3. qt向服务器传输文字_Qt 模拟 HTTP 表单提交文字或文件到服务器
  4. java keytool 代码_JDK keytool证书工具功能代码解析_java_脚本之家
  5. 二,zabbix与php的一些问题
  6. python vs java 搞笑视频_Python VS Java,谁能笑到最后?
  7. 计算机图形学试题a卷,计算机图形学复习题及答案
  8. c语言怎么写星星代码,C语言打印星星的问题
  9. promise链式调用_这一次,彻底弄懂 Promise
  10. 【笔记】HybridApp中使用Promise化的JS-Bridge
  11. 摩根溪创始人:特斯拉资产负债表有8%是比特币
  12. python输入三次密码程序_请教各位大神,为啥以下代码输入修改密码后连输错三次还是能输入...
  13. 什么是存储过程,存储过程的作用及好处
  14. 上个前端的交接文档 感觉真的不错
  15. Halcon教程三:了解基础算子
  16. 计算机笔记--【Java设计模式】
  17. 如何解决直播中黑屏、花屏、闪屏问题?10 分钟搞明白
  18. Android集成佳博热敏打印机打印小票商品名称换行问题
  19. java爬虫抓取nba_利用Python爬虫爬取NBA数据功能实例分享
  20. android 系统中的时区设置

热门文章

  1. 创维linux进入工厂模式,创维37E700S进入工厂模式方法
  2. 《画解数据结构》哈希表
  3. 一维振幅光栅的MATLAB仿真程序
  4. Android控件十二:导航栏Actionbar
  5. Micronel U51DL-024KK-N
  6. IOS开发学习---Fundation框架和UIKit框架
  7. 线程池源代码详解,参数详解
  8. 通信系统为什么用-48V电源
  9. Java斗地主小游戏代码
  10. 《恒盛策略》暴跌97%,2023年第四只面值退市股是它