• C


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

    很基础的一道延迟标记的题

    需要注意的是数据得到了加强,故这里要用__int64 

      1 #include <cmath>
      2 #include <queue>
      3 #include <string>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <iostream>
      7 #include <algorithm>
      8 #define forn(i, n) for (int i = 0; i < (n); i++)
      9 #define forab(i, a, b) for (int i = (a); i <= (b); i++)
     10 #define forba(i, b, a) for (int i = (b); i >= (a); i--)
     11 #define mset(a, n) memset(a, n, sizeof(a))
     12 #define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
     13 #define P pair<int,int>
     14 #define fi first
     15 #define se second
     16 using namespace std;
     17 #define N 100000
     18 #define inf 0x3f3f3f3f
     19 #define ll long long
     20 struct SegmentTree
     21 {
     22     int l, r;
     23     __int64 data, add;
     24     #define l(x) t[x].l
     25     #define r(x) t[x].r
     26     #define data(x) t[x].data
     27     #define add(x) t[x].add
     28 } t[N * 4 + 5];
     29 __int64 temp[N], ans;
     30 int n, m;
     31 void build(int p,int l,int r)
     32 {
     33     l(p) = l;
     34     r(p) = r;
     35     add(p) = 0;
     36     if(l==r)
     37     {
     38         data(p) = temp[l];
     39         return;
     40     }
     41     int m = (r + l) / 2;
     42     int ls = 2 * p, rs = 2 * p + 1;
     43     build(ls, l, m);
     44     build(rs, m + 1, r);
     45     data(p) = data(ls) + data(rs);
     46 }
     47 void spread(int p)
     48 {
     49     if(add(p))
     50     {
     51         int ls = 2 * p, rs = ls + 1;
     52         data(ls) += add(p) * (r(ls) - l(ls) + 1);
     53         data(rs) += add(p) * (r(rs) - l(rs) + 1);
     54         add(ls) += add(p);
     55         add(rs) += add(p);
     56         add(p) = 0;
     57     }
     58 }
     59 void change(int p,int l,int r,__int64 d)
     60 {
     61     if(l<=l(p)&&r>=r(p))
     62     {
     63         data(p) += (__int64)d * (r(p) - l(p) + 1);
     64         add(p) += d;
     65         return;
     66     }
     67     spread(p);
     68     int m = (l(p) + r(p)) / 2;
     69     int ls = 2 * p, rs = 2 * p + 1;
     70     if(l<=m)
     71         change(ls, l, r, d);
     72     if(r>m)
     73         change(rs, l, r, d);
     74     data(p) = data(ls) + data(rs);
     75 }
     76 __int64 Query(int p,int l,int r)
     77 {
     78     if(l<=l(p)&&r>=r(p))
     79     {
     80         return data(p);
     81     }
     82     spread(p);
     83     int m = (l(p) + r(p)) / 2;
     84     int ls = 2 * p, rs = 2 * p + 1;
     85     ll val = 0;
     86     if(l<=m)
     87         val += Query(ls, l, r);
     88     if(r>m)
     89         val += Query(rs, l, r);
     90     return val;
     91 }
     92 int main()
     93 {
     94     scanf("%d%d", &n, &m);
     95     forab(i, 1, n) scanf("%I64d", temp + i);
     96     build(1, 1, n);
     97     forab(i,1,m)
     98     {
     99         getchar();
    100         char c;
    101         int a, b;
    102         scanf("%c %d %d", &c, &a, &b);
    103         if(c=='Q')
    104         {
    105             printf("%I64d
    ", Query(1, a, b));
    106         }
    107         else
    108         {
    109             __int64 x;
    110             scanf("%I64d", &x);
    111             change(1, a, b, x);
    112         }
    113     }
    114 }
    View Code
  • 相关阅读:
    Android中WebView如何加载JavaScript脚本
    Android中WebView如何加载JavaScript脚本
    Android中WebView如何加载JavaScript脚本
    Android如何使用SQLlite数据库
    Android如何使用SQLlite数据库
    Android如何使用SQLlite数据库
    __declspec(dllimport)的作用
    __declspec,__cdecl,__stdcall都是什么意思?有什么作用?
    #pragma pack(push,1)与#pragma pack(1)的区别
    #pragma pack(n) 的作用
  • 原文地址:https://www.cnblogs.com/zssst/p/11076630.html
Copyright © 2020-2023  润新知