其实这两题都是基础的线段树,但对于我这个线段树的初学者来说,总结一下还是很有用的;

poj3468显然是线段树区间求和,区间更改的问题,而poj2528是对区间染色,问有多少种颜色的问题;

线段树的建立和求和附代码,还是比较简单的;

这里想说的是区间修改,用到了了lazy思想:打标记;

拿poj2528举例,比如对区间[l,r]染色,我们只要在线段树中,被[l,r]覆盖的最大子区间[p,q]上标记被染成了什么颜色即可,不需要再往下遍历[p,q]的左右孩子;当下次修改影响到了区间[p,q]时(区间有交集),说明[p,q]一定不会全都维持原来的颜色。我们将标记向下传递给左右孩子(同时自身标记清除),不断传递下去,直至某个区间完全被要修改区间覆盖,,再给这个区间打上新的标记。这样可保证时间复杂度为O(logn);

总之lazy思想的精髓就是,能不往下访问就不访问,要更改的时候再将子节点更改,从而减少时间复杂度;

 var lazy,tree:array[..] of int64;
l,n,m,j,x,a,b,i:longint;
ans:int64;
c:char;
procedure pushdown(l,r,i:longint);
var m:longint;
begin
m:=(l+r) div ;
if lazy[i]= then exit;
lazy[i*]:=lazy[i*]+lazy[i];
lazy[i*+]:=lazy[i*+]+lazy[i];
tree[i*]:=tree[i*]+lazy[i]*(m-l+);
tree[i*+]:=tree[i*+]+lazy[i]*(r-m);
lazy[i]:=;
end; procedure build(i,l,r:longint);
var m:longint;
begin
if l=r then read(tree[i])
else begin
m:=(l+r) div ;
build(i*,l,m);
build(*i+,m+,r);
tree[i]:=tree[*i]+tree[*i+];
end;
end; function find(i,l,r,l1,r1:longint):int64;
var m:longint;
t:int64;
begin
if (l>=l1) and (r<=r1) then exit(tree[i])
else begin
pushdown(l,r,i);
m:=(l+r) div ;
t:=;
if l1<=m then t:=t+find(*i,l,m,l1,r1);
if r1>m then t:=t+find(*i+,m+,r,l1,r1);
exit(t);
end;
end; procedure work(i,l,r,l1,r1,x:longint);
var m:longint;
begin
if (l1<=l) and (r<=r1) then
begin
lazy[i]:=lazy[i]+x;
tree[i]:=tree[i]+(r-l+)*x;
end
else begin
pushdown(l,r,i);
m:=(l+r) div ;
if (l1<=m) then work(i*,l,m,l1,r1,x);
if (r1>m) then work(i*+,m+,r,l1,r1,x);
tree[i]:=tree[i*]+tree[i*+];
end;
end; begin
readln(n,m);
build(,,n);
readln;
fillchar(lazy,sizeof(lazy),);
for i:= to m do
begin
read(c);
if c='Q' then
begin
read(a,b);
ans:=find(,,n,a,b);
writeln(ans);
end
else if c='C' then
begin
read(a,b,j);
work(,,n,a,b,j);
end;
readln;
end;
end.

poj3468

而poj2528还要复杂一点,简单的建立线段树会爆空间,这需要我们把出现的区间离散化,减小空间复杂度。

 var tree:array[..] of integer;
    x,y:array[..] of longint;
    a:array[..] of longint;         //表示离散化乎的标号对应的区间
    f:array[..] of boolean;
    ff:array[..] of boolean;
    i,j,k,n,t,s:longint;
procedure sort(l,r: longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) div ];
    repeat
      while a[i]<x do inc(i);
      while x<a[j] do dec(j);
      if not(i>j) then
      begin
        y:=a[i];
        a[i]:=a[j];
        a[j]:=y;
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end;
procedure putdown(i,p,q:longint);         //传递标记
  begin
    if p<>q then
    begin
      tree[i*]:=tree[i];
      tree[i*+]:=tree[i];
      tree[i]:=;
    end;
  end;
procedure build(i,p,q,l,r,x:longint);
  var m:longint;
  begin
    if (a[p]>=l) and (r>=a[q]) then tree[i]:=x
    else begin
      if tree[i]<> then putdown(i,p,q);
      m:=(p+q) div ;
      if l<=a[m] then
      begin
        build(i*,p,m,l,r,x);
      end;
      if r>a[m] then
      begin
        build(i*+,m+,q,l,r,x);
      end;
    end;
  end;
procedure dfs(i,p,q:longint);              //统计多少可见海报
  var m:longint;
  begin
    if (tree[i]>) and not ff[tree[i]] then
    begin
      s:=s+;
      ff[tree[i]]:=true;
    end
    else if (tree[i]=) and (p<>q) then
    begin
      m:=(p+q) div ;
      dfs(i*,p,m);
      dfs(i*+,m+,q);
    end;
  end;
begin
  readln(t);
  for i:= to t do
  begin
    k:=;
    fillchar(f,sizeof(f),false);
    readln(n);                        
    for j:= to n do 
    begin
      readln(x[j],y[j]);
      if not f[x[j]] then                        //离散化
      begin
        k:=k+;
        a[k]:=x[j];
        f[x[j]]:=true;
      end;
      if not f[y[j]] then
      begin
        k:=k+;
        a[k]:=y[j];
        f[y[j]]:=true;
      end;
    end;
    sort(,k);
    fillchar(tree,sizeof(tree),);
    for j:= to n do                     
      build(,,k,x[j],y[j],j);
    s:=;
    fillchar(ff,sizeof(ff),false);
    dfs(,,k);
    writeln(s);
  end;
end.

poj2528

poj3468,poj2528的更多相关文章

  1. 【poj3468】 A Simple Problem with Integers

    http://poj.org/problem?id=3468 (题目链接) 题意 给出一个序列,要求维护区间修改与区间求和操作. Solution 多年以前学习的树状数组区间修改又忘记了→_→. 其实 ...

  2. poj2528(线段树+离散化)

    题目链接:https://vjudge.net/problem/POJ-2528 题意:在区间[1,1e7]内染色,依次染n(<=1e4)中颜色,给出每种颜色染色的范围,可重叠,求最终有多少种颜 ...

  3. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

  4. poj3468 A Simple Problem with Integers(线段树区间更新)

    https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...

  5. poj-2528线段树练习

    title: poj-2528线段树练习 date: 2018-10-13 13:45:09 tags: acm 刷题 categories: ACM-线段树 概述 这道题坑了我好久啊啊啊啊,,,, ...

  6. 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和

    poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...

  7. 线段树---poj2528 Mayor’s posters【成段替换|离散化】

    poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...

  8. POJ2528 Mayor's posters —— 线段树染色 + 离散化

    题目链接:https://vjudge.net/problem/POJ-2528 The citizens of Bytetown, AB, could not stand that the cand ...

  9. POJ3468 A Simple Problem with Integers —— 线段树 区间修改

    题目链接:https://vjudge.net/problem/POJ-3468 You have N integers, A1, A2, ... , AN. You need to deal wit ...

随机推荐

  1. DRLSE 水平集算法总结

    背景: Level Set方法是美国数学家Osher(加州大学洛杉矶分校)和Sethian(加州大学伯克利分校)合作提出的.后者因为对Level Set的贡献获得了去年美国数学会与工业应用数学会联合颁 ...

  2. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  3. as3.0服务端FMS软件常用的方法与属性参考示例

    转自:http://www.cuplayer.com/player/PlayerCode/RTMP/2012/0918429.html Application类的方法汇总方法 描述Applicatio ...

  4. php中的性能挖掘

    搞php以后,感觉总是很别扭,因为我觉得php会很慢,因为array普遍,在Key的循环查找不是很浪费性能么!因为我以前搞.net和java,他们是用的大多是寻址和索引方式,而php中太多是使用Key ...

  5. div+css的前端工程师的价值体现在哪些方面?

    个人认为前端工程师正慢慢演变为产品工程师.wap app, 响应性UI等以html5技术为基础的开发将成为前端工程师的主要工作内容,解决产品跨平台跨设备的实现问题.Javascript, HTML, ...

  6. JavaScript高级---装饰者模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  7. 【WCF--初入江湖】目录

    [WCF--初入江湖]目录 [WCF--初入江湖]01 WCF编程概述 [WCF--初入江湖]02 WCF契约 [WCF--初入江湖]03 配置服务 [WCF--初入江湖]04 WCF通信模式 [WC ...

  8. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  9. js和jquery获取文档对象以及滚动条位置

    <div style="width:120px;height:120px;border:1px solid red; position:absolute; left:800px; to ...

  10. poj 3270 Cow Sorting

    思路:仔细读题,看到FARMER是两两交换牛的顺序进行排序的话,应该就往置换上靠拢,而这个题果然是置换的应用(有的解题报告上说是置换群,其实这只是单个置换,不用让它构成群).我们来将这些无序的牛抽象成 ...