题意:

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

题解:

块数=交点数+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. git - Mac生成SSH key

    步骤1.检查是否已经存在SSH Key 打开电脑终端,输入以下命令: ls -al ~/.ssh 会出现两种情况 步骤2. 生成/设置SSH Key 继续上一步可能出现的情况 (1)情况一: 终端出现 ...

  2. Java——类的成员之五:内部类

    3.6 类的成员之五:内部类 3.6.1 静态内部类 ①静态内部类可以等同看做静态变量. ②内部类重要的作用:可以访问外部类中私有的数据. ③静态内部类可以直接访问外部类的静态数据,无法直接访问成员. ...

  3. Dart编程实例 - Dart 面向对象编程

    Dart编程实例 - Dart 面向对象编程 class TestClass { void disp() { print("Hello World"); } } void main ...

  4. Robot Framework:环境安装

    Windows Python2.7                                                前置条件:安装python2.7,下载地址:https://www.p ...

  5. luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]

    题目描述 小E 与小W 进行一项名为“E&D”游戏. 游戏的规则如下: 桌子上有2n 堆石子,编号为1..2n.其中,为了方便起见,我们将第2k-1 堆与第2k 堆 (1 ≤ k ≤ n)视为 ...

  6. jmeter 参数化3种

    一.利用函数助手获取参数值 选项->函数助手对话框 __CSVRead, __Random, 生成的函数字符串:${__Random(,,)}第一个参数为随机数的下限,第二个参数为随机数的上限, ...

  7. 比较器CompareTo的使用

    比较器CompareTo的使用 源码 package test; import java.text.SimpleDateFormat; import java.util.Date; public cl ...

  8. maven学习整理-基础知识

    1.maven认识 maven是一种自动化的构建工具,它主要解决的问题有: ①项目中的划分规则:原先我们用package或文件夹的形式来划分不同模块,导致在一个项目中存在大量的文件夹和包代码显得庞大: ...

  9. QinQ 技术解析

    目录 1. 概述 2. QinQ 的产生背景 3. QinQ的作用及原理 4. QinQ 技术的优点 5. QinQ 的报文结构 6. QinQ的实现方式 (1) 基本QinQ (2) 灵活QinQ ...

  10. hibernate 中createQuery与createSQLQuery两者区别

    hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回, ...