hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化
题意:
在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块。
题解:
块数=交点数+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 树状数组维护区间和/离散化的更多相关文章
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组
题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...
- HDU 1754 I hate it 树状数组维护区间最大值
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...
- 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 ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- hdu多校第九场 1006 (hdu6685) Rikka with Coin 暴力
题意: 有一些1毛,2毛,5毛,1块的钢镚,还有一些价格不同的商品,现在要求你带一些钢镚,以保证这些商品中任选一件都能正好用这些钢镚付账,问最少带多少钢镚. 题解: 对于最优解,1毛的钢镚最多带1个, ...
- hdu多校第九场 1005 (hdu6684) Rikka with Game 博弈
题意: 给一个小写字母组成的字符串,每回合轮到某人时,此人可以选择让某位+1(如果是z则变回a),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...
随机推荐
- jupyter|浏览器启动问题|“ImportError: DLL load failed: 找不到指定的模块”sqlite3
问题: 1.安装好Anconda3后,开始——>打开jupyter notebook时 默认浏览器无法启动 2.开始打开——>anaconda prompt 输入jupyter noteb ...
- 【SQL】Mysql常用sql语句记录
1.创建用户.赋予权限 CREATE DATABASE scadm DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 's ...
- 天梯L3-003. 社交集群——并查集
在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友.有部分兴趣相同的人们就形成了“社交集群”.现请你编写程序,找出所有的集群. 输入格式: 输入的第一行给出正整数N(&l ...
- ios移动输入框被软键盘遮挡
页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ...
- linux进阶之路(二):linux文件目录
Linux的目录结构: Linux文件系统采用级层式的目录结构,最上层是根目录"/",在此目录下再创建其他目录. 树状的文件目录.再Linux世界,一切皆文件. /etc 所有系统 ...
- Retrofit全攻略——进阶篇
最近事比较多,距离上次写文章已经过去了一个月了.上一篇文章Retrofit全攻略——基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 打印网络日志 在开发阶段,为了方便调试,我们需 ...
- 剑指offer——59二叉搜索树的第k大节点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...
- 剑指offer——45整数中1出现的次数
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- Servlet.init() for servlet [springmvc] threw exception
项目还没开始做,就碰到那么多问题.. 报错一:/oa/news/%E6%A0%8F%E7%9B%AE%E7%AE%A1%E7%90%86.jsp 1.一开始是jsp的页面名称为中文,改了 2.接着仍然 ...
- Editor REST Client
Editor REST Client 制作一个http请求 请求行 GET https://example.com/comments/1 HTTP/1.1 POST https://example.c ...