社区讨论
WA on #1 求条
P8201[传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m419uzpo
- 此快照首次捕获于
- 2024/11/28 20:09 去年
- 此快照最后确认于
- 2025/11/04 13:44 4 个月前
rt.
显示
CPPwrong on 37。#include <bits/stdc++.h>
using namespace std;
const long long N = 500005;
long long n , m , len , w[N] , pre[N] , dep[N] , dis[N] , be[N] , siz[N] , son[N] , top[N] , st[N] , ed[N] , pos[N] , num = 0 , tot[10000005] , vis[N];
bool ans[N];
vector <long long> g[N];
long long read()
{
long long f = 1 , res = 0;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
res = res * 10 + ch - '0';
ch = getchar();
}
return f * res;
}
struct query
{
long long x , y , k , id , LCA;
};
query q[N];
long long cnt = 0;
bool cmp(query a , query b) {return (be[a.x] ^ be[b.x] ? a.x < b.x : (be[a.x] & 1 ? a.y < b.y : a.y > b.y));}
void dfs1(long long u , long long fa)
{
siz[u] = 1;
pre[u] = fa;
dis[u] = dis[fa] ^ w[u];
dep[u] = dep[fa] + 1;
for(auto v : g[u])
{
if(v == fa) continue;
dfs1(v , u);
siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(long long u , long long fa)
{
st[u] = ++num;
pos[num] = u;
be[num] = (num - 1) / len + 1;
if(!son[u]) return;
top[son[u]] = top[u];
dfs2(son[u] , u);
for(auto v : g[u])
{
if(v == fa || v == son[u]) continue;
top[v] = v;
dfs2(v , u);
}
ed[u] = ++num;
pos[num] = u;
be[num] = (num - 1) / len + 1;
}
long long lca(long long u , long long v)
{
while(top[u] != top[v])
{
if(dep[u] < dep[v]) swap(u , v);
u = pre[top[u]];
}
return dep[u] < dep[v] ? u : v;
}
void add(long long x)
{
vis[pos[x]] ^= 1;
if(vis[pos[x]]) tot[w[pos[x]]]++;
else tot[w[pos[x]]]--;
}
int main()
{
// freopen("P8201.in" , "r" , stdin);
// freopen("P8201.out" , "w" , stdout);
cin.tie(nullptr)->sync_with_stdio(false);
n = read(); m = read();
len = pow(n * 2 , 0.6);
for(long long i = 1 ; i <= n ; i++) w[i] = read();
long long u , v;
for(long long i = 1 ; i < n ; i++){u = read(); v = read(); g[u].push_back(v); g[v].push_back(u);}
sort(q + 1 , q + cnt + 1 , cmp);
dfs1(1 , 1);
top[1] = 1;
dfs2(1 , 1);
for(long long i = 1 , k ; i <= m ; i++)
{
u = read(); v = read(); k = read();
if(st[u] > st[v])
{
swap(u , v);
}
long long LCA = lca(u , v);
k = k ^ dis[u] ^ dis[v] ^ w[LCA];
q[++cnt].x = (LCA == u ? st[u] : ed[u]);
q[cnt].y = st[v];
q[cnt].k = k;
q[cnt].id = i;
q[cnt].LCA = LCA;
if(w[LCA] == q[cnt].k) {ans[i] = 1; cnt--;}
}
u = 1 , v = 0;
for(long long i = 1 ; i <= cnt ; i++)
{
while(u < q[i].x) add(u++);
while(u > q[i].x) add(--u);
while(v < q[i].y) add(++v);
while(v > q[i].y) add(v--);
ans[q[i].id] = tot[q[i].k];
}
for(long long i = 1 ; i <= m ; i++) cout << (ans[i] ? "yes\n" : "no\n");
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...