首页 > 其他分享 >Codeforces 1824C LuoTianyi and XOR-Tree

Codeforces 1824C LuoTianyi and XOR-Tree

时间:2024-04-19 15:11:36浏览次数:23  
标签:std 1824C cnt XOR limits int max sum LuoTianyi

考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。

于是有个 \(\text{DP}\) 的思路。
记 \(f_{u, i}\) 为 \(u\) 子树内叶子节点的值都变为 \(i\) 的最小代价。
这个有一个很好的性质,就是 \(\max f_{u, i} - \min f_{u, i} = 1\)。
这是因为考虑取到 \(\min\) 的 \(f_{u, i}\),考虑把点 \(u\) 的点权改为 \(i\oplus j\),那么就会全变成 \(j\) 了,相当于还有转移式 \(f_{u, i} + 1\to f_{u, j}\)。

那么就可以考虑只维护 \(f_u = \min f_{u, i}\) 以及取到 \(\min\) 的集合 \(S_u\)。
那么转移式有 \(f_{u, i} = \sum\limits_v (f_v + 1 - [i\in S_v])\),也就是相当于考虑 \(f_{v, i}\) 是 \(f_{v}\) 还是 \(f_{v} + 1\)。
那么对于 \(f_u\) 的转移就是 \(f_u = \sum\limits_v (f_v + 1) - \max\limits_i \sum\limits_v [i\in S_v]\)。
同时 \(S_u\) 中的元素就是取到 \(\max\limits_i \sum\limits_v [i\in S_v]\) 的 \(i\)。

对于统计 \(\max\limits_i \sum\limits_v [i\in S_v]\) 和对应的 \(i\),可以考虑启发式合并。
首先可以直接把 \(S_v\) 并进 \(S_u\),同时维护 \(\max\) 的值。
如果 \(\max = 1\),那么 \(S_u\) 里面的都符合条件。
否则考虑暴力去查找 \(S_u\) 里面的值的出现次数,只有 \(= \max\) 才留下。

考虑复杂度,因为需要暴力查找的肯定是 \(\max > 2\) 的情况,所以此时最后 \(|S_u|\le \frac{\sum\limits_{v} |S_v|}{2}\),那么这个也是个折半的思想,遍历的次数不会超过 \(O(n\log n)\)。

可以使用 setmap 来维护 \(S\)。

时间复杂度 \(O(n\log^2 n)\)。

代码
#include<bits/stdc++.h>
const int maxn = 1e5 + 10;
std::set<int> s[maxn];
int f[maxn];
std::vector<int> to[maxn];
int a[maxn];
void dfs(int u) {
   if (to[u].empty())
      return s[u].insert(a[u]), void();
   std::map<int, int> cnt;
   for (int v : to[u]) {
      to[v].erase(std::find(to[v].begin(), to[v].end(), u));
      a[v] ^= a[u];
      dfs(v);
      f[u] += f[v] + 1;
      if (s[u].size() < s[v].size())
         std::swap(s[u], s[v]);
      for (int x : s[v])
         if (s[u].count(x)) cnt[x]++;
         else s[u].insert(x);
   }
   if (! cnt.empty()) {
      int mx = 0;
      for (auto _ : cnt)
         mx = std::max(mx, _.second);
      f[u] -= mx + 1;
      s[u].clear();
      for (auto _ : cnt)
         if (_.second == mx)
            s[u].insert(_.first);
   } else
      f[u]--;
}
int main() {
   int n;
   scanf("%d", &n);
   for (int i = 1; i <= n; i++)
      scanf("%d", &a[i]);
   for (int i = 1, x, y; i < n; i++) {
      scanf("%d%d", &x, &y);
      to[x].push_back(y), to[y].push_back(x);
   }
   dfs(1);
   printf("%d\n", f[1] + (! s[1].count(0)));
   return 0;
}

标签:std,1824C,cnt,XOR,limits,int,max,sum,LuoTianyi
From: https://www.cnblogs.com/rizynvu/p/18145914

相关文章

  • CF1788F XOR, Tree, and Queries
    CF1788FXOR,Tree,andQueries边权转点权+染色+构造首先对于限制,可以转化。设\(f_u\)表示\(1\)到\(u\)的异或和,那么限制\((u,v,w)\)就可以表示为\(f_u\oplusf_v=w\)。也就意味这如果我们将限制\((u,v,w)\)连边,要考虑的就变成\(f_u\)的赋值问题。这一步将边权转......
  • CF617E XOR and Favorite Number 题解
    想了好久才明白zz来源?:莫队题单题目大意给定一个长度为\(n\)的序列\(a\),然后再给一个数字\(k\),再给出\(m\)组询问,每组询问给出一个区间,求这个区间里面有多少个子区间的异或值为\(k\)。\(1\len,m\le10^5\)\(0\lek,a_i\le10^6\)\(1\lel_i,r_i\len\)题......
  • P4139TriangleXor
    数学#计数#容斥分为\(4\)个部分计算上面的按奇偶性分类下面的按每一层容斥,即\(siz_i-2\timessiz_{i-1}+siz_{i-2}\)左右直接对每一块计算面积//Author:xiaruizeconstintINF=0x3f3f3f3f3f3f3f3f;constintMOD=1000000007;constintN=2e5+10;intn;......
  • D. XOR Construction
    题解首先根据b1⊕b2=a1,b2⊕b3=a2...bj⊕bj+1=aj我们不难得出b1​⊕bj+1=a1⊕a2⊕a3....⊕aj因此我们只需要确定b1的值就能够确定其余所有bi的值,而题目又要求我们的b处于0~n-1范围内,这实际上实在寻找一个 b1​ 使得异或出来的所有值越小越好,所以我们拆位,假设所有数字的第 i ......
  • AtCoder Regular Contest 173 E Rearrange and Adjacent XOR
    洛谷传送门AtCoder传送门不妨考虑最后的结果可以成为哪些\(a_i\)的组合。为了方便分析,我们令\(a_i=2^{i-1}\)。进行一次操作后,所有\(\text{popcount}(a_i)\)都为偶数。所以一个\(x\in[0,2^n-1]\)能被生成出来的必要条件是\(\text{popcount}(x)\)为偶数。然......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • Atcoder ARC165D Xor Sum 5
    考虑到这个最终的答案是\(\oplus\),所以只需要考虑每种排列出现的次数的奇偶,如果为奇再计算贡献即可。考虑什么情况下出现次数为奇。令每个数出现的个数为\(c_{1\simn}\),方案数即为\(\dbinom{k}{c_1,c_2,\cdots,c_n}=\prod_{i=1}^n\dbinom{k-\sum\limits_{j=1}^{......
  • XOR Break — Solo Version
    题意思路最多两步解决1.一步:只要满足((n^m)<n)即可一步,只要在第一个mi=1的地方n也有1无论如何都可以随便改n得到m2.无解的情况:只要在第一个mi=1的时候n(i)->n(最高位-1)没有1出现肯定无法解决3.二步:类似于10110->0000110110->10101->00001只需......
  • TaxoRec部署与代码阅读
    部署环境Pytorch1.8.1Python3.7.3condacreate-npytorch-taxorecpython=3.7.3pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpletorch==1.8.1pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplegeoopt==0.2.0::根据geoot文档,geoot0.2.0以上版本安......
  • 从数据库中随机选取数据(基于golang,xorm)
    一、 从MySQL数据库中随机选取数据,可以使用SQL的 ORDERBYRAND() 语句来实现。具体步骤如下:定义一个结构体用于存储数据typeUserstruct{Idint64NamestringAgeint}建立与数据库的连接,并获取一个 Engine 实例engine,err:=xorm.NewE......