别人树状数组跑几百毫秒 我跑 2500多

 #include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<climits>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+;
const int64 Mod=;
const double eps=1e-;
const int MAXN=;
const double PI=acos(-1.0);
inline void rl(ll&num){
num=;ll f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
inline void ri(int &num){
num=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
int getnum()//相邻的个位整数输入 如想分别保存1234 输入连续的1234 a[i]=getnum();就可以实现
{
char ch=getchar();
while((ch<'' || ch>'') && ch!='-')
ch=getchar();
return (ch-'');
}
inline void out(int x){ if(x<) {putchar('-'); x*=-;}if(x>) out(x/); putchar(x%+''); }
ll sum[MAXN<<],add[MAXN<<];
int n;
void init(int _n)
{
n=;
while(n<_n) n*=;
for(int i=;i<*n-;i++)
{
sum[i]=add[i]=;
}
}
void pushdown(int rt,int m)
{
if(add[rt])
{
add[rt*+] += add[rt];
add[rt<<|] += add[rt];
sum[rt*+] += add[rt] * (m - (m>>));
sum[rt<<|] += add[rt] * (m>>);
add[rt] = ;
}
}
void pushup(int rt)
{
sum[rt]=sum[rt*+]+sum[rt<<|];
}
void update(int a,int b,int c,int k,int l,int r)
{
if(r<=a||b<=l) return ;
if(a<=l&&r<=b)
{
add[k]+=c;
sum[k]+=(ll)c*(r-l);
return ;
}
if(l+==r) return;
pushdown(k,r-l);
int m=(l+r)/;
if(b<=m)
{
update(a,b,c,k*+,l,m);
}
else{
if(l>m)update(a,b,c,k*+,m,r);
else{
update(a,b,c,k*+,l,m);
update(a,b,c,k*+,m,r);
}
}
pushup(k);
}
ll query(int a,int b,int k,int l,int r)
{
if(r<=a||b<=l) return ;
if(a<=l&&r<=b)
{
return sum[k];
}
pushdown(k,r-l);
int m=(l+r)/;
ll res=;
if(b<=m)
{
res+=query(a,b,k*+,l,m);
}
else{
if(l>m)res+=query(a,b,k*+,m,r);
else{
res+=query(a,b,k*+,l,m);
res+=query(a,b,k*+,m,r);
}
}
return res;
}
void ad(int k,int a)
{
k+=n-;
sum[k]=a;
while(k>)
{
k=(k-)/;
sum[k]=sum[k*+]+sum[k*+];
}
}
int main()
{
int _n,m;
while(scanf("%d%d",&_n,&m)==)
{
init(_n);
for(int i=;i<=_n;i++)
{
int tem;
ri(tem);ad(i,tem);
}
char ch[]; int a,b,c;
while(m--)
{
scanf("%s",ch);
if(ch[] == 'Q')
{
scanf("%d %d", &a,&b);
printf("%lld\n",query(a,b+,,,n));
} else
{
scanf("%d %d %d",&a,&b,&c);
update(a,b+,c,,,n);
}
}
memset(add,,sizeof(add));
memset(sum,,sizeof(sum));
}
return ;
}

等看能不能优化再写

线段树成段更新模板POJ3468 zkw以及lazy思想的更多相关文章

  1. 【线段树成段更新-模板】【HDU1698】Just a Hook

    题意 Q个操作,将l,r 的值改为w 问最后1,n的sum 为多少 成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更 ...

  2. HDU-1698-Just a Hook-区间更新+线段树成段更新

    In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...

  3. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  4. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  5. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  6. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

  7. HDU1698_Just a Hook(线段树/成段更新)

    解题报告 题意: 原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和. 思路: 线段树成段更新,区间去和. #include <iostream> #include < ...

  8. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  9. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

随机推荐

  1. monkey基本命令及脚本编写

    Monkey 是Android自带的黑盒测试工具,一般通过随机触发界面事件,来确定应用是否会发生异常,多用于android应用的稳定性.压力测试  基本命令: adb shell monkey [op ...

  2. dom4j的解析实例

    book.xml数据如下: <books> <book> <author>Thomas</author> <title>Java从入门到放弃 ...

  3. FLINK源代码调试方式

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 第一种,直接通过IDEA WINDOWS调试 前提是Flink所有依赖已经导入,直接在Test中打断点,然后直 ...

  4. 2 手写Java LinkedList核心源码

    上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...

  5. 新浪微博分享出现libc++abi.dylib: terminating with uncaught exception of type NSException微博微信SDK运行编译报错

    SDK出现libc++abi.dylib: terminating with uncaught exception of type NSException  的问题: 解决方法 结合 # 监测bug( ...

  6. HDU2896【AC自动机-模板】

    思路: 因为不同病毒特征码不会相同. AC自动机,然后对于每一个输出即可. 注意:以上字符串中字符都是ASCII码可见字符(不包括回车);G++ MLE. //#include <bits/st ...

  7. Lightoj1014【基础题】

    题意: 有C个人,安排了P个吃的,每个人会吃Q个吃的,最后留下L个吃的:求所有可能的Q,从小到大输出,要保证Q>L; 思路: 其实就是求出P-L的所有数的约数,然后这个约数>L的话就满足: ...

  8. 如何在Linux服务器上部署禅道

    最近换了新的项目团队,由于新团队比较年轻化,没有实行正规的项目管理,于是我自告奋勇要为团队管理出一份力,帮助团队建立敏捷化的项目管理,经过多方考究和对比后,选择了目前较受欢迎的开源项目管理软件:禅道. ...

  9. random 库

    random 是使用随机数的python 标准库 ——为随机数:采用梅森旋转算法生成的(伪)随机序列中的元素 —— import random 基本随机数函数:seed(),random() 扩展随机 ...

  10. hashCode方法里为什么选择数字31作为生成hashCode值的乘数

    前提: 偶然的机会看到了大神的一篇博客,介绍的是hashCode()方法里为什么要用31这个数字作为生成hashCode的乘数.hashCode我在比较自定义类时曾经用到过 - 由于java默认比较的 ...