首页 > 其他分享 >2024 ICPC ShaanXi Provincial Contest 换座位 sol

2024 ICPC ShaanXi Provincial Contest 换座位 sol

时间:2024-07-22 19:20:15浏览次数:8  
标签:Provincial ch ShaanXi Contest int res ll MAXN now

\(\text{Link}\)

自然地想到 \(i\) 向 \(a_i\) 连边。

随便造一组强一点的数据:

10
3 1 2 10 10 8 9 20 8 2

图大概长这样

image

容易发现每个 \(i\) 有且仅有 \(1\) 条出边。

  • 发现图中 \(1,2,3\) 这 \(3\) 个点组成了一个环。在这个环上,每个人都能做到自己心仪的位置上,所以这个环对答案的贡献是这个环包含的点的数量。

  • 当一个点 \(>n\) 的时候,就没有办法接着连下去了,于是乎出现了一条链。这条链上每 \(<=n\) 的点都能坐到心仪的位置,对答案的贡献是链上的点数 \(-1\)。

  • 当两条链有重合部分的时候,一部分人就不能坐上心仪的座位了。这个重合部分其实就是一棵有向树的树根。从这里出发,只有 \(1\) 条链上的人可以找到心仪的座位,所以对答案的贡献就是以这里为终点的最长链的点数。

于是,题做完了。

由于需要求以 \(k\) 为终点的最长链,所以还要建一个反图。

#include <bits/stdc++.h>
#define gt getchar
#define pt putchar
#define ll long long
const int MAXN = 2e5 + 5;
ll read() {
    ll x = 0, f = 1;char ch = gt();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = gt();}
    while (ch >= '0' && ch <= '9') {x *= 10;x += ch - '0';ch = gt();}
    return x * f;
}
std::vector<ll> z[MAXN], fz[MAXN];
bool vis[MAXN];//记录i有没有计入答案
ll in[MAXN];

void add_edge(ll s, ll e) {
    z[s].push_back(e);//正图
    fz[e].push_back(s);//反图
}
ll n;
void dfs(ll now, ll len, ll &res) {
    //当前搜到了编号为now的点,从根走到这里的长度为len,最终答案为res
    vis[now] = true;
    res = std::max(res, len);//更新答案
    for (int i = 0; i < fz[now].size(); i++) {
        //继续沿着反边往回走
        dfs(fz[now][i], len + 1, res);
    }
}

int main() {
    n = read();
    for (int i = 1; i <= n; i++) {
        ll x = read();
        add_edge(i, x);//建边
        in[x]++;
    }
    ll ans = 0;
    for (int i = n + 1; i <= n + n; i++) {
        //每一个 >n 的点都可能是一条链的末端,倒着往前搜
        ll res = 0;
        dfs(i, 0, res);
        ans += res;//更新答案
    }
    std::queue<ll> q;//拓扑排序
    for (int i = 1; i <= n; i++) {
        if(!vis[i] && in[i] == 0) {
            q.push(i);
            vis[i] = true;
        }
    }
    while(q.size()) {
        ll now = q.front();
        q.pop();
        for (int i = 0; i < z[now].size(); i++) {
            ll j = z[now][i];
            in[j]--;
            if(!in[j]) {
                q.push(j);
                vis[j] = true;
            }
        }
    }
    //没有被排序到的点在环里
    for (int i = 1; i <= n; i++) {
        if(!vis[i]) {
            ++ans;
        }
    }
    std::cout << ans << '\n';
    return 0;
}

标签:Provincial,ch,ShaanXi,Contest,int,res,ll,MAXN,now
From: https://www.cnblogs.com/ljlbj-fengyuwuzu/p/18316700

相关文章

  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363A-PilingUp每100分显示一个^。现在已知分数,问想要多显示一个^需要再得多少分。模拟题,显示\(i\)个^的最小分数是\(100\timesi\),而当前的^是\([\frac{R}{100}]\),\(R\)是当前的分数。所以答案就是\(([\frac{R}{100}]+1)\times100-R\)#includ......
  • AtCoder Beginner Contest 363 补题记录(A~F)
    难度:A<B<C<E≈F<<D做题顺序:A->B->C->F->E->D其实VP的时候perf还是有\(2000+\)的(虽然说D炸了),perf应该是\(2028\)左右Asignedmain(){intn;cin>>n;intcnt=0;do{++cnt;++......
  • AtCoder Beginner Contest 363
    A.PilingUp(\(\operatorname{Difficulty}11\))让你求某个数距离最近的一个\(k\times100\)的距离是多少.水.#include<bits/stdc++.h>usingnamespacestd;namespacehdk{ namespacefastio{ voidrule(boolsetting=false){std::ios::sync_with_stdio(setting);} ......
  • SMU Summer 2024 Contest Round 5
    SMUSummer2024ContestRound5RobotTakahashi思路按照Wi......
  • AtCoder Beginner Contest 360 ( A~D)
    A-AHealthyBreakfasthttps://atcoder.jp/contests/abc360/tasks/abc360_a水题题意:只要R在M左侧即可思路:因为只要三位,所以只需要判断R在第一位或M在最后一位,有重复的情况#include<iostream>#include<cmath>#include<algorithm>usingnamespacestd;intmain(){......
  • SMU Summer 2024 Contest Round 5
    ARobotTakahashi思路:将所有数排序,枚举孩子成人的分解点X,同时根据s的标识维护正真的孩子成人的个数voidsolve(){intn;cin>>n;strings;cin>>s;intsum=0;for(inti=0;i<s.size();++i){if(s[i]=='1')sum++;......
  • [题解]P1452 【模板】旋转卡壳 | [USACO03FALL] Beauty Contest G
    P1452【模板】旋转卡壳|[USACO03FALL]BeautyContestG旋转卡壳模板题。凸包用的是Andrew算法,就不详述了,具体可以查查资料了解,但提一嘴Andrew算法的一些细节问题:Andrew算法的一些细节Andrew算法的模板代码如下:sort(a+1,a+1+n,cmp);st[++top]=1;for(inti=2;i<=n;i++){ ......
  • The 2022 ICPC Polish Collegiate Programming Contest (AMPPZ 2022)
    Preface今天由于是我们队搬毒瘤场,因此下午就不用集中训练索性继续VPUCup这场题很有外国场的风格,代码量和科技含量都不大,只要动动脑筋就行了,最后也是刚好打到了10题下班A.Aliases不难发现假设\(a=b=0\),则\(c\le\log_{10}n\le7\),因此只要考虑\(a+b+c\le7\)的情况,......
  • 2024 (ICPC) Jiangxi Provincial Contest -- Official Contest
    2024(ICPC)JiangxiProvincialContest--OfficialContestA.MaliangLearningPainting题意:a+b+cvoidsolve(){lla,b,c;cin>>a>>b>>c;llans=a+b+c;cout<<ans<<'\n';}C.Lia......
  • SMU Summer 2024 Contest Round 4
    1.HandV原题链接:http://162.14.124.219/contest/1008/problem/B二进制枚举行列即可查看代码#include<bits/stdc++.h>#defineintlonglong#definePIIpair<int,int>usingnamespacestd;intn,m,k;chara[10][10];signedmain(){ios::sync_with_stdio(fals......