QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#503433#7069. FarmDecadeWA 2ms11756kbC++174.8kb2024-08-03 18:46:032024-08-03 18:46:11

Judging History

This is the latest submission verdict.

  • [2024-08-03 18:46:11]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 11756kb
  • [2024-08-03 18:46:03]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
// #define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
mt19937 rng;
uniform_int_distribution <ull> dist(0,1ull<<63);
//#define mp make_pair
inline void print(__int128 x){//输出模板 
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
inline int read()
{
    int X = 0;
    bool flag = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            flag = 0;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        X = (X << 1) + (X << 3) + ch - '0';
        ch = getchar();
    }
    if (flag)
        return X;
    return ~(X - 1);
}
const ll mod = 1e9 + 7,INF = 0x3f3f3f3f;
ll qpow(ll a, ll b)
{
    ll res = 1;
    a %= mod;
    assert(b >= 0);
    for (; b; b >>= 1)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
    }
    return res;
}
inline int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
inline int lcm(int a, int b) { return a / gcd(a, b) * b; }
const int N = 500010,M = 500010;

struct edge
{
    int u,v,w;
    bool operator<(const edge x) const
    {
        return w<x.w;
    }
}e[M];

bool cmp(int x,int y)
{
    return e[x].w<e[y].w;
}

int vis[N];
int n,m,ans,res,id[N],st[N];
vector<int> p;
PII que[20];
map<PII,int> mp;

struct mst
{
    int fa[N];
    void init()
    {
        for(int i=1;i<=n;i++) fa[i] = i;
    }
    int find(int x)
    {
        if(fa[x]!=x) return fa[x] = find(fa[x]);
        return fa[x];
    }    
    void merge(int x,int y,int c)
    {
        int xx = find(x),yy = find(y);
        if(xx!=yy)
        {
            fa[xx] = yy;
            res += c;
        }
    }
}fa;


void solve()
{
    cin>>n>>m;
    fa.init();
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        e[i] = {a,b,c};
        id[i] = i;
        if(mp.count({a,b})) mp[{a,b}] = min(mp[{a,b}],c);
        else mp[{a,b}] = c;
        swap(a,b);
        if(mp.count({a,b})) mp[{a,b}] = min(mp[{a,b}],c);
        else mp[{a,b}] = c;
    }
    int q;
    cin>>q;
    for(int i=0;i<q;i++)
    {
        int x,y;
        cin>>x>>y;
        vis[x] = 1,vis[y] = 1;
        que[i] = {x,y};
        p.push_back(e[x].u),p.push_back(e[x].v);
        fa.merge(e[x].u,e[x].v,0);
        p.push_back(e[y].u),p.push_back(e[y].v);
        fa.merge(e[y].u,e[y].v,0);
    }
    sort(p.begin(),p.end());
    p.erase(unique(p.begin(),p.end()),p.end());
    sort(id+1,id+1+m,cmp);
    for(int i=1;i<=m;i++)
    {
        if(vis[id[i]]) continue;
        int u = e[id[i]].u,v = e[id[i]].v,w = e[id[i]].w;
        fa.merge(u,v,w);
    }

    int c = 0;
    for(int i=1;i<=n;i++) 
    {
        if(fa.fa[i]==i)
        {
            c++;
        } 
    }
    if(c>1)
    {
        cout<<-1<<'\n';
        return;
    }
    fa.init();
    int rest = res;
    ans = INF;
    for(int i=0;i<(1<<q);i++)
    {
        res = rest;
        vector<edge> vc;
        for(auto it:p) fa.fa[it] = it;
        for(int j=0;j<q;j++) st[que[j].first] = st[que[j].second] = 0;
        for(int j=0;j<q;j++)
        {
            if((i>>j)&1)
            {
                if(st[que[j].first]) continue;
                vc.push_back(e[que[j].first]),st[que[j].first] = 1;
            }
            else
            {
                if(st[que[j].second]) continue;
                vc.push_back(e[que[j].second]),st[que[j].second] = 1;
            }
        }
        for(auto it:vc)
        {
            int u = it.u,v = it.v,w = it.w;
            u = fa.find(u),v = fa.find(v);
            if(u!=v) fa.fa[v] = u; 
            res += w;
        }
        vc.clear();
        for(int j=0;j<q;j++)
        {
            if(!((i>>j)&1))
            {
                vc.push_back({j,0,mp[{e[que[j].first].u,e[que[j].first].v}]});

            }
            else
            {
                vc.push_back({j,1,mp[{e[que[j].second].u,e[que[j].second].v}]});
            }
        }
        sort(vc.begin(),vc.end());
        for(auto it:vc)
        {
            int f = it.v,u,v,w = it.w;
            if(!f) u = e[que[it.u].first].u,v = e[que[it.u].first].v;
            else u = e[que[it.v].second].u,v = e[que[it.v].second].v;
            u = fa.find(u),v = fa.find(v);
            if(u!=v)
            {
                fa.fa[u] = v;
                res += w;
            }
        }
        ans = min(ans,res);
    }
    cout<<ans<<'\n';
}

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

详细

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 11756kb

input:

4 6
1 1 2
2 4 3
1 1 4
2 4 4
3 2 4
1 3 4
1
1 2

output:

10

result:

wrong answer 1st lines differ - expected: '11', found: '10'