Zijian-lv #3 树句节狗提
2024-09-26 05:43:15
如你所见,这是一道狗题
一棵树,多次询问与一个点距离至少为 $k$ 的点的权值和
$n,q \leq 2525010$
sol:
长链剖分
需要注意的是这道题卡空间
我把我所有的 vector 换成链表才过了
#include <bits/stdc++.h>
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
int x = , f = ; char ch;
for (ch = getchar(); !isdigit(ch); ch = getchar()) if (ch == '-') f = -f;
for (; isdigit(ch); ch = getchar()) x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n, q, lim;/*
vector<pair<int, int> > qs[maxn];
vector<int> G[maxn];*/
int qcd[maxn];
struct Chain {
int head[maxn], nx[maxn], id[maxn], sz;
Chain() {memset(head, , sizeof(head)); sz = ;}
inline void AddItem(int pos, int Item, int other = -) {
id[++sz] = Item;
nx[sz] = head[pos];
head[pos] = sz;
if(~other) qcd[sz] = other;
}
}qs, G;
LL ans[maxn], pool[maxn], *f[maxn], *now=pool+;
int a[maxn];
void print(int q, LL* ans, int lim) {
LL res;
for(int i = ; i <= q; ) {
res = ;
for(int j = i; j <= min(q, i + lim - ); j++) res ^= ans[j];
i += lim;
printf("%lld\n", res);
}
return ;
}
int mxs[maxn], mxd[maxn];
void dfs(int x) {
mxd[x] = ;
for(int i=G.head[x];i;i=G.nx[i]) {
dfs(G.id[i]);
mxd[x] = max(mxd[x], mxd[G.id[i]] + );
if((mxd[G.id[i]] > mxd[mxs[x]])) mxs[x] = G.id[i];
}
}
void solve(int x) {
if(mxs[x]) {
f[mxs[x]] = f[x] + ;
solve(mxs[x]);
}
f[x][] = a[x];
for(int i=G.head[x];i;i=G.nx[i]) {
if(G.id[i] == mxs[x]) continue;
f[G.id[i]] = now; now += mxd[G.id[i]] + ; solve(G.id[i]);
rep(j, , mxd[G.id[i]]) f[x][j+] += f[G.id[i]][j];
//cout << "to: " << to << " " << f[x][1] << endl;
}
//cout << x << " " << f[x][1] << endl;
/*dwn(i, mxd[x]-1, 0) {
cout << f[x][i] << " jiale " << f[x][i + 1] << endl;
f[x][i] += f[x][i + 1];
}*/
f[x][] += f[x][];
for(int i=qs.head[x];i;i=qs.nx[i]) {
if(qs.id[i] > mxd[x]) ans[qcd[i]] = ;
else ans[qcd[i]] = f[x][qs.id[i]];
}/*
if(qs[x].size()) {
// cout << "DEBUG: " << qs[x].first << " " << qs[x].second << " " << f[x][qs[x].first] << endl;
// if(qs[x].first > mxd[x]) ans[qs[x].second] = 0;
// else
/*cout << "x: " << x << endl;
rep(i, 0, mxd[x])
cout << f[x][i] << " ";
cout << endl;*/
/*
for(auto ii : qs[x]) {
//cout << "DEBUG: " << ii.first << " " << mxd[x] << endl;
if(ii.first > mxd[x]) ans[ii.second] = 0;
else ans[ii.second] = f[x][ii.first];
}
}*/
}
int main() {
n = read(); int x, y;
rep(i, , n) a[i] = read();
rep(i, , n) {
//x = read(), G[x].push_back(i);
x = read();
G.AddItem(x, i);
}
q = read();
rep(i, , q) {
x = read(); y = read();
//qs[x].push_back(make_pair(y, i));
qs.AddItem(x, y, i);
} mxd[] = -;
dfs();
f[] = now; now += mxd[] + ; solve();
lim = read();
print(q, ans, lim);
//rep(i, 1, q) cout << ans[i] << endl;
}
论我的没 log 跑得没别人带 log 快
最新文章
- SSH框架使用注解简化代码
- SQLServer-----Union,Union All的使用方法
- 参加MVP OpenDay 和2015 MVP Community Camp社区大课堂
- UI控件闪烁及刷新
- spring beans
- java 24 - 10 GUI 之 四则预算的数据校验
- 种类并查集(POJ 1703)
- compareTo,Comparator和equals
- slf4j提示Class path contains multiple SLF4J bindings
- Microsoft.AlphaImageLoader滤镜解说
- Nginx + PHP 缓存详解
- 异步调用backgroudworker
- Silverlight闹钟
- Ibatis 后台打印完整的sql语句
- Java NIO 完全学习笔记(转)
- eclipse 导入 Maven 多模块项目
- jenkins~集群分发功能的具体实现
- loadrunner基础学习笔记八-分析场景
- Oracle GoldenGate常用配置端口
- Linux Shell脚本入门--wc命令
热门文章
- PHP/Yii2操作Cookie,常见问题以及注意事项
- asp.net 下载图片
- Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁
- python中的值传递和引用传递
- Hearbeat 工作原理
- 20165101刘天野 2017-2018-2 《Java程序设计》第7周学习总结
- Go 外部排序-网络版
- codeforces Codeforces Round #318 div2 A. Bear and Elections 【优先队列】
- HTTP与HTTPS有什么区别?
- java基础9(IO流)-File类