hdu4533 线段树维护分段函数
更新:x1,y1,x2,y2不用long long 会wa。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 200005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
ll A[maxn<<],B[maxn<<],C[maxn<<];//系数a,b,c在t[l,r]区间的取值 inline void pushdown(int rt){
A[rt<<]+=A[rt];A[rt<<|]+=A[rt];
B[rt<<]+=B[rt];B[rt<<|]+=B[rt];
C[rt<<]+=C[rt];C[rt<<|]+=C[rt];
A[rt]=B[rt]=C[rt]=;
}
//区间【L,R】的a,b,c更新
void update(int L,int R,int l,int r,int rt,ll a,ll b,ll c){
if(L<=l && R>=r){
A[rt]+=a;
B[rt]+=b;
C[rt]+=c;
return;
}
int m=l+r>>;
if(L<=m) update(L,R,lson,a,b,c);
if(R>m) update(L,R,rson,a,b,c);
}
//询问t小于等于pos的一元二次式的值
ll query(ll t,int l,int r,int rt){
if(l==r){
return A[rt]*t*t+B[rt]*t+C[rt];
}
pushdown(rt);
int m=l+r>>;
if(t<=m) return query(t,lson);
else return query(t,rson);
}
void solve(ll x1,ll y1,ll x2,ll y2){
//t如果大于max(x2,y2),那么就是覆盖了整块被子,此时a,b皆为0
update(max(x2,y2)+,maxn,,maxn,,,,(x2-x1)*(y2-y1));
//a为0的状态
if(x2<y2)//t先触碰到右边,那么t在max(x2,y1)+1到y2之间一直是线性增长的
update(max(x2,y1)+,y2,,maxn,,,x2-x1,y1*(x1-x2));
else //t先触碰到上边,那么t在max(x1,y2)+1到x2之间一直是线性增长的
update(max(x1,y2)+,x2,,maxn,,,-y1+y2,x1*(y1-y2));
//最后的情况,三个系数都不是0
if(max(x1,y1)<min(x2,y2))
update(max(x1,y1),min(x2,y2),,maxn,,,-(x1+y1),x1*y1);
}
int main(){
int T,N;
ll x,t;
ll x1,y1,x2,y2;
cin >> T;
while(T--){
memset(A,,sizeof A);
memset(B,,sizeof B);
memset(C,,sizeof C); scanf("%d",&N);
for(int i=;i<=N;i++){
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
solve(x1,y1,x2,y2);
}
scanf("%lld",&x);
while(x--){
scanf("%lld",&t);
printf("%lld\n",query(t,,maxn,));
}
}
return ;
}
wa了,为什么呢
/**
推公式就完事了
要推出关于t的一元二次方程的值a,b,c关于t的函数,即t的分段函数
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 200005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
ll A[maxn<<],B[maxn<<],C[maxn<<];//系数a,b,c在t[l,r]区间的取值 inline void pushdown(int rt){
A[rt<<]+=A[rt];A[rt<<|]+=A[rt];
B[rt<<]+=B[rt];B[rt<<|]+=B[rt];
C[rt<<]+=C[rt];C[rt<<|]+=C[rt];
A[rt]=B[rt]=C[rt]=;
}
//区间【L,R】的a,b,c更新
void update(int L,int R,int l,int r,int rt,ll a,ll b,ll c){
if(L<=l && R>=r){
A[rt]+=a;
B[rt]+=b;
C[rt]+=c;
return;
}
int m=l+r>>;
if(L<=m) update(L,R,lson,a,b,c);
if(R>m) update(L,R,rson,a,b,c);
}
//询问t小于等于pos的一元二次式的值
ll query(ll t,int l,int r,int rt){
if(l==r){
return A[rt]*t*t+B[rt]*t+C[rt];
}
pushdown(rt);
int m=l+r>>;
if(t<=m) return query(t,lson);
else return query(t,rson);
}
void solve(int x1,int y1,int x2,int y2){
//t如果大于max(x2,y2),那么就是覆盖了整块被子,此时a,b皆为0
update(max(x2,y2)+,maxn,,maxn,,,,(x2-x1)*(y2-y1));
//a为0的状态
if(x2<y2)//t先触碰到右边,那么t在max(x2,y1)+1到y2之间一直是线性增长的
update(max(x2,y1)+,y2,,maxn,,,x2-x1,y1*(x1-x2));
else //t先触碰到上边,那么t在max(x1,y2)+1到x2之间一直是线性增长的
update(max(x1,y2)+,x2,,maxn,,,-y1+y2,x1*(y1-y2));
//最后的情况,三个系数都不是0
if(max(x1,y1)<min(x2,y2))
update(max(x1,y1),min(x2,y2),,maxn,,,-(x1+y1),x1*y1);
}
int main(){
int T,N;
ll x,t;
int x1,y1,x2,y2;
cin >> T;
while(T--){
memset(A,,sizeof A);
memset(B,,sizeof B);
memset(C,,sizeof C); scanf("%d",&N);
for(int i=;i<=N;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
solve(x1,y1,x2,y2);
}
scanf("%lld",&x);
while(x--){
scanf("%lld",&t);
printf("%lld\n",query(t,,maxn,));
}
}
return ;
}
hdu4533 线段树维护分段函数的更多相关文章
- 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- 【BZOJ2164】采矿 树链剖分+线段树维护DP
[BZOJ2164]采矿 Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n ...
- 【bzoj3813】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
- 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数
肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- HDU3564 --- Another LIS (线段树维护最值问题)
Another LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- Xen的入门到放弃
Xen的入门到放弃 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Xen 是一个开放源代码虚拟机监视器(VMM),由剑桥大学的"Ina Pratt"和" ...
- idea_2018.1.5版本的激活使用
1:步骤help中找到register,然后按如下截图操作 注册码: K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibGljZW5zZWVOYW1lIj ...
- .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)
一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...
- Debian/Ubuntu 下网易云音乐无法由图标/列表 打开的解决方案
前言 本文为使用图标或快捷方式直接打开网易云音乐的一个从安装说起的到解决问题的简单教程 环境 debian 9.5 理论上使用apt包管理器的发行版均支持 源使用国内的源即可,无需特殊指定 安装网易云 ...
- JS在Html中使用JavaScript
一.三种方式 1)<script>元素 2)外部文件 3)文档模式 二.<script>元素 是向HTML页面插入JavaScript的主要方法:HTML 4.01为<s ...
- 四、移植 JZ2440 开发板
4.1 移植第一步 前面已经分析过了 .config 的过程,可以知道移植需要用到的文件: .config 文件 arch/arm/cpu 下的文件 board 目录 .config 文件是根据后面 ...
- android BroadcastReceiver组件简单的使用
1.清单文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=& ...
- JavaScript/HTML/CSS 之 iframe自适应高度
最高效简介的手段是利用CSS的内置calc函数: iframe{ height:calc(100vh - 50px) auto;//假令:html顶部有高度为50px的导航条 //min-height ...
- CentOS6.8安装配置sonarqube6.4
下载最新版本的sonar(现在改名叫sonarqube) https://www.sonarqube.org/downloads/ 我下载的版本是Sonarqube6.4 1 使用前需要 ...
- 表单之input的样式修改
修改placeholder字体颜色 html5为input添加了原生的占位符属性placeholder,高级浏览器都支持这个属性,例如: <input type="text" ...