제출 #681127

#제출 시각아이디문제언어결과실행 시간메모리
681127stevancvProgression (NOI20_progression)C++14
0 / 100
1081 ms116448 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define sp ' ' #define en '\n' #define smin(a, b) a = min(a, b) #define smax(a, b) a = max(a, b) using namespace std; const int N = 3e5 + 2; const ll linf = 9e18; struct Segtree { ll st[4 * N], lzys[4 * N], lzya[4 * N]; void Reset1(int n) { for (int i = 1; i <= 4 * n; i++) { lzys[i] = linf; st[i] = lzya[i] = 0; } } void Propagate1(int node, int l, int r) { if (lzys[node] == linf && lzya[node] == 0) return; if (l < r) { if (lzys[node] != linf) { lzys[2 * node] = lzys[2 * node + 1] = lzys[node]; lzya[2 * node] = lzya[2 * node + 1] = 0; } if (lzya[node] != 0) { if (lzys[2 * node] != linf) lzys[2 * node] += lzya[node]; else lzya[2 * node] += lzya[node]; if (lzys[2 * node + 1] != linf) lzys[2 * node + 1] += lzya[node]; else lzya[2 * node + 1] += lzya[node]; } } if (lzys[node] != linf) {st[node] = lzys[node]; lzys[node] = linf;} if (lzya[node] != 0) {st[node] += lzya[node]; lzya[node] = 0;} } void Set1(int node, int l, int r, int ql, int qr, ll y) { Propagate1(node, l, r); if (r < ql || qr < l || ql > qr) return; if (ql <= l && r <= qr) { lzys[node] = y; Propagate1(node, l, r); return; } int mid = l + r >> 1; Set1(2 * node, l, mid, ql, qr, y); Set1(2 * node + 1, mid + 1, r, ql, qr, y); st[node] = min(st[2 * node], st[2 * node + 1]); } void Add1(int node, int l, int r, int ql, int qr, ll y) { Propagate1(node, l, r); if (r < ql || qr < l || ql > qr) return; if (ql <= l && r <= qr) { lzya[node] = y; Propagate1(node, l, r); return; } int mid = l + r >> 1; Add1(2 * node, l, mid, ql, qr, y); Add1(2 * node + 1, mid + 1, r, ql, qr, y); st[node] = min(st[2 * node], st[2 * node + 1]); } ll Get1(int node, int l, int r, int x) { Propagate1(node, l, r); if (l == r) return st[node]; int mid = l + r >> 1; if (x <= mid) return Get1(2 * node, l, mid, x); return Get1(2 * node + 1, mid + 1, r, x); } }st1, st2; struct Node { int ans, llen, rlen; ll lval, rval; Node() { ans = llen = rlen = 0; lval = rval = linf; } Node(int a, int b, int c, ll d, ll e) { ans = a; llen = b; rlen = c; lval = d; rval = e; } }st[4 * N]; Node Merge(Node a, Node b, int l, int r) { int mid = l + r >> 1; Node c = Node(); if (a.lval == linf) {c = b; return c;} if (b.lval == linf) {c = a; return c;} c.ans = max(a.ans, b.ans); c.lval = a.lval; c.rval = b.rval; c.llen = a.llen; c.rlen = b.rlen; if (a.rval != b.lval) return c; smax(c.ans, a.rlen + b.llen); if (a.llen == mid - l + 1) c.llen += b.llen; if (b.rlen == r - mid) c.rlen += a.rlen; return c; } ll a[N], d[N], lzys[4 * N], lzya[4 * N]; void Init(int node, int l, int r) { lzys[node] = linf; lzya[node] = 0; if (l == r) { st[node] = Node(1, 1, 1, d[l], d[l]); return; } int mid = l + r >> 1; Init(2 * node, l, mid); Init(2 * node + 1, mid + 1, r); st[node] = Merge(st[2 * node], st[2 * node + 1], l, r); } void Propagate(int node, int l, int r) { if (lzys[node] == linf && lzya[node] == 0) return; if (l < r) { if (lzys[node] != linf) { lzys[2 * node] = lzys[2 * node + 1] = lzys[node]; lzya[2 * node] = lzya[2 * node + 1] = 0; } if (lzya[node] != 0) { if (lzys[2 * node] != linf) lzys[2 * node] += lzya[node]; else lzya[2 * node] += lzya[node]; if (lzys[2 * node + 1] != linf) lzys[2 * node + 1] += lzya[node]; else lzya[2 * node + 1] += lzya[node]; } } if (lzys[node] != linf) { st[node] = Node(r - l + 1, r - l + 1, r - l + 1, lzys[node], lzys[node]); lzys[node] = linf; } if (lzya[node] != 0) { st[node].lval += lzya[node]; st[node].rval += lzya[node]; lzya[node] = 0; } } void Set(int node, int l, int r, int ql, int qr, ll y) { Propagate(node, l, r); if (r < ql || qr < l || ql > qr) return; if (ql <= l && r <= qr) { lzys[node] = y; Propagate(node, l, r); return; } int mid = l + r >> 1; Set(2 * node, l, mid, ql, qr, y); Set(2 * node + 1, mid + 1, r, ql, qr, y); st[node] = Merge(st[2 * node], st[2 * node + 1], l, r); } void Add(int node, int l, int r, int ql, int qr, ll y) { Propagate(node, l, r); if (r < ql || qr < l || ql > qr) return; if (ql <= l && r <= qr) { lzya[node] = y; Propagate(node, l, r); return; } int mid = l + r >> 1; Add(2 * node, l, mid, ql, qr, y); Add(2 * node + 1, mid + 1, r, ql, qr, y); st[node] = Merge(st[2 * node], st[2 * node + 1], l, r); } Node Get(int node, int l, int r, int ql, int qr) { Propagate(node, l, r); if (r < ql || qr < l || ql > qr) return Node(); if (ql <= l && r <= qr) return st[node]; int mid = l + r >> 1; return Merge(Get(2 * node, l, mid, ql, qr), Get(2 * node + 1, mid + 1, r, ql, qr), l, r); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; st1.Reset1(n); st2.Reset1(n); for (int i = 1; i <= n; i++) { cin >> a[i]; st1.Add1(1, 1, n, i, i, a[i]); } for (int i = 1; i < n; i++) d[i] = a[i + 1] - a[i]; Init(1, 1, n - 1); while (q--) { int ty; cin >> ty; if (ty == 1) { int l, r; ll s, c; cin >> l >> r >> s >> c; st1.Add1(1, 1, n, l, r, s - l * c); st2.Add1(1, 1, n, l, r, c); if (l > 1) Add(1, 1, n - 1, l - 1, l - 1, s); Add(1, 1, n - 1, l, r - 1, c); if (r < n) Add(1, 1, n - 1, r, r, -s - (r - l) * c); } else if (ty == 2) { int l, r; ll s, c; cin >> l >> r >> s >> c; st1.Set1(1, 1, n, l, r, s - l * c); st2.Set1(1, 1, n, l, r, c); if (l > 1) { ll val = st1.Get1(1, 1, n, l - 1) + (l - 1) * st2.Get1(1, 1, n, l - 1); Set(1, 1, n - 1, l - 1, l - 1, s - val); } Set(1, 1, n - 1, l, r - 1, c); if (r < n) { ll val = st1.Get1(1, 1, n, r + 1) + (r + 1) * st2.Get1(1, 1, n, r + 1); Set(1, 1, n - 1, r, r, val - s - (r - l) * c); } } else { int l, r; cin >> l >> r; cout << Get(1, 1, n - 1, l, r - 1).ans + 1 << en; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

Progression.cpp: In member function 'void Segtree::Set1(int, int, int, int, int, long long int)':
Progression.cpp:44:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |         int mid = l + r >> 1;
      |                   ~~^~~
Progression.cpp: In member function 'void Segtree::Add1(int, int, int, int, int, long long int)':
Progression.cpp:57:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   57 |         int mid = l + r >> 1;
      |                   ~~^~~
Progression.cpp: In member function 'long long int Segtree::Get1(int, int, int, int)':
Progression.cpp:65:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |         int mid = l + r >> 1;
      |                   ~~^~~
Progression.cpp: In function 'Node Merge(Node, Node, int, int)':
Progression.cpp:82:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   82 |     int mid = l + r >> 1;
      |               ~~^~~
Progression.cpp: In function 'void Init(int, int, int)':
Progression.cpp:100:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  100 |     int mid = l + r >> 1;
      |               ~~^~~
Progression.cpp: In function 'void Set(int, int, int, int, int, long long int)':
Progression.cpp:136:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  136 |     int mid = l + r >> 1;
      |               ~~^~~
Progression.cpp: In function 'void Add(int, int, int, int, int, long long int)':
Progression.cpp:149:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  149 |     int mid = l + r >> 1;
      |               ~~^~~
Progression.cpp: In function 'Node Get(int, int, int, int, int)':
Progression.cpp:158:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  158 |     int mid = l + r >> 1;
      |               ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...