更新: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. Hadoop生态圈-CentOs7.5单机部署ClickHouse

    Hadoop生态圈-CentOs7.5单机部署ClickHouse 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 到了新的公司,认识了新的同事,生产环境也得你去适应新的集群环境,我 ...

  2. VirtualBox设置共享文件夹

    前提是已经正确安装增强工具,在安装增强工具时,没有faile的,全部done 1.添加共享文件夹(已经在lmg下创建过目录 /mnt/bdshare ) sudo mount -t vboxsf Ba ...

  3. MySQL 获得当前日期时间 函数【转】

    获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------- ...

  4. lucene教程【转】【补】

    现实流程 lucene 相关jar包 第一个:Lucene-core-4.0.0.jar, 其中包括了常用的文档,索引,搜索,存储等相关核心代码. 第二个:Lucene-analyzers-commo ...

  5. groovy.lang.GroovyRuntimeException: Conflicting module versions

    在运行groovy的junit方法时,报了这个错误: java.lang.ExceptionInInitializerError at org.codehaus.groovy.reflection.C ...

  6. Oracle——存储过程的使用

    为什么使用存储过程? 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 存储过程的定义: 存储过程(Sto ...

  7. C# 一般处理程序生成验证码

    using System; using System.Collections; using System.Data; using System.Linq; using System.Web; usin ...

  8. 实例详析ImageView的adjustViewBonds和scaleType

    android:adjustViewBounds是否保持宽高比.需要与maxWidth.MaxHeight一起使用,否则单独使用没有效果. 设置View的最大高度,单独使用无效,需要与setAdjus ...

  9. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  10. 【CXF】com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul

    在客户端生成代码之后测试出现错误: com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul ...