2019ICPC西安邀请赛E题,线段树+述链剖分+nim博弈

2017ICPC西安现场赛 XOR(线段树合并线性基) 题目链接:https://nanti.jisuanke.com/t/A1607 题目大意 :给你长度为n的序列,以及一个数k,有q次询问,每一次询问给你一个区间[L,R],然后你可以在区间内取任意多个数(每个数只能去一次),异或这些数得到一个值val,使得k|val的最值大,输出这个最大值 分析:或(|)操作,我们知道对应二进制为只要有一个1,结果就为1,所以我们让k|val最大,必须把k的高位0尽可能变为1,那么我们对k的二进制位取反得到一个数x,也变成了我们尽可能保留x的高位1,所以我们把原序列的所有数 阅读详情

Tree

https://nanti.jisuanke.com/t/39272
题意:给你一颗树,结点权值告诉你,你有如下三种操作
1 s t 修改从1到s的路径上的所有点,a[i]=a[i]|t
2 s t 修改从1到s的路径上的所有点,a[i]=a[i]&t
3 s t 询问将1到s的路径上的所有点作为石头堆,再加上一个个数为t的石头堆,进行一次尼姆(nim)博弈,先手胜利输出YES,否则输出NO

前置知识:
nim博弈先手的必胜条件为,n堆石头的异或和不为0,也即a[1] ^ a[2] ^a[3] . . .^a[n]!=0
所以问题就转为了a[1] ^ a[2] ^ a[] . . .^ a[s] ^ a[t]是否为0,为0输出YES,否则输出NO

分析:这道题的1,2操作是对树上的一条链进行|,&操作,所以需要用到树链剖分,并且用线段树去维护异或和,对于所有数的二进制的每一位,我们都需要开一颗线段树去维护,这里数最大1e9,所以二进制位最多31位,我们需要开31一颗线段树去分别维护即可.

AC代码:

#include<bits/stdc++.h>
#define ls dep<<1
#define rs dep<<1|1
using namespace std;
const int Maxn = 1e5+10;
struct Edge{
	int v;
	int next;
}edge[Maxn*2];
int head[Maxn];
int fa[Maxn];
int siz[Maxn];
int son[Maxn];
int dep[Maxn];
int dfn[Maxn];
int top[Maxn];
int a[Maxn];

int tim=0;
int sum[31][Maxn*4]={0};//线段树区间和 
int lz[31][Maxn*4]={0};//延迟标记
int cnt = 0;
int N,M;
void init(){
	memset(head,-1,sizeof(head));
	return ;
}
void build(int u,int v){
	edge[++cnt].v = v;
	edge[cnt].next = head[u];
	head[u] = cnt;
	edge[++cnt].v = u;
	edge[cnt].next = head[v];
	head[v] = cnt;
	return ;
} 
void dfs1(int u,int f){
	fa[u] = f;
	dep[u] = dep[f]+1;
	siz[u] = 1;
	int maxsonsize = -1;
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v = edge[i].v;
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>maxsonsize){
			maxsonsize = siz[v];
			son[u] = v;
		}
	}
	return ;
}
void dfs2(int u,int t){
	dfn[u] = ++tim;
	top[u] = t;
	if(!son[u]) return ;
	dfs2(son[u],t);
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v = edge[i].v;
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
	return ;
}
void pushup(int pos,int dep){
	sum[pos][dep] = sum[pos][ls]+sum[pos][rs];
	return ;
}
void pushdown(int pos,int dep,int l,int r){
	if(lz[pos][dep]==-1){
		int mid = l+r>>1;
	    lz[pos][ls]=lz[pos][rs]=-1;
	    sum[pos][ls]=sum[pos][rs] = 0;
	    lz[pos][dep] = 0;
	}
	else if(lz[pos][dep]==1){
		int mid = l+r>>1;
	    lz[pos][ls]=lz[pos][rs]=1;
	    sum[pos][ls]=(mid-l+1);
	    sum[pos][rs]=(r-mid);
	    lz[pos][dep] = 0;
	}
	return ;
}

void modify(int pos,int l,int r,int ql,int qr,int dep,int val){
	if(ql<=l&&r<=qr){
		if(val==-1) sum[pos][dep] = 0;
		else sum[pos][dep] = (r-l+1);
		lz[pos][dep] = val;
		return ;
	}
	pushdown(pos,dep,l,r);
	int mid = l+r>>1;
	if(ql<=mid) modify(pos,l,mid,ql,qr,ls,val);
	if(qr>mid) modify(pos,mid+1,r,ql,qr,rs,val);
	pushup(pos,dep);
	return ;
}
void mchain(int pos,int x,int y,int val){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		modify(pos,1,N,dfn[top[x]],dfn[x],1,val);
		x = fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	modify(pos,1,N,dfn[x],dfn[y],1,val);
	return ;
}

int query(int pos,int l,int r,int ql,int qr,int dep){
	if(ql<=l&&r<=qr){
		return sum[pos][dep];
	}
	pushdown(pos,dep,l,r);
	int ans = 0;
	int mid = l+r>>1;
	if(ql<=mid) ans+=query(pos,l,mid,ql,qr,ls);
	if(qr>mid)  ans+=query(pos,mid+1,r,ql,qr,rs);
	pushup(pos,dep);
	return ans;
}
int qchain(int pos,int x,int y){
	int ans = 0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=query(pos,1,N,dfn[top[x]],dfn[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=query(pos,1,N,dfn[x],dfn[y],1);
	return ans;
}
bool check(int pos,int val,int s){
	int ans = qchain(pos,1,s);
	ans&=1;
	if(ans&&val) return true;
	if(!ans&&!val) return true;
	return false;
} 
int main(){
	init();
	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++) scanf("%d",&a[i]);
	for(int i=1;i<N;i++){
		int u,v;
		scanf("%d %d",&u,&v);
		build(u,v);
	}
	dfs1(1,1);
	dfs2(1,1);
	for(int i=1;i<=N;i++){
		for(int k=0;k<31;k++){
			int val = (1<<k)&a[i];
			if(val) modify(k,1,N,dfn[i],dfn[i],1,1);
		}
	}
	while(M--){
		int op,s,t;
		scanf("%d %d %d",&op,&s,&t);
		if(op==1){
			for(int i=0;i<31;i++){
				int val = (1<<i)&t;
				if(val) mchain(i,1,s,1); 
			}
		}
		else if(op==2){
			for(int i=0;i<31;i++){
				int val = (1<<i)&t;
				if(!val) mchain(i,1,s,-1);
			}
		}
		else{
			int flag = 1;
			for(int i=0;i<31;i++){
				int val = (1<<i)&t;
				if(!check(i,val,s)){
					flag = 0;
					break;
				}
			}
			if(!flag) printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
} 
similarity network fusion for aggregating data types on a genomic scale 基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算 阅读详情

相关推荐

迅投miniQMT量化交易之【网格交易】的实现(25)——写在最后

和大家一起分享如何使用miniQMT实现我们自己的网格交易系统。如果您对量化交易感兴趣,欢迎一起交流。

tzzqn2008的专栏 829

2022icpc西安站部分题解-E

2022icpc西安站部分题解

m0_62676987的博客 2414

RenderDoc实战:5分钟搞定安卓Vulkan应用抓帧(含常见连接失败排查)

本文详细介绍了如何使用RenderDoc工具对安卓Vulkan应用进行抓帧分析,包括环境配置、完整抓帧流程及常见连接问题的解决方案。通过实战案例和高级技巧,帮助开发者快速定位渲染问题和性能瓶颈,提升移动图形开发效率。

weixin_28318011的博客 281

22年ICPC西安站记录

22年icpc西安站记录

m0_53688600的博客 1215

强化学习 之 Actor Critic

简介 Actor Critic是一种结合体算法: (1)Actor 的前生是 Policy Gradients,这能让它毫不费力地在连续动作中选取合适的动作,而 Q-learning 做这件事会瘫痪; (2)Critic 的前生是 Q-learning 或者其他的 以值为基础的学习法,能进行单步更新,而传统的 Policy Gradients 则是回合更新,这降低了学习效率。 算法思想 Actor...

Test_tju的博客 809

从开通VPS到搭建宝塔面板全教程

你在输入域名(此时我们可能没有类似aaa.com这样的域名,所以要输入VPS的IP地址)的时候,下面的根目录也会跟着变动,等输入完成后,你可以把根目录再改回成/www/wwwroot/dq。这时,在你的浏览器中,输入外网面板地址的URL,输入username和password,即可登陆宝塔面板。第一次登陆,需要绑定你的宝塔账号,你可以到宝塔的注册界面,用手机注册一个,然后绑定,首先看一下你的VPS操作系统是什么类型的(其实你在选择VPS的时候,就已经选定了,我选择的事Centos系统)。

kxltsuperr的专栏 3729

计蒜客-2017 ACM-ICPC 亚洲区(西安赛区)网络赛E题Coin(概率、组合数学)

计蒜客-2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face up is \frac{q}{p}(\frac{q}{p} \le \frac{1}{2}) ​p​q​​ (​p​​q​​ ≤​2​​1​​ ). The question is, when Bob tosses the coin kk times,

yo_bc的博客 526

fMRI数据处理:从DICOM到NIFTI(下)

上一篇我们完成了对原始DICOM的数据整理,将其整理为了BIDS目录结构。作为从从DICOM到NIFTI的最后一篇,当然是介绍如何批量将DICOM格式转NIFTI格式啦!从DICOM到NIFTI系列就完成啦!撒花★,°.°★。从核磁机器把数据拷回来——到整理成BIDS格式——到批量转格式;我们fMRI数据处理的第一步就算是正式迈出去啦!接下来的内容,敬请期待吧~

weixin_44933894的博客 2078

2019icpc 西安邀请赛 E - Tree 树刨,nim博弈

E - Tree 题目链接 题意 两个人玩游戏,每次有几堆石头,每个人可以选一堆石头,从里面拿走任意个,最后没有石头拿的人输。(这个博弈,经典的nim博弈) 现在有一棵树,有点权,有三种操作, 1 s t 1 ~ s路径上的节点的权值变为ai | t 2 s t 1 ~ s路径上的节点的权值变为ai & t 3 s t 用1 ~ s路径上的节点另加一堆t个石头来玩游戏,问先手的人会不会赢。 博弈跟这棵树没关系,只是用一下树的点权。。。 题解 nim博弈: 每堆石头有a1 a2 a3 …… ak个 那

qq_44784019的博客 262

边缘智能新篇章:RK3588上YOLOv8姿态估计的轻量化部署与性能优化实战

本文详细介绍了在RK3588平台上部署和优化YOLOv8姿态估计模型的完整流程。通过模型转换、ONNX中间表示和性能优化策略,实现在边缘设备上的高效实时推理,为嵌入式AI应用提供可行的轻量化解决方案。

ik6789012的博客 149

【查找单入口空闲区域】-python实现-附ChatGPT解析

时间限制:1s 空间限制: 256MB 限定语言:不限题目描述:给定一个 m x n 的矩阵,由若干字符X’和 O构成,"X表示该处已被占据,O表示该处空闲,请找到最大的单入口空闲区域。空闲区域是由连通的O组成的区域,位于边界的O可以构成入口,单入口空闲区域即有且只有一个位于边界的o作为入口的由连通的O组成的区域如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。第一行输入为两个数字,第一个数字为行数m,第二个数字列数n,两个数字以空格分隔,1

sinat_29950703的博客 242

2019 西安邀请赛 E题

题解:首先我们读完题,将题目简化一下,一个nim博弈,仅当每堆石子个数的异或和为0时,先手必败,否则先手必胜。那么题目就变成了三种操作,1操作让1到s的路径上的点都 | t ,2操作让1到s的路径上的点都 & t,3操作简化为求1到s的异或和是否等于t。 这道题的关键不在于树链剖分,而在于维护异或和的线段树。那么我维护两个数组:lz_and[i] 和 lz_or[i],分别代表需要and和...

qq_44335608的博客 259

SAP ABAP SSSLERR_PEER_CERT_UNTRUSTED 证书过期+证书导入+案例详解+注意事项

出于 IT 审计与安全管理,外部系统间通讯发布的 API 主流都是 HTTPS 协议,SAP 支持 SSL 证书。SSL 证书是有效期的,当证书失效时将返回错误 SSSLERR_PEER_CERT_UNTRUSTED ,此时需要导入新效期的证书。这篇文章完整讲解了证书过期处理的全过程。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2362

2019 icpc西安邀请赛 E. Tree【树链剖分+区间异或和】

2019 icpc西安邀请赛 E. Tree【树链剖分+区间异或和】 求树上简单路径的异或和【树链剖分】+【线段树】 支持,修改链上的值为 a i ∣ t a_i|t ai​∣t 以及 a i & t a_i\&t ai​&t 对位考虑,每一位建立一颗线段树,维护链上值的位情况

东君不爱惜 218

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[比赛总结] 2018ICPC西安赛区总结

西安邀请这个学期的第二个全国邀请赛,成绩不是很理想,但是运气不错还拿到了铜奖。事后总结了一下还是有不少的方面欠缺了很多,于是我们回来以后队内讨论了一下比赛时期的问题,收获颇多。 热身赛: 这次热身赛的题出的很全面,由于因为下午3点才到的西北工业大学,没有办理好酒店方面的事情,所以大概五点左右就去处理酒店了,当然能出的题基本上也已经解决了。总共是三道题,我们三个人分工还是比较明确的,先整体把题过...

jianwei2016的博客 704

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

树状数组(详细分析+应用),看不懂打死我!

树状数组介绍 在学习一个算法之前一定要清楚它能干嘛,能解决什么样的问题,对你解题是否有帮助,然后才去学习它! 那么接下来看如下几个问题 什么是树状数组 顾名思义就是一个结构为树形结构的数组,于二叉树的结构类似但又不同,它是在二叉树的结构上删除了一些中间节点,来看两幅图就明白了. 1.这是二叉树的结构 2.这是树状数组的结构 不难发现,树状数组相比于二叉树删除了一些节点,但是为什么要删除呢?这就和树状数组的一些性质(lowbit)有关了,不懂没关系,继续往下看. 树状数组可以解决什么问题呢? 可以解决大部

TheWayForDream 8万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

dfs序+树链剖分,超详细讲解+原理分析+模板(看不懂来打我)

dfs序+树链剖分,超详细讲解+原理分析+模板(看不懂来打我dfs序+树链剖分一. 树链剖分能解决什么问题?二.树链剖分前置知识1.dfs序2. 时间戳3.dfs序和时间戳有什么用处线段树的区间修改和查询,对链进行操作三.树链剖分模板四.视频资源讲解 dfs序+树链剖分 一. 树链剖分能解决什么问题? 二.树链剖分前置知识 1.dfs序 2. 时间戳 按照dfs第一次访问的顺序,给每一个节点标记上时间戳 3.dfs序和时间戳有什么用处 开始剖分,跑第二次dfs的作用,也即dfs1和dfs2

TheWayForDream 1653

双向循环链表(C语言实现)

双向循环链表 我们知道单链表对于最后一个元素的删除和插入是很不方便的,需要一直遍历到最后一个元素才行,而双向循环链表只需要找到,头节点的上一个元素的地址即可 双向循环链表中每一个元素块都有两个指针prev和next,prev连接它的上一个元素的地址,而next连接它下一个元素的地址,为了实现更好的删除和插入操作,一般把链表设置为带头结点的 这样我们就可以利用双向循环链表实现增删改查 双向链表结构图 1.初始化链表 typedef struct node { int key; node *prev,*n

TheWayForDream 1063

树链剖分题目大集

树链剖分题目大集如果还没学树链剖分的伙伴可以跳转到下面的博客1.模板题 P3384 【模板】轻重链剖分/树链剖分2.洛谷-P3379 【模板】最近公共祖先(LCA)(强行用树剖写LCA)3.洛谷-P2590 [ZJOI2008]树的统计4.P3038 [USACO11DEC]Grass Planting G5.P3178 [HAOI2015]树上操作6.树链剖分+线段树 2019ICPC西安邀请赛E7.HDU - 5052 树链剖分主要是解决对于树上路径的修改和查询操作,常常结合线段树来出题,使用线段树维护

TheWayForDream 701

腾讯2020校园招聘笔试题解

第一题: 小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S(m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么? 思路:这里直接dfs栈模拟即可 #include<bits/stdc++.h> using namespace std; string str

TheWayForDream 575

点分治超详细分析+视频讲解+题目大全(不再为点分治而烦恼)!

点分治超详细分析+视频讲解+题目大全(不再为点分治而烦恼!一.点分治原理分析及应用二.点分治视频讲解视频链接三.点分治练习题1.P3806 【模板】点分治12.P2634 [国家集训队3.P4149 [IOI2011]Race4.CF161D Distance in Tree5.P4178 Tree 一.点分治原理分析及应用 二.点分治视频讲解 视频链接 https://www.bilibili.com/video/BV1PE41197md?p=1 三.点分治练习题 1.P3806 【模

TheWayForDream 447

Poj 2777 Count Color(可合并区间线段树)

题目链接 https://vjudge.z180.cn/problem/POJ-2777 题目大意: 给你一个长度为N的[1,N][1,N][1,N]区间,一开始区间的颜色初始化为1,给你一个T表示颜色在[1,T]范围类可选,然后你有M次操作,操作有如下两种情况 1.C A B C 表示把区间[A,B][A,B][A,B]染成颜色C 2.P A B表示查询区间[A,B][A,B][A,B]有多少种不同颜色,并输出 分析:这道题一看区间修改加区间查询,线段树跑不掉,首先对于一个区间我们不能单纯通过它左儿子不同

TheWayForDream 249

Codeforces E. Gold Transfer

原题链接http://codeforces.com/contest/1535/problem/E 题意: 一开始只有一个0号根节点节点,并且告诉你a0,c0a_{0},c_{0}a0​,c0​表示0号节点上面的金块个数以及单个金块的价格,现在有q次操作 操作1:给你pi,ai,cip_{i},a_{i},c_{i}pi​,ai​,ci​,新的i号节点加入到pi节点的儿子节点,i号节点上面有ai个金块,以及每个金块的价格ci(保证ci>cpic_{i}>c_{pi}ci​>cpi​) 操作2

TheWayForDream 229

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 316

pandas 深度入门:从数据结构到一份真实销售报表

本文系统讲解Pandas核心应用,从三分钟安装到完整月度报表生成,涵盖数据读取、清洗、筛选、分组聚合、表连接、透视表与时间序列等13个关键环节。强调“先看数据再动手”,掌握Series/DataFrame/Index结构本质,熟练运用loc/iloc、merge校验、agg/transform区别,通过真实案例实现高效报表自动化,告别手动Excel操作。最后提供性能优化与高频报错解决方案,助力读者快速上手,真正实现“写二十行代码,跑三秒出结果”。

信息安全领域优质创作者|操作系统领域专家 237

工单系统的数据结构化:故障分类体系设计与报表可用性

很多团队上完工单系统半年,会发现一个尴尬的事实:单子照常在走,报表却始终出不来。导出的 Excel 几千行,看不出趋势、算不出口径、答不了"哪类故障占大头"。问题几乎都不在系统,而在数据模型的第一层——。这篇文章把这件事拆开讲:自由文本为什么会失效、分类体系怎么分层、表怎么建、老数据怎么迁、上线前怎么验收。

ITyunwei0987的博客 265
上一篇: dfs序+树链剖分,超详细讲解+原理分析+模板(看不懂来打我)
下一篇: 树链剖分题目大集
鲜果维他命
博客等级 码龄7年 205粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值