如你所见,这是一道狗题

一棵树,多次询问与一个点距离至少为 $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 快

最新文章

  1. SSH框架使用注解简化代码
  2. SQLServer-----Union,Union All的使用方法
  3. 参加MVP OpenDay 和2015 MVP Community Camp社区大课堂
  4. UI控件闪烁及刷新
  5. spring beans
  6. java 24 - 10 GUI 之 四则预算的数据校验
  7. 种类并查集(POJ 1703)
  8. compareTo,Comparator和equals
  9. slf4j提示Class path contains multiple SLF4J bindings
  10. Microsoft.AlphaImageLoader滤镜解说
  11. Nginx + PHP 缓存详解
  12. 异步调用backgroudworker
  13. Silverlight闹钟
  14. Ibatis 后台打印完整的sql语句
  15. Java NIO 完全学习笔记(转)
  16. eclipse 导入 Maven 多模块项目
  17. jenkins~集群分发功能的具体实现
  18. loadrunner基础学习笔记八-分析场景
  19. Oracle GoldenGate常用配置端口
  20. Linux Shell脚本入门--wc命令

热门文章

  1. PHP/Yii2操作Cookie,常见问题以及注意事项
  2. asp.net 下载图片
  3. Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁
  4. python中的值传递和引用传递
  5. Hearbeat 工作原理
  6. 20165101刘天野 2017-2018-2 《Java程序设计》第7周学习总结
  7. Go 外部排序-网络版
  8. codeforces Codeforces Round #318 div2 A. Bear and Elections 【优先队列】
  9. HTTP与HTTPS有什么区别?
  10. java基础9(IO流)-File类