首页 > 其他分享 >[AGC052B] Tree Edges XOR 题解

[AGC052B] Tree Edges XOR 题解

时间:2023-11-30 22:01:42浏览次数:44  
标签:typedef ch XOR int 题解 long 权值 AGC052B define

题目链接

点击打开链接

题目解法

怎么感觉这场 \(B\) 比 \(C\) 思维量更大
考虑一步很妙的操作:把边权变成点权,以达到简化操作的目的
使每条边的边权为两端点的异或和,手画一下可以发现,操作简化成了交换两端点的点权

我们定义 \(d_{1/2,i}\) 定义为在 \(1/2\) 树上,\(i\) 到根的权值异或和
不难得到合法的必要条件是在所有的 \(d_{1,i}\oplus Delta\) 之后,\(d_1\) 和 \(d_2\) 这两个集合相等(如果直接用一开始的权值,而不用到根的权值异或和也能做,且做法基本相同)
因为点数为奇数,所以不难求得 \(Delta\) 的值
上面得到的条件是必要条件,而不是充分条件,所以最后需要判断一下

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=100100;
int n,w[2][N];
int e[N<<1],ne[N<<1],h[N],idx;
int d[2][N];
void dfs(int u,int fa){
    for(int i=h[u];~i;i=ne[i]) if(e[i]!=fa){
        F(k,0,1) d[k][e[i]]=d[k][u]^w[k][i/2];
        dfs(e[i],u);
    }
}
void add(int x,int y){ e[idx]=y,ne[idx]=h[x],h[x]=idx++;}
int main(){
    n=read();
    ms(h,-1);
    F(i,0,n-2){
        int x=read(),y=read();w[0][i]=read(),w[1][i]=read();
        add(x,y),add(y,x);
    }
    dfs(1,-1);
    int Delta=0;
    F(i,1,n) Delta^=d[0][i]^d[1][i];
    F(i,1,n) d[1][i]^=Delta;
    F(i,0,1) sort(d[i]+1,d[i]+n+1);
    F(i,1,n) if(d[0][i]!=d[1][i]){ puts("NO");exit(0);}
    puts("YES");
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:typedef,ch,XOR,int,题解,long,权值,AGC052B,define
From: https://www.cnblogs.com/Farmer-djx/p/17868467.html

相关文章

  • CF1684题解
    CF1684CodeforcesRound792(Div.1+Div.2)CF1684AlinkCF1684A题意有一个用十进制表示的没有前导零的正整数\(n\)。Alice和Bob正在用这个数玩一个游戏。Alice先手,他们轮流进行游戏。在她的这一轮中,Alice应该交换这个数中的任何不同位置的两位。轮到Bob时,他每次......
  • [AGC052C] Nondivisible Prefix Sums 题解
    题目链接点击打开链接题目解法好题!一个序列是不合法的,必定满足某些结论,我们不妨猜测一下首先如果和为\(P\)的倍数,必定不合法然后手玩几个可以发现,最极限的情况是\(P-1\)个\(1\;+\;\)\(b_i\;+\;\)\(P-b_i\)如果在这个情况下再加一个\(1\),就爆了其中\(1\)可以替......
  • CF689题解
    CF689CodeforcesRound361(Div.2)CF689AlinkCF689A题意题目描述迈克在海滩游泳时不小心将手机放入水中。他买了一个带有老式键盘的手机。键盘只有十个数字大小的键,位于以下方式:1234567890联系人与他的旧手机一起消失了,他现在只能记住他的手指......
  • 商家转账到零钱全攻略:开通、使用、区别与常见问题解答
    一、商家转账到零钱功能介绍微信作为中国最受欢迎的社交平台之一,其支付功能也相当强大。其中,商家转账到零钱功能可以让商家直接将款项转入用户的微信零钱,方便快捷。本文将详细介绍商家转账到零钱的功能、开通条件、使用方法以及常见问题解答。二、商家转账到零钱场景说明商家转......
  • axios(ajax)发送请求响应码200,但获取不到数据,无法加载响应数据: No datafound for res
    问题截图:没有响应数据控制台报错其实是由于浏览器的跨域资源共享(CORS)策略导致,前后端跨域请求是不行的。什么是域,看页面的url,比如https://www.baidu.com/下的网页都是属于baidu.com这个域。如果你是和我一样是从本地文件打开html的方式来调试ajax,那么一定会出现这个问题,因为本......
  • CF1846E2 Rudolf and Snowflakes (hard version) 题解
    题意:\(T\)\((\)\(1\)\(\le\)\(T\)\(\le\)\(10^4\)\()\)组询问:是否存在一个满\(k\)(\(k\)\(\ge\)\(2\)\()\)叉树节点数恰好为\(n\)\((\)\(1\)\(\le\)\(n\)\(\le\)\(10^{18}\)\()\),且深度\(depth\)至少为\(2\)。思路:满$k$......
  • luogu2839题解
    [国家集训队]middle题目分析代码如下。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;constintMAXN=2e4+10;intx,n,Q,a[MAXN],q[6],root[MAXN],b[MAXN],tot;vector<int>locp[MAXN];structSegmentTreeNode{......
  • CF1827C Palindrome Partition 题解
    题目链接点击打开链接题目解法首先考虑一个朴素的\(dp\)令\(f_i\)表示以\(i\)结尾的合法子串的个数为了不重不漏,我们令\(le_i\)表示以\(i\)为右端点,离\(i\)最近的偶回文串的左端点,然后不难得到转移为\(f_i=f_{le_i-1}+1\)为什么不会漏?考虑以\(i\)为右端点,且比......
  • NOIP2000提高组真题解析
    NOIP2000提高组真题解析第一题进制转换题目链接解析首先,我们知道对于10进制数x转2进制数,使用的算法是:求出x%2令x=x/2不断执行1,2,直至x为0,然后倒序输出步骤1的结果。一般可以用数组存步骤1的结果倒序输出或者使用dfs回溯回来再输出。对于负数的情况,比如\(-7=1*(-2)^3......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)Itisthehardversionoftheproblem.Theonlydifferenceisthatinthisversion$a_i\le10^9$.Youaregivenanarrayof$n$integers$a_0,a_1,a_2,\ldotsa_{n-1}$.Bryapwantstofindthelongestbeautifulsub......