【2019.10.25 OI-Killer的模拟赛】2.黄队的宫殿
时间:2019-10-25
本文章向大家介绍【2019.10.25 OI-Killer的模拟赛】2.黄队的宫殿,主要包括【2019.10.25 OI-Killer的模拟赛】2.黄队的宫殿使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:
给出一棵有$n$个节点的树,每个节点有亮/暗的一个属性。$m$次操作,每次给出一个点$x$,对$x$以及与$x$相邻的点取反,或者询问这些点里一共有多少个是亮着的。
$1\le x\le n \le 10^6$
分析一:
按BFS序将树写成一个序列,那么每组兄弟节点一定相邻,线段树维护单点修改,单点查询,区间修改,区间查询即可。
实现一(略)
分析二:
每个点的属性只跟父亲、自己、孩子的修改次数奇偶有关。每次修改影响不会超过两条边的半径。
考虑一个点$x$仅记录三条信息:
$l$:$x$的修改异或${son[x]}$的修改
$f$:$x$的修改
$s$:${son[x]}$里亮着的个数
那么一个点$x$的属性可以由$l[x]\oplus f[fa[x]]$得来。“$\oplus$”表示异或。
每次修改$x$仅操作$x$、$fa[x]$、$fa[fa[x]]$。
实现二(100分):
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #define IL inline #define UI unsigned int #define RI register int #define _1 first #define _2 second using namespace std; const int N=1e6; int n,m,a[N+3]; bool l[N+3],f[N+3]; int sz[N+3],s[N+3]; int main(){ scanf("%d",&n); for(int i=2;i<=n;i++) scanf("%d",&a[i]); memset(sz,0,sizeof sz); for(int i=2;i<=n;i++) sz[a[i]]++; memset(l,0,sizeof l); memset(f,0,sizeof f); memset(s,0,sizeof s); scanf("%d\n",&m); while(m--){ int t,x; scanf("%d%d",&t,&x); if(t==1){ s[x]=sz[x]-s[x]; l[x]^=1; f[x]^=1; if(x==1) continue; l[a[x]]^=1; (l[x]^f[a[x]])?(s[a[x]]++):(s[a[x]]--); if(a[x]==1) continue; (l[a[x]]^f[a[a[x]]])?(s[a[a[x]]]++):(s[a[a[x]]]--); } else { int s1=(a[x]==1)?l[a[x]]:(l[a[x]]^f[a[a[x]]]); int s2=(x==1)?l[x]:(l[x]^f[a[x]]); printf("%d\n",s1+s2+s[x]); } } return 0; }
小结:
记录/修改所有元素的精确值往往很麻烦。可以考虑把从属关系分类合并,用“粗略信息”回答询问。例如本题的$s$,和10.16发的《矩阵》题解里的求和。
原文地址:https://www.cnblogs.com/Hansue/p/11738788.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter 实战】自定义动画-涟漪和雷达扫描
- Flutter —布局系统概述
- 【Flutter 实战】全局点击空白处隐藏键盘
- 我对Flutter的第一次失望
- 【Flutter 实战】各种各样形状的组件
- 『Flutter-绘制篇』实现炫酷的雨雪特效
- 图书管理系统(Servlet+Jsp+Java+Mysql,附下载演示地址)
- Vuex 映射完全指南
- 我们是如何改进YOLOv3进行红外小目标检测的?
- Unity3D网络通讯(三)-- HttpRestful请求的简单封装
- 详解Elasticsearch 的性能优化
- console.log的那件事
- Codeforces Round #668 (Div. 2)A-D
- nodejs源码解析之udp服务器
- LeetCode | 35.搜索插入位置