更新: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 线段树维护分段函数的更多相关文章

  1. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  2. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  3. 【BZOJ2164】采矿 树链剖分+线段树维护DP

    [BZOJ2164]采矿 Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n ...

  4. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

    [bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...

  5. 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数

    肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...

  6. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  7. [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】

    题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过  1018,即使它在 ProblemSet 的第一页 ...

  8. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  9. HDU3564 --- Another LIS (线段树维护最值问题)

    Another LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. ip更换

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  2. 从面向对象的角度重新认识JS世界

    一. 背景  距离上一篇JS文章已经20天,经重新总结发现,上一篇概况的有点浅显,适合初学js的入门了解,但对于已经学习js一段时间的人,或者是想系统的了解JS体系,接下来的文章可能会更有帮助. 该系 ...

  3. springboot系列之-logging

    配置文件以application.yml为例说明: Spring Boot默认的日志组件为Logback. 一. 日志配置参数: logging: file: # 日志文件,绝对路径或相对路径 pat ...

  4. stm32启动文件ld md hd cl vl xl分析及选择

    startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx, ...

  5. [C++]指针与引用(应用辨析)

    1.指针变量允许将一个整数经强制转换后赋值给指针变量    Eg:      float *fp;      fp = (float *)5000;//意义:将5000作为一个地址赋给指针变量fp 2 ...

  6. mysql数据库导出excel xml等格式文件

    http://jingyan.baidu.com/article/ac6a9a5e43a62e2b653eac83.html

  7. java工程师之旅-一个月工作心得

    不知不觉,在工作中已经度过一个月,距离上次写文章已经好几个月了,正好还有二十分钟下班,抽点时间来写一下博文,写一下心得. 首先说一下,在我工作之前,做了一个项目,和一个外校大四的学生做一个毕业设计,一 ...

  8. Shiro简介及入门(四)

    1.1     什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权 ...

  9. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  10. 深入理解linux内核v4l2框架之videobuf2【转】

    转自:https://blog.csdn.net/ramon1892/article/details/8444193 Videobuf2框架 1. 什么是videobuf2框架? 它是一个针对多媒体设 ...