[HNOI2015] 开店
1.P2048 [NOI2010] 超级钢琴 RMQ + Heap2.【CDQ分治】 CF641E3.生活在树上(hard version) 树上差分4.【牛逼做法】P4186 Cow at Large5.P3519 [POI2011]ROZ-Difference6.【CF1146F】Leaf Partition7.【CF1715E】Long Way Home8.【CF678F】Lena and Queries9.【CF1797F】Li Hua and Path10.P9170 填数游戏 贺题记录11.P7316 [COCI2018-2019#3] NLO12.P5471 [NOI2019] 弹跳13.【经典例题】P6822 [PA2012] Tax14.【差分 Trick】CF626F Group Projects15.CF1556G Gates to Another World16.【树论典题。】P6071 『MdOI R1』Treequery17.神秘哈希题。18.【树论,计数】Centroid Probabilities19.【Tricks,典】[ARC085F] NRE20.【拆贡献】CF1422F Boring Queries21.【OGF、Lucas】P4640 [BJWC2008] 王之财宝22.【Quick Hull】P3236 [HNOI2014] 画框23.【很难啊、拆分数、观察】P6944 [ICPC2018 WF] Gem Island24.「突刺贯穿第二分块」P4117 [Ynoi2018] 五彩斑斓的世界25. 【LCT 维护子树信息】CF916E Jamie and Tree26.【线段树合并、虚树】P5327 [ZJOI2019] 语言27.【树套树,LCT,出栈序】P4027 [NOI2007] 货币兑换28.【边双,dp】P8867 [NOIP2022] 建造军营29.【历史和】P8868 [NOIP2022] 比赛30.CF1083D31.CF1486F
32.[HNOI2015] 开店
33.【LCT、树状数组】CF1137F Matches Are Not a Child's Play34.【链交理论】CF1336F Journey35.【树论典题】P5642 人造情感(emotion)36.【友谊就是魔法!!】CF453E37.CF1109E、CF1109F38.P10083 [GDKOI2024 提高组] 不休陀螺39.洛谷博客杂题 #1妈的,杀软动态点分治。
你考虑建出点分树,然后把所有子树塞进该点。
根据经典结论 然后我们考虑每次按照 来排序,做前缀和,然后我们发现每次我们只需要查询一段区间和,使用二分查找即可。
注意容斥,具体来说,就是考虑在 的时候容斥掉 这一类的贡献,可以在建树的时候计算 即可,然后我们用子树大小减去不合法的再乘上 即可。
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
using namespace std;
typedef long long ll;
const int _ = 2e5 + 5, mod = 998244353, inf = 0x3f3f3f3f;
int power (int x, int y) {
int ret = 1;
for ( ; y; y >>= 1, x = 1ll * x * x % mod)
if (y & 1) ret = 1ll * ret * x % mod;
return ret;
}
void add (int & x, int y) { x = x + y >= mod ? x + y - mod : x + y; }
int mul (int x, int y) { return 1ll * x * y % mod; }
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
using namespace std;
typedef long long ll;
const int _ = 2e5 + 5, mod = 998244353, inf = 0x3f3f3f3f;
int power (int x, int y) {
int ret = 1;
for ( ; y; y >>= 1, x = 1ll * x * x % mod)
if (y & 1) ret = 1ll * ret * x % mod;
return ret;
}
void add (int & x, int y) { x = x + y >= mod ? x + y - mod : x + y; }
int mul (int x, int y) { return 1ll * x * y % mod; }
int n, q, A, mxs, all, rt, fa[_];
int a[_];
int sz[_], dis[_], dep[_], son[_], top[_], pa[_];
bool vis[_];
ll lst;
struct Info {
int v;
ll s;
bool operator < (const Info & x) const { return v < x. v; }
} ;
vector <pair<int, int> > e[_];
vector <Info> v[2][_];
void dfs1 (int x, int fa) {
sz[x] = 1;
pa[x] = fa, dep[x] = dep[fa] + 1;
for (auto & [y, w] : e[x]) {
if (y == fa) continue ;
dis[y] = dis[x] + w;
dfs1(y, x), sz[x] += sz[y];
if (sz[y] > sz[son[x]]) son[x] = y;
}
}
void dfs2 (int x, int anc) {
top[x] = anc;
if (son[x]) dfs2(son[x], anc);
for (auto & [y, w] : e[x]) if (y ^ pa[x] && y ^ son[x]) dfs2(y, y);
}
int dist (int x, int y) {
int ret = dis[x] + dis[y], lc;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap(x, y);
x = pa[top[x]];
}
lc = dep[x] < dep[y] ? x : y;
return ret - dis[lc] * 2;
}
void getrt (int x, int anc) {
sz[x] = 1;
int ms = 0;
for (auto & [y, w] : e[x]) {
if (vis[y] || y == anc) continue ;
getrt(y, x), sz[x] += sz[y], ms = max(ms, sz[y]);
}
ms = max(all - sz[x], ms);
if (ms < mxs) rt = x, mxs = ms;
}
void dfs3 (int x, int anc, int d) {
sz[x] = 1;
v[0][rt].push_back({a[x], d});
if (fa[rt]) v[1][rt].push_back({a[x], dist(fa[rt], x)});
for (auto & [y, w] : e[x]) {
if (y == anc || vis[y]) continue ;
dfs3(y, x, d + w);
sz[x] += sz[y];
}
}
void build (int x) {
// cout << x << endl;
vis[x] = 1, dfs3(x, 0, 0);
for (auto & [y, w] : e[x]) {
if (vis[y]) continue ;
all = mxs = sz[y], rt = 0;
getrt(y, x), fa[rt] = x;
build(rt);
}
}
ll query (int op, int x, int l, int r, ll &len) {
int lp = lower_bound(v[op][x].begin(), v[op][x].end(), (Info){l, 0}) - v[op][x].begin() - 1,
rp = upper_bound(v[op][x].begin(), v[op][x].end(), (Info){r, 0}) - v[op][x].begin() - 1;
len = rp - lp;
ll ret = 0;
if (lp >= 0 && lp < v[op][x].size()) ret -= v[op][x][lp].s;
if (rp >= 0 && rp < v[op][x].size()) ret += v[op][x][rp].s;
return ret;
}
int main() {
/*
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
黛拉可玛莉·岗德森布莱德,一亿年一遇美少女。
*/
cin >> n >> q >> A;
rep(i, 1, n) scanf("%d", & a[i]);
rep(i, 1, n - 1) {
int x, y, z;
scanf("%d%d%d", & x, & y, & z);
e[x].push_back({y, z}), e[y].push_back({x, z});
}
dfs1(1, 0), dfs2(1, 1);
all = mxs = n, getrt(1, 0), build(rt);
rep(x, 1, n) {
sort(v[0][x].begin(), v[0][x].end()),
sort(v[1][x].begin(), v[1][x].end());
for (int j = 1; j < v[0][x].size(); j ++)
v[0][x][j].s += v[0][x][j - 1].s;
for (int j = 1; j < v[1][x].size(); j ++)
v[1][x][j].s += v[1][x][j - 1].s;
}
while (q --) {
int x, l, r;
ll p, q;
scanf("%d%lld%lld", & x, & p, & q);
l = min((p + lst) % A, (q + lst) % A),
r = max((p + lst) % A, (q + lst) % A);
ll t1, t2;
lst = query(0, x, l, r, t1);
for (int pos = x; fa[pos]; pos = fa[pos]) {
lst += query(0, fa[pos], l, r, t1) - query(1, pos, l, r, t2);
lst += (t1 - t2) * dist(fa[pos], x);
}
printf("%lld\n", lst);
}
return 0;
}
刘伟在知乎上被找到帐号不是很正常。
登高自卑,行远自迩。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现