博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4533 线段树维护分段函数
阅读量:4972 次
发布时间:2019-06-12

本文共 3167 字,大约阅读时间需要 10 分钟。

更新:x1,y1,x2,y2不用long long 会wa。。

#include
#include
#include
#include
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<<2],B[maxn<<2],C[maxn<<2];//系数a,b,c在t[l,r]区间的取值inline void pushdown(int rt){ A[rt<<1]+=A[rt];A[rt<<1|1]+=A[rt]; B[rt<<1]+=B[rt];B[rt<<1|1]+=B[rt]; C[rt<<1]+=C[rt];C[rt<<1|1]+=C[rt]; A[rt]=B[rt]=C[rt]=0;}//区间【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>>1; 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>>1; 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)+1,maxn,1,maxn,1,0,0,(x2-x1)*(y2-y1)); //a为0的状态 if(x2
> T; while(T--){ memset(A,0,sizeof A); memset(B,0,sizeof B); memset(C,0,sizeof C); scanf("%d",&N); for(int i=1;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,1,maxn,1)); } } return 0;}

 

wa了,为什么呢

/**推公式就完事了要推出关于t的一元二次方程的值a,b,c关于t的函数,即t的分段函数*/#include
#include
#include
#include
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<<2],B[maxn<<2],C[maxn<<2];//系数a,b,c在t[l,r]区间的取值inline void pushdown(int rt){ A[rt<<1]+=A[rt];A[rt<<1|1]+=A[rt]; B[rt<<1]+=B[rt];B[rt<<1|1]+=B[rt]; C[rt<<1]+=C[rt];C[rt<<1|1]+=C[rt]; A[rt]=B[rt]=C[rt]=0;}//区间【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>>1; 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>>1; 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)+1,maxn,1,maxn,1,0,0,(x2-x1)*(y2-y1)); //a为0的状态 if(x2
> T; while(T--){ memset(A,0,sizeof A); memset(B,0,sizeof B); memset(C,0,sizeof C); scanf("%d",&N); for(int i=1;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,1,maxn,1)); } } return 0;}

 

转载于:https://www.cnblogs.com/zsben991126/p/9932617.html

你可能感兴趣的文章
关于toString()和String()要说几句话
查看>>
bzoj 3751[NOIP2014]解方程
查看>>
CSS(二) 文字样式属性,背景和列表
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
面试题三 替换空格
查看>>
LeetCode104.二叉树最大深度
查看>>
linux usb驱动——Gadget代码介绍
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>
bzoj 3160 万径人踪灭 —— FFT
查看>>
poj3254二进制放牛——状态压缩DP
查看>>
使用 ref 和 out 传递数组注意事项
查看>>
combobox和textbox中输入数据为非数字leave时的公用事件,只需要在控件的leave事件中选择本事件即可...
查看>>
纵越6省1市-重新启动
查看>>
hive安装以及hive on spark
查看>>
勇者无畏
查看>>
12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)
查看>>