首页 > 其他分享 >Codeforces Round 970 (Div. 3) D. Sakurako‘s Hobby

Codeforces Round 970 (Div. 3) D. Sakurako‘s Hobby

时间:2024-10-08 19:18:01浏览次数:3  
标签:idx 970 int sum vis Codeforces ne Sakurako void

 

链接

cf_Sakurako‘s Hobby

大意:

给一堆点和边,并给出点的颜色,输出每个点能遍历到几个黑点

思路:

1、这些点边里面有拓扑结构, 也有环

2、先处理拓扑排序的一些点,依次遍历无父节点的即可,之后就会剩下环

3、有环的说明每个点都能去到环内任意一点,那么直接就记录一个sum,然后递归求环内黑点,最后把sum赋值给环内所有点即可

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;


int e[N], ne[N], h[N], idx;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int p[N];
int vis[N];
int in[N];
int f[N];
vector<int> circle; // 为了之后给环里面的东西幅值
int sum;
string s;
void dfs(int u)
{
	circle.push_back(u);
	if (s[u] == '0')sum++;
	vis[u] = 1;
	for (int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		if (!vis[j])dfs(j);
	}
}

void solve()
{
	memset(h, -1, sizeof h);
	idx = 0;
	int n;cin >> n;
	for (int i = 1; i <= n; i++)in[i] = f[i] = vis[i] = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> p[i];
		if (i != p[i])
		{
			add(i, p[i]);
			in[p[i]]++;
		}
	}
	cin >> s;
	s = " " + s;
// 处理拓扑排序
	queue<int>q;
	for (int i = 1; i <= n; i++) //拓扑的头 对无环的点
		if (!in[i])q.push(i), vis[i] = 1;

	while (q.size())
	{
		int t = q.front();
		q.pop();
		if (s[t] == '0')f[t] ++;
		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			in[j] --;
			if (!in[j] && !vis[j])q.push(j), vis[j] = 1;
		}
	}

	for (int i = 1; i <= n; i ++)
		if (!vis[i])
		{
			circle.clear();
			sum = 0; // 记录环中黑点个数
			dfs(i);
			for (auto it : circle)f[it] = sum;
		}
	for (int i = 1; i <= n; i++)
		cout << f[i] << ' ';
	cout << endl;
}

signed main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t = 1;
	cin >> t;
	
	while (t--) solve();
	return 0;
}

标签:idx,970,int,sum,vis,Codeforces,ne,Sakurako,void
From: https://blog.csdn.net/weixin_47774773/article/details/142766776

相关文章

  • Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)
    目录写在前面A签到B贪心,枚举C1贪心C2贪心,枚举DDPE1/E2Kruscal重构树,树上背包写在最后写在前面补题地址:https://codeforces.com/contest/2021。上大分失败呃呃呃呃我不要上班呜呜A签到考虑仅有三个数\(a,b,c(a<b<c)\)时最优操作,手玩下发现最优操作顺序一定是......
  • Codeforces Round 316 (Div. 2) D题 Tree Requests(二分,dfs,在线,前缀异或)
    题目链接CodeforcesRound316(Div.2)D题TreeRequests思路将262626个字母全部当作一个二进制数。将每个深度的结点按照dfs序放到一个vector里,同时记录每个vector......
  • 【前缀和+开区间二分】codeforces 1187 B. Letters Shop
    题意第一行,输入一个正整数\(n(1\leqn\leq2*10^5)\),代表字符串\(s\)的长度。第二行,输入一个字符串\(s\)。第三行,输入一个正整数\(m(1\leqm\leq5*10^4)\),代表接下来要输入的询问次数,对于每次询问:输入一个字符串\(t(1\leq|t|\leq2*10^5)\),并保证\(\sum_{i=1}^m......
  • Codeforces Round 969 (Div. 2)
    一万五参赛,赛时(VP)排名80A.Dora'sSet比较新的结论题。显然,一个合法三元组最多只能有一个偶数。每个偶数都可以跟相邻两个奇数组成合法三元组。因此,答案为奇数个数的二分之一(下取整)。#include<bits/stdc++.h>usingnamespacestd;intT,l,r;intmain(){ scanf("%d",......
  • Codeforces Round 977 (Div. 2)
    手速局,因为水平不够三题遗憾离场。A.MeaningMean题意你一个序列,你每次可以选择两个数删掉,并把他们的平均数加入到序列的末尾。当序列长度为\(1\)的时候,剩下的数最大值是多少。思路当时比赛的时候唐了,耽误了好几分钟。想的是先奇数和奇数相加,偶数和偶数相加,这样能避免下取......
  • Codeforces Rund 977 div2 个人题解(A~E1)
    CodeforcesRund977div2个人题解(A,B,C1,C2,E1)Dashboard-CodeforcesRound977(Div.2,basedonCOMPFEST16-FinalRound)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#includ......
  • Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)
    CodeforcesRound977(Div.2,basedonCOMPFEST16-FinalRound)A.MeaningMean题目链接:Problem-A-Codeforces题目描述:给定一个包含(n)个正整数的数组(a)。你可以执行如下操作直到数组中只剩下一个元素:从数组中选择两个不同的元素(a_i)和(a_j......
  • 【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final
    赛后反思做红温了,太菜了,每题都需要WA几次才能过,B题看到MEX选择性害怕,时间复杂度又算错了A题每次选择一对\(a_i,a_j\)把均值插入数组最后面,要想结果最大,对于两个数求均值,最后的结果一定是小于等于其中的较大值,我们可以考虑如何最大化最后一次操作,想到将最大值保留在最后再......
  • 帝国CMS为什么发布内容时间为“1970-01-01 ”
    在发布内容时,如果时间显示为 1970-01-01,通常是因为以下几个原因:字段未设置为录入项:在建立系统模型时,newstime 字段没有被设置为录入项。字段不可修改:即使设置了录入项,但该字段可能被设置为不可修改。字段不可增加:该字段可能被设置为不可增加。解决方法要解决这个问题,需要......
  • 网站避免发布内容时出现 1970-01-01 的时间显示问题
    系统模型管理页面:在左侧菜单栏中选择“系统模型管理”。在列表中找到需要编辑的系统模型,点击“编辑”。字段编辑页面:在字段列表中找到 newstime 字段。在字段设置区域勾选“录入项”、“可修改”、“可增加”选项。点击“保存”按钮。数据库表结构检查如果上......