首页 > 其他分享 >AT_arc169_a的题解

AT_arc169_a的题解

时间:2024-01-21 21:55:56浏览次数:26  
标签:arc169 ch 题解 点权 cdots flag printf

关于我在赛场上一题都没有切,后面自己推出来正解这件事~

题面翻译

给定一个长度为 \(N\) 的整数序列 \(A=( A_1, A_2,\cdots,A_N)\) 和另一个长度为 \(N-1\) 的整数序列 \(P=(P_2,\cdots,P_N)\)。注意 \(P\) 的索引从 \(2\) 开始。对于每个 \(i\),保证 \(1 \leq P_i < i\)。

现在您将重复下面的操作 \(10^{100}\) 次。

  • 为每一个 \(i=2,\cdots,N\) 的值,\(A_{P_i}=A_{P_i}+A_i\)

确定当所有操作完成时,\(A_1\) 是正的、负的还是零。

题目想让你求什么

给你一棵以 \(1\) 为根的树,\(i\) 号点的父亲是 \(P_i\),点权是 \(A_i\),重复 \(10^{100}\) 次,从 \(1\sim N\) 分别将 \(i\) 号点的点权加进其父亲的点权。请判断 \(1\) 号点点权的正负性。

题目思路

我们发现,深度最深的点起决定性作用,因为无限次之后如果深度最深的点是负的,那么肯定能把深度较浅的点减成负的。如果深度最深的点是正的,那么肯定能把深度较浅的点加成正的。

所以,我们可以想到使用拓扑进行图的分层,求出每一层的和,在从下向上比较,当最底下一层的和为 \(0\) 时,该层对答案无影响,再看上面一层(可以把 \(1\) 号节点设为根)。

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void read(ll &s)
{
	s = 0;
	char ch = getchar(), lst = ' ' ;
	while (ch < '0' || ch > '9')
		lst = ch, ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	if (lst == '-')
		s = -s;
}

ll n;
ll a[250005];
struct node
{
	ll to, nxt;
};
node edge[250005];
ll hd[250005], cnt;
ll flr, sum[250005];
ll h, r, q[250005];
void add(ll x, ll y)
{
	cnt++;
	edge[cnt].to = y;
	edge[cnt].nxt = hd[x];
	hd[x] = cnt;
}

int main()
{
	read(n);
	for (int i = 1; i <= n; i++)
		read(a[i]);
	for (int i = 2; i <= n; i++)
	{
		read(a[0]);
		add(a[0], i);
	}
	q[r++] = 1;
	sum[++flr] = a[1];
	while (h < r)
	{
		flr++;
		ll t = r;
		while (h < t)
		{
			for (int i = hd[q[h]]; i; i = edge[i].nxt)
				q[r++] = edge[i].to;
			sum[flr] += a[q[h]];
			h++;
		}
	}
	int flag = 0;
	for (int i = flr; i; i--)
		if (sum[i] > 0)
		{
			flag = 1;
			break;
		}
		else if (sum[i] < 0)
		{
			flag = -1;
			break;
		}
	if (flag > 0)
		printf("+");
	else if (flag == 0)
		printf("0");
	else
		printf("-");
	return 0;
}

尾声

感谢以为大佬告诉我这题可以用拓扑的思想,同时感谢martian148大佬为本篇题解提供写法上的参考。

标签:arc169,ch,题解,点权,cdots,flag,printf
From: https://www.cnblogs.com/mgcjade/p/17978467

相关文章

  • UVA11218的题解
    题目翻译大意有九个人要去KTV唱歌,每三个人为一组分成三组,现在给出了\(n\)种分的组合,输入四个数\(a,b,c,s\)分别代表\(a,b,c\)这三个人的构成一个组合能获得\(s\)分,现在要求最多能获得多少得分。如果无法把分配九个人就输出-1。分析数据范围:看这数据,\(n<81\)不......
  • 2024.1.21模拟赛 C题解
    简要题意略思路首先有一个\(O(nk)\)的暴力dp,30pts我们可以发扬人类智慧,构造势能函数\(U_x=\sum_{未选择的点i}dis(i,x)+h_i\),当前在\(x\)点定义\(f_i\)表示走到\(i\)点时势能函数的最小值,\(s_i\)表示\(i\)到起点的距离容易发现只会跨过起点进行转移,于是\(f_i=f_j+2\tim......
  • 「闲话随笔」【数据删除】考试题解
    「闲话随笔」【数据删除】考试题解点击查看目录目录「闲话随笔」【数据删除】考试题解T2T3T4T5T6T7T1T8T9被教练斩了.级部为啥不让公布分数?哦好像确实不该.咋四机房就我还没停whk,那我还挺高贵的.昨天中午saidtoFLORIZ:感觉现在是提前体验退役生活了,回班之后小测......
  • 2024.1.21模拟赛 B题解
    题目大意略思路首先有一个50pts的网络流暴力考虑按照\(dp\)值分层,发现在同一层内,随着\(i\)递增,\(a_i\)递减由此可以进一步推出每一个点连接的出边,是下一层的一个区间,并且区间是单调的于是可以线段树优化建边,拿到60pts接着考虑模拟网络流,发现如果每次都选择第一条出边的话,就......
  • 初三选拔模拟赛题解
    目录T2T3T4T5T6T7给个正常的题解以正视听.不过说好的普及难度呢?如果有问题请指出.T2注意到答案一定可以取到最小区间的长度\(len\),一种方案是按\(0\dotslen-1\)循环填.T3大致有两种做法:维护每个手指的次数\(c_i\)和占用的键数\(t_i\),按\(\frac{c_i}{t_i+1}\)......
  • 1.21闲话暨模拟赛题解
    未卜先知推歌:二重变革/洛天依,言和byDELA上午写了模拟赛,下午不给我发代码不让我改题不让我看题面,smjb模拟赛一共9道题,4道原题(2道原题,2道"原"题),抛去3道不写的一共6道题T1「尘世闲游」(原神题)没让写T2「一心净土」(原神题&&原题「CF740C」)题解我这里一共找到......
  • CF1375B Neighbor Grid 题解
    题意简述给你一个$n$行$m$列的矩阵,要求你让这个矩阵是“完美”的。“完美”的定义如下:若当前的格子里是一个正整数$k$,那么与这个网格相邻(有公共边)的$k$个格子也必须有一个正整数。若当前的格子里是$0$,那么不受上述的限制。你可以对任意的一个格子加上$1$,次数......
  • P5362 [SDOI2019] 连续子序列 题解--zhengjun
    题面传送门提供一种和其他题解完全不同的解法。记\(P_0\)为题中给出的序列,\(P_1\)为\(P_0\)取反的结果。记\(S_{l\simr}\)表示\(S_lS_{l+1}\dotsS_{r}\)。方便起见,\(P\)下标从\(0\)开始,其余的串都是从\(1\)开始。这里用\(P_{0,i}=\operatorname{popcount(i)}......
  • Github图床搭建,结合Picgo与jsdelivr的免费cdn加速,以及部分问题解决方案
    留份文档,便于后续查询===================用到的地址:Github:GitHubPicgo:PicGoisHere|PicGojsdelivr加速地址:https://cdn.jsdelivr.net/gh/Github用户名/仓库名@master===================1.创建一个GitHub仓库:进入你的GitHub首页,在右上角你会找到一个➕,在下拉菜单中......
  • P7192 [COCI2007-2008#6] GEORGE 题解
    题目简述给定一张$n$个点$m$条边的无向图,从$u_i\rightarrowv_i$需要用时$w_i$分钟。有一位T先生从$0$时刻按有$g$个点的序列顺序移动,即$v_1\rightarrowv_2\rightarrow\cdots\rightarrowv_g$。还有一位卡车司机Luka从$k$时刻开始从$a$点出发,Luka不......