zoukankan      html  css  js  c++  java
  • CodeVS4927 线段树练习5

    题目描述 Description

    有n个数和5种操作

    add a b c:把区间[a,b]内的所有数都增加c

    set a b c:把区间[a,b]内的所有数都设为c

    sum a b:查询区间[a,b]的区间和

    max a b:查询区间[a,b]的最大值

    min a b:查询区间[a,b]的最小值

    输入描述 Input Description

    第一行两个整数n,m,第二行n个整数表示这n个数的初始值

    接下来m行操作,同题目描述

    输出描述 Output Description

    对于所有的sum、max、min询问,一行输出一个答案

    常规的线段树,6月22日就写好了代码,然后一直90分

    直到今天师弟跟我说数据中有将一个区间全部改为0的情况……

    解决方案是在线段树上的每一个点开一个boolean,判断这个点代表的区间是否被set操作更改,而不是直接根据标记是否等于0判断。

    ありがとうございます。

    作为一个高三狗在电脑室写代码感到莫名的惭愧。也是很久没有更新博客了。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <algorithm>
      4 #include <cstring>
      5 #define rep(i,l,r) for(int i=l; i<=r; i++)
      6 #define clr(x,y) memset(x,y,sizeof(x))
      7 #define travel(x) for(Edge *p=last[x]; p; p=p->pre)
      8 using namespace std;
      9 typedef long long ll;
     10 typedef pair<int,int> pii;
     11 const int INF = 0x3f3f3f3f;
     12 const int maxn = 100010;
     13 inline ll read(){
     14     int ans = 0, f = 1; char c = getchar();
     15     for(; !isdigit(c); c = getchar()) if (c == '-') f = -1;
     16     for(; isdigit(c); c = getchar()) ans = ans * 10 + c - '0';
     17     return ans * f;
     18 }
     19 struct Node{
     20     int l,r;
     21     ll s,mn,mx,t1,t2;
     22     bool bl;
     23 }t[maxn<<2];
     24 int n,m,a,b,c,s[maxn];
     25 char op[10];
     26 inline void pushdown(int w){
     27     if (t[w].l == t[w].r) return;
     28     if (t[w].bl){
     29         t[w<<1].t1 = t[w].t1; t[w<<1|1].t1 = t[w].t1;
     30         t[w<<1].s = (t[w<<1].r - t[w<<1].l + 1) * t[w].t1;
     31         t[w<<1].mn = t[w<<1].mx = t[w].t1;
     32         t[w<<1|1].s = (t[w<<1|1].r - t[w<<1|1].l + 1) * t[w].t1;
     33         t[w<<1|1].mn = t[w<<1|1].mx = t[w].t1;
     34         t[w].t1 = 0; t[w].t2 = 0; t[w<<1].t2 = 0; t[w<<1|1].t2 = 0;
     35         t[w].bl = 0; t[w<<1].bl = 1; t[w<<1|1].bl = 1;
     36     }
     37     if (t[w].t2){
     38         if (t[w<<1].t1) t[w<<1].t1 += t[w].t2; else t[w<<1].t2 += t[w].t2;
     39         if (t[w<<1|1].t1) t[w<<1|1].t1 += t[w].t2; else t[w<<1|1].t2 += t[w].t2;
     40         t[w<<1].s += (t[w<<1].r - t[w<<1].l + 1) * t[w].t2;
     41         t[w<<1].mn += t[w].t2; t[w<<1].mx += t[w].t2;
     42         t[w<<1|1].s += (t[w<<1|1].r - t[w<<1|1].l + 1) * t[w].t2;
     43         t[w<<1|1].mn += t[w].t2; t[w<<1|1].mx += t[w].t2;
     44         t[w].t2 = 0;
     45     }
     46 }
     47 inline void maintain(int w){
     48     t[w].s = t[w<<1].s + t[w<<1|1].s;
     49     t[w].mx = max(t[w<<1].mx,t[w<<1|1].mx);
     50     t[w].mn = min(t[w<<1].mn,t[w<<1|1].mn);
     51 }
     52 void build(int u,int v,int w){
     53     t[w].l = u; t[w].r = v;
     54     if (u == v){
     55         t[w].mx = t[w].mn = t[w].s = s[u];
     56         t[w].t1 = t[w].t2 = 0;
     57         return;
     58     }
     59     int mid = (u + v) >> 1;
     60     build(u,mid,w<<1); build(mid+1,v,w<<1|1);
     61     maintain(w);
     62 }
     63 void modify(int u,int v,int w,ll x,int T){
     64     pushdown(w);
     65     if (t[w].l == u && t[w].r == v){
     66         if (T == 1){
     67             t[w].t1 = x; t[w].t2 = 0;
     68             t[w].s = (t[w].r - t[w].l + 1) * x;
     69             t[w].mn = t[w].mx = x; t[w].bl = 1;
     70         }
     71         else{
     72             if (t[w].t1) t[w].t1 += x; else t[w].t2 += x;
     73             t[w].s += (t[w].r - t[w].l + 1) * x;
     74             t[w].mn += x; t[w].mx += x;
     75         }
     76         return;
     77     }
     78     int mid = (t[w].l + t[w].r) >> 1;
     79     if (v <= mid) modify(u,v,w<<1,x,T);
     80     else if (u > mid) modify(u,v,w<<1|1,x,T);
     81     else{
     82         modify(u,mid,w<<1,x,T);
     83         modify(mid+1,v,w<<1|1,x,T);
     84     }
     85     maintain(w);
     86 }
     87 ll query(int u,int v,int w,int T){
     88     pushdown(w);
     89     if (t[w].l == u && t[w].r == v){
     90         if (T == 1) return t[w].s;
     91         else if (T == 2) return t[w].mx; else return t[w].mn;
     92     }
     93     int mid = (t[w].l + t[w].r) >> 1;
     94     if (v <= mid) return query(u,v,w<<1,T);
     95     else if (u > mid) return query(u,v,w<<1|1,T);
     96     else{
     97         if (T == 1) return query(u,mid,w<<1,T) + query(mid+1,v,w<<1|1,T);
     98         else if (T == 2) return max(query(u,mid,w<<1,T),query(mid+1,v,w<<1|1,T));
     99         else return min(query(u,mid,w<<1,T),query(mid+1,v,w<<1|1,T));
    100     }
    101 }
    102 int main(){
    103     n = read(); m = read();
    104     rep(i,1,n) s[i] = read();
    105     build(1,n,1);
    106     rep(i,1,m){
    107         scanf("%s",op); a = read(); b = read();
    108         if (op[0] == 'a'){
    109             c = read();
    110             modify(a,b,1,c,2);
    111         }
    112         else if (op[0] == 's' && op[1] == 'e'){
    113             c = read();
    114             modify(a,b,1,c,1);
    115         }
    116         else if (op[0] == 's' && op[1] == 'u') printf("%lld
    ",query(a,b,1,1));
    117         else if (op[0] == 'm' && op[1] == 'a') printf("%lld
    ",query(a,b,1,2));
    118         else if (op[0] == 'm' && op[1] == 'i') printf("%lld
    ",query(a,b,1,3));
    119     }
    120     return 0;
    121 }
    View Code
  • 相关阅读:
    POJ2253 Frogger
    搜索专题(复习)
    机器学习资料整理
    51nod 1873 初中的算术
    Canny检测理解和Matlab实现
    Floyd+限制路径步数(快速幂优化)
    bitset优化背包问题
    Educational Codeforces Round 44 (Rated for Div. 2)
    BZOJ 3224 SBT 普通平衡树
    本科课程大数据基础
  • 原文地址:https://www.cnblogs.com/jimzeng/p/codevs4927.html
Copyright © 2011-2022 走看看