mod不是只会影响常数吗,为什么还会影响答案。具体我写在注释里的,麻烦大佬看看。
#include<bits/stdc++.h>
#define N 4000005
#define int long long
#define mod 1000000007
using namespace std;
int n, k, ans;
vector<int>p[N];
int c1[N * 4], c2[N * 4];
int tag[N * 4];
void maketag(int u, int L, int R, int x) {
c2[u] += x * x * (R - L + 1) + 2 * c1[u] * x ;
c1[u] += x * (R - L + 1) % mod;
tag[u] += x;
}
void pushdown(int u, int L, int R) {
int mid = (L + R) / 2;
maketag(u * 2, L, mid, tag[u]);
maketag(u * 2 + 1, mid + 1, R, tag[u]);
tag[u] = 0;
}
void pushup(int u) {
//c1[u] = (c1[u * 2] + c1[u * 2 + 1]) % mod;
//c2[u] = (c2[u * 2] + c2[u * 2 + 1]) % mod;
//删掉mod就AC,不删就WA
c1[u] = c1[u * 2] + c1[u * 2 + 1];
c2[u] = c2[u * 2] + c2[u * 2 + 1];
}
void update(int u, int L, int R, int l, int r, int x) {
if(l <= L && R <= r) {
maketag(u, L, R, x);
return;
}
if(r < L || R < l) return;
int mid = (L + R) / 2;
pushdown(u, L, R);
update(u * 2, L, mid, l, r, x);
update(u * 2 + 1, mid + 1, R, l, r, x);
pushup(u);
}
int query(int u, int L, int R, int l, int r) {
if(l <= L && R <= r) return c2[u];
if(r < L || R < l) return 0;
int mid = (L + R) / 2;
pushdown(u, L, R);
return query(u * 2, L, mid, l, r) + query(u * 2 + 1, mid + 1, R, l, r);
}
signed main() {
cin >> n >> k;
if(k == 1) {
for(int i = 1; i <= n; i++)
ans = (ans + i * (n - i + 1) % mod) % mod;
for(int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
if(u > v) swap(u, v);
ans = (ans - u * (n - v + 1) % mod + mod) % mod;
}
cout << ans;
}
else {
for(int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
p[max(u, v)].push_back(min(u, v));
}
for(int r = 1; r <= n; r++) {
update(1, 1, n, 1, r, 1);
for(int i = 0; i < p[r].size(); i++) {
int j = p[r][i];
update(1, 1, n, 1, j, -1);
}
ans = (ans + query(1, 1, n, 1, r)) % mod;
}
cout << ans << endl;
}
return 0;
}