95pts TLE 求助
查看原帖
95pts TLE 求助
627636
封禁用户楼主2023/3/29 08:38

rt.

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
struct seele {int l, r, id;} a[500005]; int l[500005], r[500005], v[500005]; long long pref[500005], sing[500005]; struct TLEWA {int l, r, v, t; TLEWA(int I_love_seele, int Seele_Vollereiyyds=0, int I_love_seele_forever=0, int seele_official=0) {l = I_love_seele; r = Seele_Vollereiyyds; v = I_love_seele_forever; t = seele_official;}}; bool operator <(const TLEWA &x, const TLEWA &y) {return x.l < y.l;} set<TLEWA> s;
void addd(int x, long long v) {x++; while (x <= 500001) {pref[x] += v; x += x & -x;}} long long query(int x) {x++; long long summ=0; while (x) {summ += pref[x]; x -= x & -x;} return summ;}
auto split(int pos) {auto it=s.lower_bound(TLEWA(pos)); if (it != s.end() && it -> l == pos) return it; it--; if (it -> r < pos) return s.end(); int l=it->l, r=it->r, v=it->v, t=it->t; s.erase(it); s.insert(TLEWA(l, pos-1, v, t)); return s.insert(TLEWA(pos, r, v, t)).first;}
void assign(int l, int r, int v, int t) {auto itr=split(r+1), itl=split(l); for (auto it=itl; it!=itr; it++) addd(it->t, -(long long)((it->r)-(it->l)+1)*(it->v)); s.erase(itl, itr); s.insert(TLEWA(l, r, v, t)); addd(t, (long long)(r-l+1)*v);}
int main() {
int n, m, q, rr=0; cin >> n >> m >> q; s.insert(TLEWA(1, n, 0, 0)); for (int i=1; i<=n; i++) cin >> l[i] >> r[i] >> v[i]; for (int i=1; i<=q; i++) {cin >> a[i].l >> a[i].r; a[i].id = i;} sort(a+1, a+1+q, [](seele x, seele y){return x.r < y.r;}); for (int i=1; i<=q; i++) {
while (rr < a[i].r) {rr++; assign(l[rr], r[rr], v[rr], rr);} sing[a[i].id] = query(n) - query(a[i].l-1);
} for (int i=1; i<=q; i++) cout << sing[i] << endl;
}
2023/3/29 08:38
加载中...