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

题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来。

解法1:红黑树+思维+贪心

A:根据欧拉定理可以得出(具体参照题解),平面内有多少个交点,那么就有这么多个+1的平面被分割出来,所以这题目就是找点。
B:将U,D,L,R分开来存在四个结构体中,然后分类讨论U和L相交的点数,U和R相交的点数,D和L相交的点数,D和R相交的点数,最后相加再+1就是答案。
C:在讨论的时候。举例(U和L相交)。按着l[i]的x从小到大排序,u[i]的x从小到大排序,然后遍历l,找l[i]能和几条向上的线相交。我们可以知道相交必然意味着,u[j]的x比l[i]的小,同时我们要找在这几个中有几个u[j]的y坐标小于l[i].y,最后全部相加。这样就讨论完了一处情况。
D:关于上面C黄字的处理,利用红黑树,正好插入一个值与查询有几个小于的复杂都是log(n),然后不停插入,然后比较相加就完事了。

解法2:树状数组+思维+贪心

A:早上看了一下题解发现树状数组也能做,贴一个树状数组的解法吧,其实和上面的解法很像,就是把(D过程)红黑树改成树状数组就OK了。
B:两者代码的不同也很明显,我直接在我的红黑树上改了一下,具体可以看代码2。

闲话123:关于红黑树,我这里偷懒使用超级STL库来实现了。比赛的时候,想了很久主席树该怎么实现,写到吐血。。最后发现了有pb_ds这个神奇的东西,最后花了30分钟写题目,WA了三发。。。最后赛后刚把题目放出来就A了,真赛后三分钟A题,谢队友不杀。

PS:超级STL库只能在clion里面运行,辣鸡VS2019

解法1代码1:


#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include <functional>
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace __gnu_pbds;
using namespace std;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> rbtree;
typedef long long ll;
ll n,m,k;
const int mx = 3e5+7;
struct node
{ll x, y;
}u[mx],d[mx],l[mx],r[mx];
bool cmp(node a,node b) {return a.x < b.x;
}
int main (){ios_base::sync_with_stdio(false);rbtree stlnb;int t;cin >> t;while (t--) {cin >> n >> m >> k;ll cnt[6] = { 0 };for (int i = 1; i <= k; i++) {ll x, y; char s;cin>>x>>y>>s;if (s == 'U')u[++cnt[1]].x = x, u[cnt[1]].y = y;else if (s == 'D')d[++cnt[2]].x = x, d[cnt[2]].y = y;else if (s == 'L')l[++cnt[3]].x = x, l[cnt[3]].y = y;else if (s == 'R')r[++cnt[4]].x = x, r[cnt[4]].y = y;}sort(u + 1, u + 1 + cnt[1], cmp);sort(d + 1, d + 1 + cnt[2], cmp);sort(l + 1, l + 1 + cnt[3], cmp);sort(r + 1, r + 1 + cnt[4], cmp);ll sumn = 0;ll f = 1;for (int i = 1; i <= cnt[3]; i++) {for (int j = f; j <= cnt[1]; j++) {f = j+1;if (l[i].x >= u[j].x)stlnb.insert(u[j].y);else {f = j;break;}}sumn += stlnb.order_of_key(l[i].y);}stlnb.clear();f = cnt[1];for (int i = cnt[4]; i >= 1; i--) {for (int j = f; j >= 1; j--) {f = j-1;if (r[i].x <= u[j].x)stlnb.insert(u[j].y);else {f = j;break;}}sumn += stlnb.order_of_key(r[i].y);}stlnb.clear();f = 1;for (int i = 1; i <= cnt[3]; i++) {for (int j = f; j <= cnt[2]; j++) {f = j+1;if (l[i].x >= d[j].x)stlnb.insert(d[j].y);else {f = j;break;}}sumn += stlnb.size() - stlnb.order_of_key(l[i].y);}stlnb.clear();f = cnt[2];for (int i = cnt[4]; i >= 1; i--) {for (int j = f; j >= 1; j--) {f = j-1;if (r[i].x <= d[j].x)stlnb.insert(d[j].y);else {f = j;break;}}sumn += stlnb.size() -stlnb.order_of_key(r[i].y);}stlnb.clear();cout<<sumn+1<<endl;}return 0;
}

解法2代码:


#include <functional>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
ll n,m,k;
const int mx = 3e5+7;
const ll wa = 1e9+7;
struct node
{ll x, y;ll qx,qy;
}u[mx],d[mx],l[mx],r[mx];
ll ssx[mx],ssy[mx];
bool cmp(node a,node b) {return a.x < b.x;
}
int bit[mx];
int lowbit(int x)
{return x&(-x);
}
void add(int i,int x)
{while(i<=k){bit[i]+=x;i+=lowbit(i);}
}
void sub(int i,int x)
{while(i<=k){bit[i]-=x;i+=lowbit(i);}
}
int sum(int i)
{int s=0;while(i>0){s+=bit[i];i-=lowbit(i);}return s;
}int main (){ios_base::sync_with_stdio(false);
#ifdef ACM_LOCALfreopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
#endifint t;cin >> t;while (t--) {cin >> n >> m >> k;ll cnt[6] = { 0 };for (int i = 1; i <= k; i++) {ll x, y; char s;cin>>x>>y>>s;if (s == 'U')u[++cnt[1]].x = x, u[cnt[1]].y = y;else if (s == 'D')d[++cnt[2]].x = x, d[cnt[2]].y = y;else if (s == 'L')l[++cnt[3]].x = x, l[cnt[3]].y = y;else if (s == 'R')r[++cnt[4]].x = x, r[cnt[4]].y = y;ssx[i] = x;ssy[i] = y;}sort(ssx+1,ssx+1+k);sort(ssy+1,ssy+1+k);sort(u + 1, u + 1 + cnt[1], cmp);sort(d + 1, d + 1 + cnt[2], cmp);sort(l + 1, l + 1 + cnt[3], cmp);sort(r + 1, r + 1 + cnt[4], cmp);ll sumn = 0;ll f = 1;for (int i = 1; i <= cnt[3]; i++) {for (int j = f; j <= cnt[1]; j++) {f = j+1;if (l[i].x >= u[j].x) {int sr = lower_bound(ssy+1,ssy+1+k,u[j].y)-ssy;add(sr,1);//stlnb.insert(u[j].y);}else {f = j;break;}}//sumn += stlnb.order_of_key(l[i].y);sumn+=sum(lower_bound(ssy+1,ssy+1+k,l[i].y)-ssy);}//stlnb.clear();memset(bit,0,sizeof(bit));f = cnt[1];for (int i = cnt[4]; i >= 1; i--) {for (int j = f; j >= 1; j--) {f = j-1;if (r[i].x <= u[j].x)add(lower_bound(ssy+1,ssy+1+k,u[j].y)-ssy,1);//stlnb.insert(u[j].y);else {f = j;break;}}// sumn += stlnb.order_of_key(r[i].y);sumn += sum(lower_bound(ssy+1,ssy+1+k,r[i].y)-ssy);}//stlnb.clear();memset(bit,0,sizeof(bit));f = 1;ll ssr = 0;for (int i = 1; i <= cnt[3]; i++) {for (int j = f; j <= cnt[2]; j++) {f = j+1;if (l[i].x >= d[j].x)add(lower_bound(ssy+1,ssy+1+k,d[j].y)-ssy,1),ssr++;//stlnb.insert(d[j].y);else {f = j;break;}}//sumn += stlnb.size() - stlnb.order_of_key(l[i].y);sumn += ssr - sum(lower_bound(ssy+1,ssy+1+k,l[i].y)-ssy);}//stlnb.clear();memset(bit,0,sizeof(bit));ssr = 0;f = cnt[2];for (int i = cnt[4]; i >= 1; i--) {for (int j = f; j >= 1; j--) {f = j-1;if (r[i].x <= d[j].x)add(lower_bound(ssy+1,ssy+1+k,d[j].y)-ssy,1),ssr++;//stlnb.insert(d[j].y);else {f = j;break;}}//sumn += stlnb.size() -stlnb.order_of_key(r[i].y);sumn += ssr - sum(lower_bound(ssy+1,ssy+1+k,r[i].y)-ssy);;}//stlnb.clear();memset(bit,0,sizeof(bit));cout<<sumn+1<<endl;}return 0;
}

2019杭电多校第9场1002 Rikka with Cake HDU6681相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目链接:https://vjudge.net/problem/HDU-6656 题解: 维护一个前缀sum[i] : 从1到 i 的期望 第 i 到达 i + 1是:ai + (1 - r[i] / ...

  9. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

最新文章

  1. 将ImageVIew中的图片保存到本地相册中
  2. Centos 7 mysql Buffered warning: Changed limits: max_connections: 214 解决方法
  3. 业务逻辑中的测试总结(二)----业务与数据库交互需求的测试分解
  4. 遇到多个构造器参数时要考虑使用Builder
  5. url、base64、blob,三者之间的转化
  6. LVS之VS/NAT搭建web集群实战!!!
  7. django的orm指定字段名,表名 verbose_name_plural
  8. Kaggle新赛:通过音频识别鸟类和青蛙物种
  9. Spring Boot 学习之配置文件 application.yml
  10. php标签class,dede模板标签以及dedetag.class.php模板类使用方法
  11. jquery如何阻止子元素相应mouseout事件
  12. 深度学习(十八)基于R-CNN的物体检测-CVPR 2014
  13. 人大经济论坛SAS入门到高级教程
  14. JavaScript跨域请求
  15. 服务器系统怎么安全驱动精灵,服务器驱动精灵
  16. IDEA在创建包时如何把包分开实现自动分层
  17. PMO和项目经理必须掌握的战略制定与执行的思路和方法
  18. Bigemap中批量添加第三方在线地图教程
  19. c# 实现线程安全的List容器
  20. 电脑桌面计算机是英文,电脑桌面文件都变成了英文状态是怎么回事?

热门文章

  1. WinRar 去弹窗
  2. JMeter -Maven包引用问题的解决方法
  3. Kali linux 学习笔记(二十三)提权——几个好工具(WCE、fgdump、mimikatz) 2020.3.4
  4. Druid连接池源代码分析之五-编程知识点
  5. How to Read a Book: Chapter one The Activity and Art of Rading
  6. 1、第一列为姓名,第二列为语文成绩,第三列为数学成绩,编写一个程序,实现(1)按要求创建这样的文件 (2)读取文件中的信息并输出以下结果: ①分别求这个班数学和语文的平均分(保留1位小数)并输出
  7. 面向对象————继承、封装、多态、抽象类
  8. java毕业设计房屋合租系统Mybatis+系统+数据库+调试部署
  9. 笔记本电池的那些事儿
  10. 广东智慧高速大数据平台揭秘,值得学习!