博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ DCEPC11I
阅读量:5280 次
发布时间:2019-06-14

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

题目大意:

就是给定一段区间令其中的数增加一个递增序列(也就是说第一个+1,第二个+2.。。。。)

询问操作是区间的和

 

这里的查询很简单,但是对于添加递增序列入区间就比较搞脑子了

我们需要一个add[]作为区间的首个数字增加的值,del[]表示等差数列的公差,因为你每次添加进入一个等差数列,是可以叠加的但公差变为了del[ls]+=del[o]

 

这里主要是pushdown函数的写法

我们要用到等差公式的求和:S =a*n+n(n-1)*d/2

void push_down(int o,int x,int y)

{
    int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;
    if(add[o]||del[o]){
        int t1=mid-x+1,t2=y-mid;
        LL a2=add[o]+t1*del[o];
        sum[ls]+=add[o]*t1+t1*(t1-1)*del[o]/2;
        sum[rs]+=a2*t2+t2*(t2-1)*del[o]/2;
        add[ls]+=add[o],add[rs]+=a2;
        del[ls]+=del[o],del[rs]+=del[o];
        add[o]=del[o]=0;
    }
}

总代码如下所示:

1 #include 
2 #include
3 using namespace std; 4 #define L ls,x,mid 5 #define R rs,mid+1,y 6 #define LL long long 7 #define N 100010 8 LL sum[N<<2],add[N<<2]; 9 int del[N<<2];10 void push_up(int o)11 {12 sum[o]=sum[o<<1]+sum[o<<1|1];13 }14 void push_down(int o,int x,int y)15 {16 int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;17 if(add[o]||del[o]){18 int t1=mid-x+1,t2=y-mid;19 LL a2=add[o]+t1*del[o];20 sum[ls]+=add[o]*t1+t1*(t1-1)*del[o]/2;21 sum[rs]+=a2*t2+t2*(t2-1)*del[o]/2;22 add[ls]+=add[o],add[rs]+=a2;23 del[ls]+=del[o],del[rs]+=del[o];24 add[o]=del[o]=0;25 }26 }27 void build(int o,int x,int y)28 {29 int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;30 sum[o]=del[o]=add[o]=0;31 if(x==y) return;32 build(L);33 build(R);34 }35 void update(int o,int x,int y,int s,int t)36 {37 int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;38 if(x>=s&&y<=t){39 add[o]+=x-s+1;40 sum[o]+=(x-s+1)*(y-x+1)+(y-x+1)*(y-x)/2;41 del[o]++;42 return;43 }44 push_down(o,x,y);45 if(mid>=s) update(L,s,t);46 if(mid
=s&&y<=t){53 ans+=sum[o];54 return;55 }56 push_down(o,x,y);57 if(mid>=s) query(L,s,t,ans);58 if(mid

 

转载于:https://www.cnblogs.com/CSU3901130321/p/3901222.html

你可能感兴趣的文章
HDU 2612 Find a way
查看>>
Android SERVICE后台服务进程的自启动和保持
查看>>
POJ 3177——Redundant Paths——————【加边形成边双连通图】
查看>>
RabbitMQ详解(一)------简介与安装
查看>>
matlab常见使用
查看>>
AC日记——[SCOI2010]幸运数字 bzoj 1853
查看>>
三种Hash算法对比以及秒传原理.
查看>>
上手d3js
查看>>
vue中引入路由,如果你懒得写那么
查看>>
springboot跑定时任务
查看>>
git 常见报错
查看>>
AngularJS Select(选择框)
查看>>
【java】JDK、JRE、JVM的关系
查看>>
Oracle集群(RAC)时间同步(ntp和CTSS)
查看>>
实时读取进度条当前进度
查看>>
洛谷P1219八皇后(正向暴力递归dfs+回溯更新,全排列类型题)
查看>>
IIS常见500错误解决方案
查看>>
SQLAlchemy
查看>>
得到python某个模块的路径
查看>>
rest-framework之权限组件
查看>>