当前位置: 首页 > news >正文

poj 3468(线段树+lazy思想)

题目链接:http://poj.org/problem?id=3468

思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个合适的范围就用一个增量来记录它,当下一次询问时,如果这个范围正好合适询问的范围,就直接是这个节点的sum值加上这个区间长度*lnc,再加到总和上去,若这个节点的范围不适合所要查询的范围,那么就要查询它的子节点,这个时候再把增量传给她的子节点,并且清空父亲节点的增量,这样效率能大大提高。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 #define MAXN 100010
  7 typedef long long ll;
  8 
  9 struct Node{
 10     int L,R;
 11     ll lnc;//增量
 12     ll sum;
 13 }node[MAXN<<2];
 14 
 15 int N,Q;
 16 
 17 void Build(int L,int R,int rt)
 18 {
 19     if(L==R){
 20         node[rt].lnc=node[rt].sum=0;
 21         return ;
 22     }
 23     node[rt].lnc=node[rt].sum=0;
 24     int M=(L+R)>>1;
 25     Build(L,M,rt<<1);
 26     Build(M+1,R,(rt<<1)|1);
 27 }
 28 
 29 void Updata(int L,int R,int rt,int id,ll x)
 30 {
 31     if(L==id&&R==id){
 32         node[rt].sum=x;
 33         return ;
 34     }
 35     node[rt].sum+=x;
 36     int M=(L+R)>>1;
 37     if(id<=M){
 38         Updata(L,M,rt<<1,id,x);
 39     }else 
 40         Updata(M+1,R,(rt<<1)|1,id,x);
 41 }
 42 
 43 void Add_Updata(int L,int R,int rt,int l,int r,ll x)
 44 {
 45     if(l<=L&&R<=r){
 46         node[rt].lnc+=x;//若此节点所在区段被包含在要插入的区段中,就将插入值存在lnc中,return;
 47         return ;
 48     }else if(L<=l&&r<=R){
 49         node[rt].sum+=(r-l+1)*x;
 50     }else if(L>=l&&R>=r){
 51         node[rt].sum+=(r-L+1)*x;
 52     }else if(L<=l&&R<=r){
 53         node[rt].sum+=(R-l+1)*x;
 54     }
 55     int M=(L+R)>>1;
 56     if(r<=M){
 57         Add_Updata(L,M,rt<<1,l,r,x);
 58     }else if(l>M){
 59         Add_Updata(M+1,R,(rt<<1)|1,l,r,x);
 60     }else {
 61         Add_Updata(L,M,rt<<1,l,r,x);
 62         Add_Updata(M+1,R,(rt<<1)|1,l,r,x);
 63     }
 64 }
 65 
 66 ll sum;
 67 void Query(int L,int R,int rt,int l,int r)
 68 {
 69     if(l<=L&&R<=r){
 70         sum+=node[rt].sum+node[rt].lnc*(R-L+1);
 71         return ;
 72     }
 73     //若上面if条件不成立,则要询问它的子节点,此时增量要下传,并且要更新其本身的sum;
 74     node[rt<<1].lnc+=node[rt].lnc;
 75     node[(rt<<1)|1].lnc+=node[rt].lnc;
 76     node[rt].sum+=node[rt].lnc*(R-L+1);
 77     node[rt].lnc=0;
 78     int M=(L+R)>>1;
 79     if(r<=M){
 80         Query(L,M,rt<<1,l,r);
 81     }else if(l>M){
 82         Query(M+1,R,(rt<<1)|1,l,r);
 83     }else {
 84         Query(L,M,rt<<1,l,r);
 85         Query(M+1,R,(rt<<1)|1,l,r);
 86     }
 87 }
 88 
 89 int main()
 90 {
 91     int a,b,c;
 92     char str[11];
 93     scanf("%d%d",&N,&Q);
 94     Build(1,N,1);
 95     for(int i=1;i<=N;i++){
 96         scanf("%d",&a);
 97         Updata(1,N,1,i,(ll)a);
 98     }
 99     while(Q--){
100         scanf("%s",str);
101         if(str[0]=='Q'){
102             scanf("%d%d",&a,&b);
103             sum=0;
104             Query(1,N,1,a,b);
105             printf("%lld\n",sum);
106         }else {
107             scanf("%d%d%d",&a,&b,&c);
108             Add_Updata(1,N,1,a,b,(ll)c);
109         }
110     }
111     return 0;
112 }
113  
114 
115     
View Code

 

相关文章:

  • 算法系列15天速成——第五天 五大经典查找【中】
  • Mac OS 安装phpMyAdmin
  • 用PHP抓取淘宝商品的用户晒单评论+图片实例
  • c语言小练习(蛮好玩的)
  • Android上传头像代码,相机,相册,裁剪
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • Memcached 安装及启动脚本
  • kafka 源码调研系列1 特色
  • 小型数据库
  • JQuery在线手册
  • UNIX环境高级编程——线程和信号
  • 忘记mysql数据库root密码
  • SqlServer快捷键整理
  • 分析cocos2d-x中的CrystalCraze示例游戏
  • ios开发之导航控制器的原理
  • interface和setter,getter
  • iOS小技巧之UIImagePickerController实现头像选择
  • JS专题之继承
  • laravel5.5 视图共享数据
  • passportjs 源码分析
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • vue-loader 源码解析系列之 selector
  • 分享一份非常强势的Android面试题
  • 关于Flux,Vuex,Redux的思考
  • 力扣(LeetCode)21
  • 数组大概知多少
  • 我是如何设计 Upload 上传组件的
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • const的用法,特别是用在函数前面与后面的区别
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​iOS实时查看App运行日志
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #1015 : KMP算法
  • #Linux(Source Insight安装及工程建立)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $().each和$.each的区别
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)详解PHP处理密码的几种方式
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Framework .NET Core与 .NET 的区别
  • .NET 发展历程
  • .net 生成二级域名
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 使窗口永不获得焦点
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .stream().map与.stream().flatMap的使用
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面