题意:

在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块。

题解:

块数=交点数+1

因为对于每个交点,唯一且不重复地对应着一块蛋糕。

就是产生这个交点的相互垂直的两刀,以及这两刀分别上次经过的刀痕或边缘,这四条边确定的长方形。

则问题转化成了求平面上,若干条平行于坐标轴的直线共有几个交点。

离散化后,记录横线的左右端点,竖线的上下端点,枚举横坐标,用树状数组记录这个横坐标上每一个点是否有横线经过。

求某条竖线与几条横线相交,就是在求区间和。

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int countx,county;
int tree[];
int lowbit(int x){
return x&(-x);
}
void add(int t,int p){//对x位置增加p;
while(t<=county){
tree[t]+=p;
t+=lowbit(t);
}
}
int getsum(int t){//1-x的和 ;
int res=;
while(t>){
res+=tree[t];
t=t-lowbit(t);
}
return res;
}
int x[],y[],xx[],yy[];
char c[];
vector<int> ll[],rr[];
int uu[],dd[];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
for(int i=;i<=k;i++){
scanf("%d %d %c",&x[i],&y[i],&c[i]);
xx[i]=x[i];
yy[i]=y[i];
}
sort(xx+,xx+k+);
sort(yy+,yy+k+);
countx=unique(xx+,xx++k)--xx;
county=unique(yy+,yy++k)--yy;
for(int i=;i<=countx;i++){
uu[i]=dd[i]=;
ll[i].clear();rr[i].clear();
}
for(int i=;i<=k;i++){
x[i]=lower_bound(xx+,xx+countx+,x[i])-xx;
y[i]=lower_bound(yy+,yy+county+,y[i])-yy;
if(c[i]=='U'){
uu[x[i]]=county;
dd[x[i]]=y[i];
}
if(c[i]=='D'){
uu[x[i]]=y[i];
dd[x[i]]=;
}
if(c[i]=='L'){
ll[].push_back(y[i]);
rr[x[i]].push_back(y[i]);
}
if(c[i]=='R'){
ll[x[i]].push_back(y[i]);
}
}
int ans=;
memset(tree,,sizeof tree);
for(int i=;i<=countx;i++){
for(int j=;j<ll[i].size();j++){
add(ll[i][j],);
}
// for(int i=1;i<=county;i++){
// printf("%d ",getsum(i)-getsum(i-1));
// }
// printf("\n");
// printf("%d %d\n",uu[i],dd[i]);
ans+=getsum(uu[i])-getsum(dd[i]-);
for(int j=;j<rr[i].size();j++){
add(rr[i][j],-);
}
}
printf("%d\n",ans+);
}
return ;
}

PS:离散化的时间复杂度是O(nlogn),为了保证常数效率和代码整洁,应使用sort,unique和lower_bound三个标准函数

hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化的更多相关文章

  1. 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)

    链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...

  2. hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组

    题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...

  3. HDU 1754 I hate it 树状数组维护区间最大值

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...

  4. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  5. hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...

  6. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  7. HDU 2838 (DP+树状数组维护带权排序)

    Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...

  8. hdu多校第九场 1006 (hdu6685) Rikka with Coin 暴力

    题意: 有一些1毛,2毛,5毛,1块的钢镚,还有一些价格不同的商品,现在要求你带一些钢镚,以保证这些商品中任选一件都能正好用这些钢镚付账,问最少带多少钢镚. 题解: 对于最优解,1毛的钢镚最多带1个, ...

  9. hdu多校第九场 1005 (hdu6684) Rikka with Game 博弈

    题意: 给一个小写字母组成的字符串,每回合轮到某人时,此人可以选择让某位+1(如果是z则变回a),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...

随机推荐

  1. springboot集成使用rabbitmq笔记(2.rabbitmq使用)

    使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.引入包 <dependencies> <dependency> <groupId& ...

  2. Java——面向对象知识总结

    面向对象的三条主线: 一.类及类的成分 1.类与类的关系: java程序是关注于类的设计. 类从代码的角度:并列关系! 从执行.设计的角度:关联关系.继承关系.聚合关系 class A{ } clas ...

  3. NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用

    关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...

  4. Openstack组件部署 — Networking service_Compute Node

    目录 目录 前文列表 安装组件 配置通用组件 配置自服务网络选项 配置Linux 桥接代理 配置Nova使用网络 完成安装 验证操作Execute following commands on Cont ...

  5. 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发

    本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...

  6. \t \r \n转义字符

    t \r \n都是转义字符,空格就是单纯的空格,输入时可以输入空格 \t 的意思是 横向跳到下一制表符位置 \r 的意思是 回车 \n 的意思是回车换行 所有的转义字符和所对应的意义: 转义字符 意义 ...

  7. 剑指offer——45整数中1出现的次数

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  8. Node篇

    [Node篇] Node.js中的stream(流)- 基础篇 1)什么是stream(流) 流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface). ...

  9. PCA降维-最大,最小方差解释

    转自http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html http://www.cnblogs.com/jerrylead/ ...

  10. 关于js的地址跳转

    一.基本的地址跳转 解说: window.open 弹出新窗口的命令:     page.html' 弹出窗口的文件名:    'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空'代 ...