F. Selling a Menagerie

原题链接

题解

转换成有向无环图,可以发现,我们先将入度为0的节点输出总是不劣的
对于环,无论从哪里开始只会改变一个节点的双倍奖励,所以从奖励最小的点开始
由于存在多个环(见样例),所以我们可以用堆来维护所有点

code

#include<bits/stdc++.h>
using namespace std;
int a[100005],c[100005],in[100005]={0};

struct node
{
    int id;
    bool operator<(const node &b) const
    {
        return c[b.id]<c[id];
    }
};
int main()
{
    ios::sync_with_stdio(false);cout.tie(0);cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;

        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            in[a[i]]++;
        }
        for(int i=1;i<=n;i++) cin>>c[i];

        queue<int> q;
        for(int i=1;i<=n;i++) if(!in[i]) q.push(i);

        int cnt=n;

        while(q.size())
        {
            int now=q.front();
            q.pop();
            cout<<now<<" ";
            cnt--;
            in[a[now]]--;
            if(!in[a[now]]) q.push(a[now]);
        }

        priority_queue<node> q1;
        for(int i=1;i<=n;i++)
        {
            if(in[i]) q1.push({i});
        }

        while(q1.size())
        {
            int now=q1.top().id;
            q1.pop();
            if(!in[now]) continue;
            int tem=a[now];
            in[tem]--;
            while(tem!=now)
            {
                cout<<tem<<" ";
                tem=a[tem];
                in[tem]--;
            }
            cout<<tem<<" ";
        }


        cout<<"\n";
        for(int i=1;i<=n;i++) in[i]=0;
    }
    return 0;
}

posted @   纯粹的  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示