首页 > 其他分享 >[ABC256E] Takahashi's Anguish 题解

[ABC256E] Takahashi's Anguish 题解

时间:2023-01-07 15:44:06浏览次数:59  
标签:cur int 题解 mn ret Edge Takahashi Anguish define

[ABC256E] Takahashi's Anguish Solution

目录

更好的阅读体验戳此进入

题面

存在 $ n $ 个人,你需要确定一个序列 $ P_n $ 表示这 $ n $ 个人的排列,对于每个人,第 $ i $ 个人有且仅有一个 $ x_i $,表示不喜欢 $ x_i $ 站在 $ i $ 的前面,若 $ x_i $ 站在 $ i $ 的前面则会产生 $ c_i $ 的不愉悦值,你需要确定排列以最小化不愉悦值之和,求最小值。

Solution

这道题想到方法之后就很简单了,是一道图论建模题。考虑将不喜欢的关系抽象成一条有向边,不难发现每个点都有且仅有一条出边,则最后形成的图在形态上一定类似一个基环树森林,或者说在形成的图中每一个连通块内最多含有一个环。

不难想到对于无环的一定有合法方案使得每一个点都不会有不喜欢的在其之前,对于环上的则一定至少需要破坏一条环上的边。于是我们跑一个类似拓朴排序的东西即可,对于无环的直接丢弃,有环的在环上找到边权最小的一条边保留即可。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to
#define OPNEW void* operator new(size_t)
#define ROPNEW(arr) void* Edge::operator new(size_t){static Edge* P = arr; return P++;}

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
bool rnddd(int x){return rndd(1, 100) <= x;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;
typedef long double ld;

template < typename T = int >
inline T read(void);

struct Edge{
    Edge *nxt;
    int to;
    int val;
    OPNEW;
}ed[210000];
ROPNEW(ed);
Edge* head[210000];

int N;
bitset < 210000 > vis;
int ind[210000];
ll ans(0);

int main(){
    N = read();
    for(int i = 1; i <= N; ++i){
        int s = i, t = read();
        head[s] = new Edge{head[s], t};
        ++ind[t];
    }for(int i = 1; i <= N; ++i)head[i]->val = read();
    queue < int > cur;
    for(int i = 1; i <= N; ++i)if(!ind[i])vis[i] = true, cur.push(i);
    while(!cur.empty()){
        int tp = cur.front(); cur.pop();
        for(auto i = head[tp]; i; i = i->nxt){
            --ind[SON];
            if(!ind[SON])vis[SON] = true, cur.push(SON);
        }
    }
    for(int i = 1; i <= N; ++i){
        if(!vis[i]){
            int mn(INT_MAX);
            vis[i] = true;
            auto cur = head[i];
            while(cur->to != i){
                vis[cur->to] = true;
                mn = min(mn, cur->val);
                cur = head[cur->to];
            }mn = min(mn, cur->val);
            ans += mn;
        }
    }printf("%lld\n", ans);
    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

template < typename T >
inline T read(void){
    T ret(0);
    int flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

UPD

update-2022_12_08 初稿

标签:cur,int,题解,mn,ret,Edge,Takahashi,Anguish,define
From: https://www.cnblogs.com/tsawke/p/17032772.html

相关文章

  • [ABC252E] Road Reduction 题解
    [ABC252E]RoadReductionSolution目录[ABC252E]RoadReductionSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$个点$......
  • [ABC252D] Distinct Trio 题解
    [ABC252D]DistinctTrioSolution目录[ABC252D]DistinctTrioSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定序列$a_n$,求满......
  • P8865 [NOIP2022] 种花 题解
    P8865[NOIP2022]种花Solution目录P8865[NOIP2022]种花Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面大概就是在有障碍的网格图......
  • 【题解】P4218 [CTSC2010]珠宝商
    这种题出出来有什么必要吗,不就是难写的暴力弱智题。题意给定一棵树和一个文本串\(T\),每个结点上有一个字符,问树上任意路径构成的字符串在\(T\)中的出现次数之和。\(n......
  • SDK更新不了问题解决
    问题阐述相信大家在更新SDK的时候都会遇到更新不了的问题,而且打不开Google搜索,这是因为天朝墙了Google,所以要么只能通过科学上网或者改HOSTS才能访问,更新SDK!本节来介绍两种......
  • 牛客小白月赛65 D题 题解
    原题链接题意描述一共有两堆石子,第一堆有\(a\)个,第二堆有\(b\)个,牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下\(2\)种方案种挑一种来取(对于选择的方案......
  • NOI2003 文本编辑器 题解
    \STL大法好/正规解法块状链表,这里采取的是黑科技解法。rope是扩展STL库中的一个数据结构——可持久化平衡树,相比较set,它更适合区间插入和删除。这里用来解此题,就显得十......
  • CF1779C Least Prefix Sum 题解
    可能更好的阅读体验题目传送门题目大意给定一个序列\(a\),长度\(n\)。每次操作可以把\(a_i\)变成\(-a_i\)。要求\(a\)做前缀和之后的序列\(s\)中最小值为\(s......
  • Destroyer Takahashi
    DestroyerTakahashi题解:区间选点问题这里面他又给出了D,D其实可以代表他从右端点还可以往外延申D-1的长度,实际上每次的\(now=a[i].r+D-1\)#include<bits/stdc++.h>......
  • CF1779D Boris and His Amazing Haircut 题解
    可能更好的阅读体验题目传送门题目翻译题目解析如果有\(a_i<b_i\)直接输出NO。我们发现:如果\(b_l=b_r=x\)并且所有的\(l\lei\ler\)都有\(b_i\lex\)那么......