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),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...
 
随机推荐
- 关于SQL中 =:的含义
			
一个很恶臭的例子来说明 =: 在sql语句中是做什么用的 int number= 114514: //众所周知野兽先辈的咆哮(世界级美声)是一串数字 var strSql = "select ...
 - javascript onclick事件可以调用两个方法吗?
			
答案是:可以的,onclick事件可以调用多个方法,每个方法之间用分号(:)隔开即可. onclick后面其实是可以写任何代码的,但是一般不建议这么写!! 例:onclick="fun1() ...
 - 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭
			
description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...
 - lua 线程
			
{ //https://blog.csdn.net/gulan0/article/details/50373276 }
 - js 邮箱,手机电话验证
			
var mail=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; var tel=/^(\d3,4|\d{3,4} ...
 - 【基础】Linux软件安装方法
			
linux中wget .apt-get.yum rpm区别 wget 类似于迅雷,是一种下载工具, 通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理 名字是Wo ...
 - (转载)js引擎的执行过程(二)
			
概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...
 - Hbase的读写流程
			
HBase读写流程 1.HBase读数据流程 HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在 ...
 - [NOIP模拟测试11] 题解
			
A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...
 - 关于Python中函数的使用
			
函数的概念 # 概念 # 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就是函数 # 作用 # 方便代码的重用 # 分解任务 ...