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 ...
随机推荐
- python 面向对象之多态
多态是什么? 用一句话来概括下,多态就是同一操作(方法)作用于不同的对象时,可以有不同的解释,产生不同的执行结果. #!/usr/bin/env python # -*- coding: utf-8 ...
- 拒绝了对对象 'Proc_LHDashBoard' (数据库 'jy',架构 'dbo')的 EXECUTE 权限。”
没有权限,在数据库里面开启权限.找到你那个访问的用户名,然后:
- Java中Jdom解析XML
JDOM与DOM类似,也是一组用于解析XML的API,它本身不是一个解析器,默认的它内置了Apache的Xerces解析器:JDOM与DOM不同的是,DOM是跨语言的一套API,Java世界中有很多D ...
- servlet dispatcher .forward(request, response); 进入其它servlet【原】
dispatcher .forward(request, response); 进入其它servlet 假如我们的web.xml配置如下 <servlet> <servlet-nam ...
- Python复习笔记(三)函数进阶
问题 1:在函数内部,针对参数使用 赋值语句,会不会影响调用函数时传递的 实参变量? —— 不会! 无论传递的参数是 可变 还是 不可变 只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量 ...
- CSS魔法(四)常用属性
元素的显示与隐藏 display.visibility.overflow 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display.visibility 和 overflow ...
- QLabel-标签控件的应用
label = QLabel('我是李明') #创建标签控件对象.参数:标签中要显示的文本 label.setText('我是明明') 修改标签控件显示的文本 self.label.text() 返回 ...
- SAP笔记---非-现存任务/请求XXX上的请求锁定
不管在SAP中的哪个系统在点击修改程序时都有可能出现以下图中的报错: 已找到解决办法,步骤如下: 1,se11中查看tlock表找到以上提到的请求号记录: 2,进入se16n,输入请求号,在事务代码输 ...
- C++ explicit 关键字
原文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造 ...
- 【自己开发】Jquery的loading插件
经过几周的时间的开发.我的loading插件终于上线了.这个插件功能为客户提供正在等待的信息,提供优良用户体验效果. 先看效果. 原理我内部实现我不讲,特别简单. 我说调用方式和api. 首先引用jq ...