题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6681

题意:给定一个n*m的蛋糕,再给出K个操作,每次都是从蛋糕的中间向四个方向中的一个切过去,问最后蛋糕被切成多少块。

数据范围:1≤T≤100,1≤n,m≤109,1≤K≤105,1≤xi<n,1≤yi<m,Di∈{'L','R','U','D'}

思路:我们发现切的蛋糕块数正好等于交点的个数+1,那么这道题就转换成求交点个数的题了,首先离散化,然后给定的向上和向右的操作按照x递增排序,开始对y边插入(先插入比向上的x小的)边访问建立树状数组。其余四种情况相同的方法处理就好(向下和向右,向上和向左,向下和向左)。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,t,k,tot=0;
int xx[N],yy[N];
struct p{int x,y,qx,qy;
}a1[N],a2[N],a3[N],a4[N];
struct BIT{ll tree[N];void init(int k){for(int i=1;i<=k;i++)tree[i]=0;}void update(int x,ll val){while(x<=k){tree[x]+=val;x+=x&-x;}}ll getsum(int x){ll ans=0;while(x){ans+=tree[x];x-=x&-x;}return ans;}
}bit[5];
bool cmp1(p aa,p bb){return aa.x<bb.x;
}
bool cmp2(p aa,p bb){return aa.x>bb.x;
}
int main(){scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=4;i++)bit[i].init(k+5);int x,y;char s[5];int cnt1=0,cnt2=0,cnt3=0,cnt4=0;for(int i=1;i<=k;i++){scanf("%d%d%s",&x,&y,s);if(s[0]=='U')a1[++cnt1].x=x,a1[cnt1].y=y;else if(s[0]=='L')a2[++cnt2].x=x,a2[cnt2].y=y;else if(s[0]=='R')a3[++cnt3].x=x,a3[cnt3].y=y;else if(s[0]=='D')a4[++cnt4].x=x,a4[cnt4].y=y;xx[i]=x,yy[i]=y;}sort(xx+1,xx+k+1);sort(yy+1,yy+k+1);for(int i=1;i<=cnt1;i++){a1[i].qx=lower_bound(xx+1,xx+k+1,a1[i].x)-xx;a1[i].qy=lower_bound(yy+1,yy+k+1,a1[i].y)-yy;}for(int i=1;i<=cnt2;i++){a2[i].qx=lower_bound(xx+1,xx+k+1,a2[i].x)-xx;a2[i].qy=lower_bound(yy+1,yy+k+1,a2[i].y)-yy;}for(int i=1;i<=cnt3;i++){a3[i].qx=lower_bound(xx+1,xx+k+1,a3[i].x)-xx;a3[i].qy=lower_bound(yy+1,yy+k+1,a3[i].y)-yy;}for(int i=1;i<=cnt4;i++){a4[i].qx=lower_bound(xx+1,xx+k+1,a4[i].x)-xx;a4[i].qy=lower_bound(yy+1,yy+k+1,a4[i].y)-yy;}sort(a1+1,a1+cnt1+1,cmp1);sort(a3+1,a3+cnt3+1,cmp1);sort(a4+1,a4+cnt4+1,cmp1);int ji=1;ll ans=0;for(int i=1;i<=cnt1;i++){for(int j=ji;j<=cnt3;j++){if(a3[j].qx<=a1[i].qx){bit[1].update(k+1-a3[j].qy,1);ji=j+1;}else break;}ans+=bit[1].getsum(k+1-a1[i].qy);}ji=1;for(int i=1;i<=cnt4;i++){for(int j=ji;j<=cnt3;j++){if(a3[j].qx<=a4[i].qx){bit[2].update(a3[j].qy,1);ji=j+1;}else break;}ans+=bit[2].getsum(a4[i].qy);}sort(a1+1,a1+cnt1+1,cmp2);sort(a2+1,a2+cnt2+1,cmp2);sort(a4+1,a4+cnt4+1,cmp2);ji=1;for(int i=1;i<=cnt1;i++){for(int j=ji;j<=cnt2;j++){if(a2[j].qx>=a1[i].qx){bit[3].update(k+1-a2[j].qy,1);ji=j+1;}else break;}ans+=bit[3].getsum(k+1-a1[i].qy);}ji=1;for(int i=1;i<=cnt4;i++){for(int j=ji;j<=cnt2;j++){if(a2[j].qx>=a4[i].qx){bit[4].update(a2[j].qy,1);ji=j+1;}else break;}ans+=bit[4].getsum(a4[i].qy);}printf("%lld\n",ans+1);}return 0;
}

2019hdu暑假多校训练赛第九场1002 Rikka with Cake hdu6681(树状数组)相关推荐

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

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

  2. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  3. 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)

    题意: 有n条柱子,高度为aia_iai​ ,我们有qqq次操作.在l到r的范围内砍yyy次,将所有的树高都砍为0,但是保证每一刀砍出来的长度(砍除树高于该高度的和)都是相同的.问你第xxx次砍的时候 ...

  4. 2019牛客暑假多校训练赛第七场C Governing sand(暴力)

    题目链接:https://ac.nowcoder.com/acm/contest/887/C 题意:给出n种树和n个h[i],c[i],p[i]代表每种树的高度,砍掉一棵的花费,树的个数.现在要求砍掉 ...

  5. 2019暑假多校训练第四场 | 部分题解

    有一道题目是原题emmm 朝鲜友人出的题目 可能英文题面会有些小问题 反正这场 我的贡献率≈0 题解链接: https://pan.baidu.com/s/1KRpqHaOdq2EL2-Kgbm2EX ...

  6. 2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638

    很多题解都是简单带过,所以打算自己写一篇,顺便也加深自己理解 前置知识:线段树.线段树维护最大字段和.二维坐标离散化 题解: 1.很容易想到我们需要枚举所有子矩阵来得到一个最大子矩阵,所以我们的任务是 ...

  7. 2019牛客网暑假多校训练第四场 K —number

    链接:https://ac.nowcoder.com/acm/contest/884/K 来源:牛客网 题目描述 300iq loves numbers who are multiple of 300 ...

  8. 2019牛客暑假多校训练 第四场 triples I 按位或运算

    链接:https://ac.nowcoder.com/acm/contest/884/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 石油大 Contest1777 - 2019年第二阶段我要变强个人训练赛第九场 I 热狗树(树形dp)

    题目描述 "我是番茄酱!" "我是黄芥末酱!" "合在一起就是--美式热狗上加的,那个!" 热狗树上的每个节点都涂有番茄酱或者黄芥末酱中的一 ...

最新文章

  1. 轻量级NLP工具Trankit开源,中文处理更精准,超越斯坦福Stanza,内存占用小45%
  2. Oracle - 数据库的实例、表空间、用户、表之间关系
  3. xctf php2,XCTF PHP2
  4. poj1740 A New Stone Game
  5. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信
  6. 强行删除文件 windwos10_如何彻底删除 Windows 当中的顽固文件?
  7. anaconda 安装 pytorch
  8. mysql异步复制参数_MySQL Replication(异步复制)基本原理
  9. SLS机器学习介绍(02):时序聚类建模
  10. 怎么将layui导入php中,layui怎么导入Excel
  11. 拉格朗日乘数法_拉格朗日乘数法介绍(不含证明)
  12. C++ 泛型模板进阶
  13. C++ 在一个类中用指针的形式申请堆内存构造出另一个类并访问私有成员变量(包括智能指针版本)
  14. 程序员编码能力差,竟是睡眠不足惹的祸?!
  15. es高亮搜索java_ES检索服务搜索结果高亮
  16. ff7重制版青魔法_《FF7重制》敌方招式获取方式与效果
  17. CodeForces 711B. Chris and Magic Square(水题)
  18. 你并没有那么去努力 所以你不能怪生活
  19. Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)
  20. windows server 2012 进程 出现大量桌面窗口管理器的 解决方法

热门文章

  1. 希捷7200.9酷鱼9代盘磁头+Bios损坏
  2. DVWA——sql盲注
  3. sota和fota区别_OTA还分FOTA和SOTA?前者才是真的“智能汽车”
  4. 基于Proteus8.9的8086+8255A
  5. discard connection
  6. Vue3学习笔记(二)——事件按键表单修饰符与表单
  7. 英语写作中“强调”的表达
  8. 指数加权平均(EWA)
  9. PRS多基因风险评分的几个算法
  10. 会员积分规则制定的基本要求