首页 > 其他分享 >CF1889D Game of Stacks 题解

CF1889D Game of Stacks 题解

时间:2024-12-18 17:10:55浏览次数:3  
标签:CF1889D int 题解 tp st Game vs 100010 ns

很有趣的题目.

思路

我们考虑如果每一个栈里只有一个数怎么办。

这个时候,我们会形成一个基环树森林。

我们的操作相当于每走一步就删掉来时的路。

那么每个点最终会停在离它最近的环上的点。

我们可以发现一个性质,一个环是不会影响结果的,因为它总能走回来。

所以我们可以不断的删掉一个环,直到它变成一个树。

此时,树上的所有点的答案就都是根。

实现可以拿一个栈进行 dfs。

Code

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

int n, tp;
int ns[100010];
int st[100010];
int vs[100010];
vector<int> to[100010];

inline int dfs(int x) {
  if (ns[x]) return ns[x];
  if (vs[x]) {
    do {
      vs[st[tp]] = 0, tp--;
    } while (st[tp + 1] != x);
  }
  vs[st[++tp] = x] = 1;
  if (to[x].empty()) return x; 
  int y = to[x].back();
  to[x].pop_back();
  return dfs(y);
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int k;
    cin >> k;
    to[i].resize(k);
    for (int j = 0; j < k; j++)
      cin >> to[i][j];
  }
  for (int i = 1; i <= n; i++) {
    if (ns[i]) continue;
    int s = dfs(i);
    while (tp) {
      ns[st[tp]] = s, tp--;
    }
  }
  for (int i = 1; i <= n; i++) cout << ns[i] << " \n"[i == n];
}

标签:CF1889D,int,题解,tp,st,Game,vs,100010,ns
From: https://www.cnblogs.com/JiaY19/p/18615393

相关文章

  • P7531 [USACO21OPEN] Routing Schemes P 题解
    best定理居然还有运用范围。思路考虑如何来判断是否有解。由于每一条边都需要用到。但是它是使用很多条路径进行覆盖。我们考虑一个很巧妙的转化。建立一个超级源点,源点向每一条路径的开头连一条边。每一条路径的结尾向源点连一条边,这样一条路径就变成了一个回路。把所有......
  • AT_abc129_f [ABC129F] Takahashi's Basics in Education and Learning 题解
    题目传送门前置知识矩阵加速递推解法设\(f_{i}\)表示将\(s_{1}\sims_{i}\)拼起来后的值,状态转移方程形如\(f_{i}=10^{k}f_{i-1}+s_{i}\),其中\(k=\left\lfloor\log_{10}s_{i}\right\rfloor+1\)。又因为保证等差数列中的元素\(\le10^{18}\),对于每个\(k\in[1,......
  • Pinely Round 2 (Div. 1 + Div. 2) / Codeforces contest 1863 题解
    ProblemA.Channelhttps://codeforces.com/contest/1863/problem/A流程看起来很复杂,让我们重述一下题意。两数\(x\),\(y\)。\(opt1\),你可以选\(x\)和\(y\)当中某个非零的,减少\(1\)。\(opt2\),让\(x\)增加\(1\)。\(Q1:\)是否可以让\(y\)变成\(0\),$Q2:$......
  • AT_agc032_d [AGC032D] Rotation Sort 题解
    考虑确定哪些点不动,这些点一定构成一个单调递增子序列,那么对于剩下的点:若在它之前存在一个不动点大于它,则需要花费\(b\)的代价向前移动。若在它之后存在一个不动点小于它,则需要花费\(a\)的代价向后移动。如果两个都不存在,则它一定可以加入不动点序列。考虑dp,记\(f_{i,......
  • 鸿蒙Flutter环境相关问题解决方法
    鸿蒙Flutter环境相关问题建议使用的开发工具版本flutter3.7.12-ohos版本python3.8-python3.11java17node18ohpm1.6+HamonyOSSDKapi11Xcode14.3断网环境flutterpubget执行失败解决方案:加上--offline参数,完整命令flutterpubget--offlinemac环境releas......
  • Hongcow Builds A Nation 题解
    HongcowBuildsANation题解洛谷。Codeforces。题目描述给定一张\(n\)个点,\(m\)条边的无向图,有\(k\)个点是特殊点。每个连通块中都得保证无重边、无自环,且最多只有一个特殊点。求最多还能加多少条边,满足以上条件。思路简述首先考虑以下有\(n\)个点的完全图共有多......
  • P6803 [CEOI2020] 星际迷航 题解
    \(\text{P6803[CEOI2020]星际迷航题解}\)观察这个从第\(0\)棵树走向第\(D\)棵树的过程是困难的,我们难以判定走到下一棵树的情况。于是我们不妨从第\(D\)棵树向第\(0\)棵树来倒推。从第\(i\)层走向第\(i+1\)层的边为\(x\toy\)时,事实上此时\(y\)就是第\(i+1\)......
  • CF335F 题解
    \(CF335F\)\(Buy\)\(One\),\(Get\)\(One\)\(Free\)考虑可撤销贪心+小根堆维护。首先价格相同的馅饼可以放到一起考虑,从大到小排序后考虑每种不同价格的馅饼。则第\(i\)种最多白嫖的个数为\(p=\min(c_i,num-2*sum)\),其中\(c_i\)为馅饼个数,\(num\)为已经考虑的更贵的......
  • 7 Oracle 经典面试题解析
    PL/SQL面试题--1、创建序列seq_employee,该序列每次取的时候自动增加,从1开始计数,不设最大值,并且一直累加,不循环;CREATESEQUENCEseq_employeeSTARTWITH1INCREMENTBY1NOMAXVALUE;--也可以直接使用简单默认参数:--CREATESEQUENCEseq_employee;SELECTseq_employee.NEXTV......
  • 题解:牛客周赛 Round 72(A-D)(E只有代码)
    先附上补题链接,没打的同学可以来补一下:https://ac.nowcoder.com/acm/contest/98256A小红的01串(一)题意找到一个01串中相邻字符不同的对数做法从头到尾扫一遍,计算前后不一样的字符就可以了#include<bits/stdc++.h>signedmain(){std::ios::sync_with_stdio(false)......