总时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
262144kB
描述

给一个长为N的数列,有M次操作,每次操作是以下两种之一:

(1)将某连续一段同时改成一个数

(2)求数列中某连续一段的和

输入
第一行两个正整数N和M。
第二行N的整数表示这个数列。
接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来三个整数x、y和z,表示在[x,y]这段区间的数改为z;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示求[x,y]这段区间的和。
输出
对每一个询问操作单独输出一行,表示答案。
样例输入
  1. 5 3
  2. 1 2 3 4 5
  3. Q 1 5
  4. M 2 3 2
  5. Q 3 5
样例输出
  1. 15
  2. 11
提示
1<=N<=10^5,1<=M<=10^5,输入保证合法,且所有整数及答案可用带符号32位整型存储。
对于线段树的直接修改,
我们首先考虑要维护一个修改标记,
注意这个标记是可以每次被覆盖的!
然后值直接区间修改就好
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ls k<<1
  5. #define rs k<<1|1
  6. using namespace std;
  7. const int MAXN=;
  8. const int maxn=0x7ffff;
  9. void read(int &n)
  10. {
  11. char c='+';int x=;bool flag=;
  12. while(c<''||c>''){c=getchar();if(c=='-')flag=;}
  13. while(c>=''&&c<='')
  14. x=(x<<)+(x<<)+c-,c=getchar();
  15. flag==?n=-x:n=x;
  16. }
  17. int n,m;
  18. int ans=;
  19. struct node
  20. {
  21. int l,r,w,f;
  22. node()
  23. {
  24. l=r=w=;
  25. f=-maxn;
  26. }
  27. }tree[MAXN<<];
  28. void update(int k)
  29. {
  30. tree[k].w=tree[ls].w+tree[rs].w;
  31. }
  32. void build(int ll,int rr,int k)
  33. {
  34. tree[k].l=ll;tree[k].r=rr;
  35. if(ll==rr)
  36. {
  37. read(tree[k].w);
  38. return ;
  39. }
  40. int mid=(ll+rr)>>;
  41. build(ll,mid,ls);
  42. build(mid+,rr,rs);
  43. update(k);
  44. }
  45. void push(int k)
  46. {
  47. tree[ls].w=(tree[ls].r-tree[ls].l+)*tree[k].f;
  48. tree[rs].w=(tree[rs].r-tree[rs].l+)*tree[k].f;
  49. tree[ls].f=tree[k].f;
  50. tree[rs].f=tree[k].f;
  51. tree[k].f=-maxn;
  52.  
  53. }
  54. void change(int k,int wl,int wr,int v)
  55. {
  56. if(wr<tree[k].l||wl>tree[k].r)
  57. return ;
  58. if(wl<=tree[k].l&&tree[k].r<=wr)
  59. {
  60. tree[k].w=(tree[k].r-tree[k].l+)*v;
  61. tree[k].f=v;
  62. return ;
  63. }
  64. int mid=(tree[k].l+tree[k].r)>>;
  65. if(tree[k].f!=-maxn)
  66. push(k);
  67. change(ls,wl,wr,v);
  68. change(rs,wl,wr,v);
  69. update(k);
  70. }
  71. void ask(int k,int wl,int wr)
  72. {
  73. if(wr<tree[k].l||wl>tree[k].r)
  74. return ;
  75. if(wl<=tree[k].l&&tree[k].r<=wr)
  76. {
  77. ans+=tree[k].w;
  78. return ;
  79. }
  80. int mid=(tree[k].l+tree[k].r)>>;
  81. if(tree[k].f!=-maxn)
  82. push(k);
  83. ask(ls,wl,wr);
  84. ask(rs,wl,wr);
  85. update(k);
  86. }
  87. int main()
  88. {
  89. read(n);read(m);
  90. build(,n,);
  91. for(int i=;i<=m;i++)
  92. {
  93. char c;int x,y;
  94. cin>>c;
  95. read(x);read(y);
  96. if(c=='M')
  97. {
  98. int v;
  99. read(v);
  100. change(,x,y,v);
  101. }
  102. else
  103. {
  104. ans=;
  105. ask(,x,y);
  106. printf("%d\n",ans);
  107. }
  108. }
  109. return ;
  110. }
  111. : Challenge 5最近的提交

12:Challenge 5(线段树区间直接修改)的更多相关文章

  1. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  2. Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)

    题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...

  3. 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)

    Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...

  4. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  5. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  6. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  7. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  8. CF444C. DZY Loves Colors[线段树 区间]

    C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

随机推荐

  1. 7.gcc的使用

    什么是gcc gcc编译器(GNU C Compiler) 现在我们所说的 gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pas ...

  2. HTML-虚线框3例

    第一例: 代码 <HR style=> 第二例: 代码 <DIV style="BORDER-TOP: #00686b 1px dashed; OVERFLOW: hidd ...

  3. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  4. POJ 1466 最大独立点集

    思路:匈牙利 n-ans/2; // by SiriusRen #include <cstdio> #include <cstring> #define N 505 using ...

  5. js获取浏览器中相关容器的高度

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  6. mac修改管理员权限命令

    我们在进行mac 命令行安装软件的时候,有的时候会遇见这样的问题:Please try running this command again as root/Administrator. 如图: 解决 ...

  7. html css 样式中100%width 仍有白边解决办法

    把 <body >改成<body style="margin=0%">

  8. 51nod 1392 装盒子(费用流)

    如果权值为\(1\)就是最长反链. 然而并不是.考虑用费用流. 把每一个盒子\(i\)拆成i和\(i+n\). 设源点为\(S\),汇点为\(T\). \(S\)向每一个i连容量为\(1\),费用为\ ...

  9. 三、frpc 完整配置文件

    # [common] is integral section [common] # A literal address or host name for IPv6 must be enclosed # ...

  10. 阿里云Linux系统安装配置Tomcat方法

    本文将tomcat安装到了/alidata/server/目录下,当然也可以安装到其他目录. 1. 下载tomcat:#wget http://apache.fayea.com/tomcat/tomc ...