SPOJ DCEPC11I
题目大意:
就是给定一段区间令其中的数增加一个递增序列(也就是说第一个+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;
}
}
总代码如下所示:
#include <cstdio>
#include <cstring>
using namespace std;
#define L ls,x,mid
#define R rs,mid+1,y
#define LL long long
#define N 100010
LL sum[N<<],add[N<<];
int del[N<<];
void push_up(int o)
{
sum[o]=sum[o<<]+sum[o<<|];
}
void push_down(int o,int x,int y)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
if(add[o]||del[o]){
int t1=mid-x+,t2=y-mid;
LL a2=add[o]+t1*del[o];
sum[ls]+=add[o]*t1+t1*(t1-)*del[o]/;
sum[rs]+=a2*t2+t2*(t2-)*del[o]/;
add[ls]+=add[o],add[rs]+=a2;
del[ls]+=del[o],del[rs]+=del[o];
add[o]=del[o]=;
}
}
void build(int o,int x,int y)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
sum[o]=del[o]=add[o]=;
if(x==y) return;
build(L);
build(R);
}
void update(int o,int x,int y,int s,int t)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
if(x>=s&&y<=t){
add[o]+=x-s+;
sum[o]+=(x-s+)*(y-x+)+(y-x+)*(y-x)/;
del[o]++;
return;
}
push_down(o,x,y);
if(mid>=s) update(L,s,t);
if(mid<t) update(R,s,t);
push_up(o);
}
void query(int o,int x,int y,int s,int t,LL &ans)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
if(x>=s&&y<=t){
ans+=sum[o];
return;
}
push_down(o,x,y);
if(mid>=s) query(L,s,t,ans);
if(mid<t) query(R,s,t,ans);
}
int main()
{
int n,q,op,a,b;
scanf("%d%d",&n,&q);
build(,,n);
for(int i=;i<q;i++){
scanf("%d%d%d",&op,&a,&b);
if(op){
LL ans=;
query(,,n,a,b,ans);
printf("%lld\n",ans);
}
else update(,,n,a,b);
}
return ;
}
SPOJ DCEPC11I的更多相关文章
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
- SPOJ GSS2 Can you answer these queries II
Time Limit: 1000MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description Being a ...
随机推荐
- Jquery show()方法图解
前两天面试的时候被问到了show()方法,当时回答的实在是太惨烈... 晚上看了一下,最简单的走法是直接移除行内样式的style属性. 如果这步走完了,元素还是隐藏的(display为none),元素 ...
- android开发学习 ------- git - 将代码回滚到任意版本
不小心将一个东西错误提交到git - 远程仓库上 参考 https://www.cnblogs.com/wancy86/p/5848024.html 你的git可能关联了多个远程仓库,每个关联的代码 ...
- 【学习笔记】深入理解js原型和闭包(0)——目录
文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...
- JavaScript创建对象的七种方法
一. 工厂模式 创建: function createPerson(name,behavior){ var p=new Object(); p.name=name; p.behavior=behavi ...
- Ajax的项目搭建
在搭建Ajax项目之前,首先我们的安装nginx,因为Ajax是基于nginx来运行的, 1.安装nginx 和基本的语法 http://nginx.org/ 上面的nginx的官网,下载直接安装就好 ...
- Android小玩意儿-- 从头开发一个正经的MusicPlayer(二)
1·在Service中实例化MusicPlayer,实现对整个播放过程的控制 上一次做到了找到音乐数据,并封装成对象装在ArrayList里,把数据的信息显示在UI上.下面一个阶段就要开始真正的音乐播 ...
- MVC之在实例中的应用
MVC模式在Java Web应用程序中的实例分析 1. 结合六个基本质量属性 1)可用性 2)可修改性 3)性能 4)安全性 5)可测试性 6)易用性 2. 分析具体功能模块的MVC设计实现(例如登录 ...
- RSA2
进行签名的加密 package com.goboosoft.common.pay.util; import java.io.ByteArrayInputStream; import java.io.I ...
- liunx+mysql数据库管理
源码安装 查询是否安装: rpm -aq |grep mysql 1.下载yum 源 wget 'https://dev.mysql.com/get/mysql57-commu ...
- diff - 找出两个文件的不同点
总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, dif ...