QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#718953 | #6435. Paimon Segment Tree | FUCKUCUP | WA | 4ms | 38132kb | C++20 | 4.5kb | 2024-11-06 21:54:07 | 2024-11-06 21:54:08 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 50010, mod = 1e9 + 7;
int n, m, q, a[maxn], ans[maxn];
struct operation { int l, r, x; }op[maxn];
struct query { int l, r, t, sgn, id; }qry[maxn << 1];
struct matrix {
matrix() { memset(x, 0, sizeof x); }
int x[4][4];
}I;
inline bool operator != (matrix &a, matrix &b) {
for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) if(a.x[i][j] != b.x[i][j]) return true;
return false;
}
inline matrix operator * (matrix &a, matrix &b) {
matrix c;
for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) for(int k = 0; k < 4; ++k) {
c.x[i][j] = (c.x[i][j] + 1ll * a.x[i][k] * b.x[k][j]) % mod;
}
return c;
}
struct node {
int sum3, sum2, sum, len;
matrix tag;
}t[maxn << 2];
inline void update(int d) {
t[d].sum3 = (t[d << 1].sum3 + t[d << 1 | 1].sum3) % mod;
t[d].sum2 = (t[d << 1].sum2 + t[d << 1 | 1].sum2) % mod;
t[d].sum = (t[d << 1].sum + t[d << 1 | 1].sum) % mod;
}
inline void calc(int &a, int &b, int &c, int &d, matrix &mt) {
int vec[4] = {a, b, c, d}, res[4] = {0, 0, 0, 0};
for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) res[i] = (res[i] + 1ll * vec[j] * mt.x[i][j]) % mod;
a = res[0], b = res[1], c = res[2], d = res[3];
}
inline void pushdown(int d) {
calc(t[d << 1].sum3, t[d << 1].sum2, t[d << 1].sum, t[d << 1].len, t[d].tag);
calc(t[d << 1 | 1].sum3, t[d << 1 | 1].sum2, t[d << 1 | 1].sum, t[d << 1 | 1].len, t[d].tag);
t[d << 1].tag = t[d << 1].tag * t[d].tag;
t[d << 1 | 1].tag = t[d << 1 | 1].tag * t[d].tag;
t[d].tag = I;
}
void build(int d, int l, int r) {
t[d].tag = I, t[d].len = r - l + 1;
if(l == r) {
t[d].sum3 = 0;
t[d].sum2 = 1ll * a[l] * a[l] % mod;
t[d].sum = a[l];
return;
}
int md = l + r >> 1;
build(d << 1, l, md), build(d << 1 | 1, md + 1, r);
update(d);
}
void modify(int d, int l, int r, int dl, int dr, int x) {
if(dl > dr) return;
if(dl <= l && r <= dr) {
matrix tmp;
tmp.x[0][0] = tmp.x[0][1] = 1, tmp.x[0][2] = 2ll * x % mod, tmp.x[0][3] = 1ll * x * x % mod;
tmp.x[1][1] = 1, tmp.x[1][2] = 2ll * x % mod, tmp.x[1][3] = 1ll * x * x % mod;
tmp.x[2][1] = 0, tmp.x[2][2] = 1, tmp.x[2][3] = x;
tmp.x[3][1] = tmp.x[3][2] = 0, tmp.x[3][3] = 1;
t[d].tag = tmp * t[d].tag;
t[d].sum2 = (t[d].sum2 + 2ll * t[d].sum * x % mod + 1ll * x * x % mod * (r - l + 1) % mod) % mod;
t[d].sum = (t[d].sum + 1ll * (r - l + 1) * x % mod) % mod;
t[d].sum3 = (t[d].sum3 + t[d].sum2) % mod;
// cout << l << ' ' << r << ' ' << t[d].sum3 << ' ' << t[d].sum2 << ' ' << t[d].sum << '\n';
return;
}
if(t[d].tag != I) pushdown(d);
int md = l + r >> 1;
if(dl <= md) modify(d << 1, l, md, dl, dr, x);
if(dr > md) modify(d << 1 | 1, md + 1, r, dl, dr, x);
update(d);
}
int ask(int d, int l, int r, int dl, int dr) {
// cout << d << ' ' << l << ' ' << r << '\n';
if(dl <= l && r <= dr) return t[d].sum3;
if(t[d].tag != I) pushdown(d);
int md = l + r >> 1, ans = 0;
if(dl <= md) ans = ask(d << 1, l, md, dl, dr);
if(dr > md) ans = (ans + ask(d << 1 | 1, md + 1, r, dl, dr)) % mod;
return ans;
}
inline void solve() {
cin >> n >> m >> q;
for(int i = 1; i <= n; ++i) cin >> a[i];
op[0] = {1, n, 0};
for(int i = 1; i <= m; ++i) cin >> op[i].l >> op[i].r >> op[i].x;
for(int i = 1; i <= q; ++i) {
int l, r, x, y;
cin >> l >> r >> x >> y;
qry[i] = {l, r, x - 1, -1, i}, qry[i + q] = {l, r, y, 1, i};
}
q <<= 1, sort(qry + 1, qry + 1 + q, [&](auto x, auto y) { return x.t < y.t; });
build(1, 1, n);
// for(int j = 1; j <= n; ++j) cout << ask(1, 1, n, j, j) << ' '; cout << '\n';
int now = 0;
while(now < q && qry[now + 1].t == -1) ++now;
for(int i = 0; i <= m; ++i) {
modify(1, 1, n, 1, op[i].l - 1, 0);
modify(1, 1, n, op[i].l, op[i].r, op[i].x);
modify(1, 1, n, op[i].r + 1, n, 0);
// for(int j = 1; j <= n; ++j) cout << ask(1, 1, n, j, j) << ' '; cout << '\n';
while(now < q && qry[now + 1].t <= i) {
++now;
if(qry[now].sgn == 1) ans[qry[now].id] = (ans[qry[now].id] + ask(1, 1, n, qry[now].l, qry[now].r)) % mod;
else ans[qry[now].id] = (ans[qry[now].id] - ask(1, 1, n, qry[now].l, qry[now].r) + mod) % mod;
}
}
for(int i = 1; i <= q / 2; ++i) cout << ans[i] << '\n';
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
for(int i = 0; i < 4; ++i) I.x[i][i] = 1;
solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 38132kb
input:
3 1 1 8 1 6 2 3 2 2 2 0 0
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 4ms
memory: 37456kb
input:
4 3 3 2 3 2 2 1 1 6 1 3 3 1 3 6 2 2 2 3 1 4 1 3 4 4 2 3
output:
180 825 8
result:
ok 3 number(s): "180 825 8"
Test #3:
score: -100
Wrong Answer
time: 4ms
memory: 37664kb
input:
100 107 180 -280960553 266308104 -997644864 856103777 592874377 674379235 -946339772 641750362 642418716 -360811715 -555543246 206614021 358239245 349842656 983198973 807518446 -66612455 -980932737 109826132 -109676067 51226145 452115561 -42729559 -950621304 -87009773 714026474 375317493 693260053 -...
output:
598274137 216047279 227840217 924161040 401200874 512520722 389200838 155583656 306814597 -161908131 892737145 480690173 747595054 427386659 365225281 -422768331 312392709 96086750 132125252 129557277 788224590 891101987 208453584 818693008 810885359 402958198 763091408 496361146 805214449 742215606...
result:
wrong answer 1st numbers differ - expected: '400489222', found: '598274137'