首页 > 其他分享 >CF1055F Tree and XOR

CF1055F Tree and XOR

时间:2023-12-23 20:45:27浏览次数:32  
标签:cnt XOR trie ll Tree int lst maxn CF1055F

这道题代码虽然比较短,但花了我整整一天才过,太菜了

这是 CF241B 的加强版,但是有点不同,因为 CF241B 后半部分求前 \(k\) 大的和没法优化了,而这道题能把前面的求第 \(k\) 小时间复杂度优化到单 log ,但是需要注意这道题开 trie 完全开不下,所以肯定没法 trie 上二分做到单 log

对于某些二进制的题,只要没顺序影响,一位一位算贡献是可行的。然后对于这道题,我只需要枚举每一位考虑异或出来的是填 0 还是填 1 ,此时假设考虑到了第 \(i\) 位,如果我填 0 能够异或出来符合要求的对数 \(cnt\) 小于 \(k\) 的话,那么我显然是填 1 ,然后是求 \(k-cnt\) ,如果能填0,就填 0 。统计的话不难,对每个元素遍历统计子数内元素个数就行了。

注意统计和算答案都需要对每个元素都搞个指针记录一下,统计完直接分上述两种情况移指针就可以了

然后就会 MLE ,滚动一下 trie ,相当于就是我把普通建立 trie 的循环交换了顺序,就能滚动数组,统计答案只和这一层有关系,需要记录上一层的指针是指 trie 中的哪个节点,每次每个节点就重新往下一层递进,同时预处理下统计的数组就行了,注意要开 long long 。

可能是我写的丑,太菜了,感觉细节多

#include<bits/stdc++.h>
#define il inline 
#define maxn 1000001
using namespace std;
typedef long long ll; 
template<class T>
il T read(){
	char c;T x=0,f=0;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))x=(x*10)+(c^48),c=getchar();
	return f?-x:x;
}
int n;
ll k,a[maxn];
int trie[maxn][2],p[maxn],cnt[maxn],tot=1,lst[maxn];
il ll calc(int pos){
	ll tmp=0;
	for(int i=1;i<=n;i++){
		int c=(a[i]>>pos)&1;
		if(trie[p[i]][c])tmp+=cnt[trie[p[i]][c]];
	}
	return tmp;
}
signed main(){
	n=read<int>(),k=read<ll>();
	for(int i=2;i<=n;i++){
		int v=read<int>();ll w=read<ll>();
		a[i]=a[v]^w;
	}
	for(int i=1;i<=n;i++)p[i]=1,lst[i]=1;
	ll kth=0;
	for(int i=62;i>=0;i--){
		//统计当前这个位置,有多少个对数异或为0 
		for(int j=0;j<=tot;j++)trie[j][0]=trie[j][1]=cnt[j]=0;
		tot=1;
		for(int j=1;j<=n;j++){
			int c=(a[j]>>i)&1;
			if(!trie[lst[j]][c])trie[lst[j]][c]=++tot;
			lst[j]=trie[lst[j]][c],cnt[lst[j]]++;
		}
		ll os=calc(i),flag=0;
		if(os<k)kth+=(1ll<<i),k-=os,flag=1;
		for(int j=1;j<=n;j++){
			int c=(a[j]>>i)&1;
			if(flag){
				if(trie[p[j]][c^1])p[j]=trie[p[j]][c^1];
				else p[j]=0;
			}
			else{
				if(trie[p[j]][c])p[j]=trie[p[j]][c];
				else p[j]=0;
			}
		}
	}
	printf("%lld\n",kth);
	return 0;
}

标签:cnt,XOR,trie,ll,Tree,int,lst,maxn,CF1055F
From: https://www.cnblogs.com/blueparrot/p/17923586.html

相关文章

  • 牛客2022多校DAY10-K You are given a tree
    「牛客2022多校DAY10-K」Youaregivenatree...简要题意给一棵带点权和边权的树,找到至多\(k\)个点权不同的点,使得它们之间路径覆盖的边权和最大。\(n\le5000,k\le5\)。Solution考虑颜色数量不大的时候怎么暴力。显然可以直接状压DP,压一下当前选择的颜色集合为\(S\),......
  • [ATdp v] Subtree
    [ATdpv]Subtree思路不难想到令\(f_u\)表示\(u\)子树内满足条件的答案数。有\[f_{u}=\prod_{v\inson_{u}}(f_v+1)\]然后换根求出\(g\)表示整棵树里的答案:\[g_u=(\dfrac{g_{fa}}{f_u+1}+1)f_u\]但是你会发现取模之后不一定有逆元,很尴尬。所以如果把\(f_......
  • QTreeWidget使用小案例
    一、概述使用QTreeWidget制作一个树形菜单。示例图: 二、代码示例#include"TreeWidgetExampleWindow.h"TreeWidgetExampleWindow::TreeWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TreeWidget组件");QVBoxLayout*......
  • Js 之treeTable树状表格
    一、下载/**树形表格3.xCreatedbywangfanon2020-05-12https://gitee.com/whvse/treetable-lay*/layui.define(['laytpl','form','util'],function(exports){var$=layui.jquery;varlaytpl=layui.laytpl;varform......
  • 【c# winform】devexpress treeList右键菜单添加按钮
    本文提供俩种不需要手动添加编辑控件方法。方法一:创建新的右键菜单添加“执行选择”按钮,且抑制TreeList自带菜单结果展示: 代码: privatevoidForm1_Load(objectsender,EventArgse){CreateBarButtonItem();}privatevoidCreateBarButtonItem(){//创建右键......
  • [Ynoi2007]rfplca/[CF1491H] Yuezheng Ling and Dynamic Tree
    题目描述给定一棵大小为\(n\)的\(1\)为根节点的树,树用如下方式给出:输入\(a_2,a_3,\dots,a_n\),保证\(1\leqa_i<i\),将\(a_i\)与\(i\)连边形成一棵树。接下来有\(m\)次操作,操作有两种:1lrx令\(a_i=\max(a_i-x,1)(l\leqi\leqr)\)。2uv查询在当前的\(a\)......
  • Binary Tree Level Order Traversal II
    SourceGivenabinarytree,returnthebottom-uplevelordertraversalofitsnodes'values.(ie,fromlefttoright,levelbylevelfromleaftoroot).ExampleGivenbinarytree{3,9,20,#,#,15,7},3/\920/\157return......
  • a-tree-select的使用案例
    <a-tree-select:maxTagCount="6"@deselect="deSelectQueryDetailTreeData"@select="initQueryDetailTreeData"style="width:270px"v-mod......
  • CF1593E-Gardener-and-Tree-题解
    title:CF1593EGardenerandTree题解date:2022-05-2721:30:48categories:-题解原题面题意:给出一个\(n\)个点的树,删除\(k\)次叶子节点,求剩下的节点数。思路:设\(cnt_i\)为\(k\)最小为多少时点\(i\)会被删除。当\(i\)将要被删除时,它一定是现在的叶子,联......
  • vscode中Todo Tree插件的使用
    vscode中TodoTree插件的使用配置JSON将下方的JSON代码放入用户配置中复制JSON配置后,点击这里,然后粘贴。"todo-tree.tree.showScanModeButton":false,"todo-tree.filtering.excludeGlobs":["**/node_modules","*.xml","*.XML"],"todo......