QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#706424#239. Maximum Weighted MatchingTheZone100 ✓1608ms28048kbC++204.6kb2024-11-03 11:14:482024-11-03 11:14:59

Judging History

你现在查看的是最新测评结果

  • [2024-11-03 11:14:59]
  • 评测
  • 测评结果:100
  • 用时:1608ms
  • 内存:28048kb
  • [2024-11-03 11:14:48]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n , m;
set<int > E[100005];
const int mod = 1e9 + 7;
struct v4 {
    ll ans[2][2];
    int num[2][2];
    v4() {}
    void Set(int w) {
        num[0][0] = num[1][1] = 1;
        num[0][1] = num[1][0] = 0;
        ans[0][0] = 0;
        ans[0][1] = ans[1][0] = -1e18;
        ans[1][1] = w;
    }
    void Merge(const v4& B) {
        ll nans[2][2];  nans[0][0] = nans[0][1] = nans[1][0] = nans[1][1] = -1e18;
        int nnum[2][2]; memset(nnum , 0 ,sizeof(nnum));
        for(int i = 0;i < 2;i++) {
            for(int j = 0;j < 2;j++) {
                for(int k = 0 ; k < 2 - i ;k++) {
                    for(int l = 0;l < 2 - j;l++) {
                        if(ans[i][j] + B.ans[k][l] > nans[i + k][j + l]) {
                            nans[i + k][j + l] = ans[i][j] + B.ans[k][l];
                            nnum[i + k][j + l] = 1LL*num[i][j]*B.num[k][l] % mod;
                        }
                        else if(ans[i][j] + B.ans[k][l] == nans[i + k][j + l]) {
                            nnum[i + k][j + l] = (nnum[i + k][j + l] + 1LL*num[i][j]*B.num[k][l]) % mod;
                        }
                    }
                }
            }
        }
        for(int i = 0;i < 2;i++) for(int j = 0;j < 2;j++) ans[i][j] = nans[i][j] , num[i][j] = nnum[i][j];
    }
    void Link(const v4& B) { ///(u,v) (v,x)
        ll nans[2][2]; nans[0][0] = nans[0][1] = nans[1][0] = nans[1][1] = -1e18;
        int nnum[2][2]; memset(nnum , 0 ,sizeof(nnum));
        for(int i = 0;i < 2;i++) {
            for(int j = 0;j < 2;j++) {
                for(int k = 0 ; k < 2 - j;k++) {
                    for(int l = 0;l < 2;l++) {
                        if(ans[i][j] + B.ans[k][l] > nans[i][l]) {
                            nans[i][l] = ans[i][j] + B.ans[k][l];
                            nnum[i][l] = 1LL*num[i][j]*B.num[k][l] % mod;
                        }
                        else if(ans[i][j] + B.ans[k][l] == nans[i][l]) {
                            nnum[i][l] = (nnum[i][l] + 1LL*num[i][j]*B.num[k][l]) % mod;
                        }
                    }
                }
            }
        }
        for(int i = 0;i < 2;i++) for(int j = 0;j < 2;j++) ans[i][j] = nans[i][j] , num[i][j] = nnum[i][j];
    }
    void rev() {
        swap(ans[0][1] , ans[1][0]);
        swap(num[0][1] , num[1][0]);
    }
    pair<ll,int> get() {
        ll a = 0, nu = 0;
        for(int i = 0;i < 2;i++) {
            for(int j = 0;j < 2;j++) {
                if(ans[i][j] > a) {
                    a = ans[i][j] ; nu = num[i][j];
                }
                else if(ans[i][j] == a) nu = (nu + num[i][j]) % mod;
            }
        }
        return make_pair(a , nu);
    }
    void print() {
        for(int i = 0;i < 2;i++) for(int j = 0;j < 2;j++) printf("%lld ",ans[i][j]); printf("\n");
        for(int i = 0;i < 2;i++) for(int j = 0;j < 2;j++) printf("%d ",num[i][j]); printf("\n");
    }
};
map<pair<int,int>,v4> mp;
int deg[100005];
void solve()
{
    cin >> n >> m; mp.clear();
    for(int i = 1;i <= n;i++) deg[i] = 0 , E[i].clear();
    for(int i = 1;i <= m;i++) {
        int u , v ,  w;cin >> u >> v >> w;
        if(u > v) swap(u , v);
        v4 p ; p.Set(w);
        if(mp.count({u , v})) mp[{u , v}].Merge(p);
        else {mp[{u , v}] = p; deg[u]++ ; deg[v]++; E[u].insert(v) ; E[v].insert(u);}
    }
    queue<int> q;
    for(int i = 1;i <= n;i++) {
        if(deg[i] == 2) q.push(i);
    }
    while(q.size() && mp.size() > 1) {
        int u = q.front() ; q.pop() ;
        auto it = E[u].begin(); deg[u] = 0;
        int v1 = *it ; it++ ; int v2 = *it;
        v4 B , C;
        if(v1 > u) {B = mp[{u , v1}] ; B.rev() ;mp.erase({u , v1}) ; }
        else {B = mp[{v1 , u}] ;mp.erase({v1 , u}) ; }
        if(v2 > u) {C = mp[{u , v2}] ;mp.erase({u , v2}); }
        else {C = mp[{v2 , u}] ; C.rev() ;mp.erase({v2 , u}); }
        B.Link(C);
        if(v1 > v2) {
            swap(v1 , v2) ; B.rev();
        }
        E[v1].erase(u) ; E[v2].erase(u);
        if(mp.count({v1 , v2})) {
            mp[{v1 , v2}].Merge(B);
            deg[v1]-- ; deg[v2]--;
            if(deg[v1] == 2) q.push(v1);
            if(deg[v2] == 2) q.push(v2);
        }
        else {
            mp[{v1 , v2}] = B;
            E[v1].insert(v2) ; E[v2].insert(v1);
        }
    }
    assert(mp.size() == 1);
    auto it = mp.begin() ;
    auto ans = it->second.get() ;
    cout << ans.first <<' ' << ans.second << '\n';
}
int main()
{
    int t;cin >> t;
    while(t--) {
            solve();
    }
    return 0;
}

詳細信息


Pretests


Final Tests

Test #1:

score: 100
Accepted
time: 1608ms
memory: 28048kb

input:

6676
6 10
6 1 1
6 4 1
4 1 1
6 5 1
5 1 1
6 3 1
3 2 1
2 4 1
6 4 1
4 1 1
7 10
4 2 1
4 1 1
1 2 1
1 6 1
6 2 1
1 3 1
3 2 1
1 5 1
5 7 1
7 2 1
7 10
5 3 1
5 7 1
7 2 1
2 3 1
2 1 1
1 4 1
4 3 1
5 6 1
6 7 1
2 3 1
7 10
3 5 1
3 4 1
4 2 1
2 5 1
2 6 1
6 5 1
2 7 1
7 5 1
2 1 1
1 6 1
7 10
5 1 1
5 3 1
3 2 1
2 1 1
2 7 1
...

output:

3 5
3 6
3 14
3 10
3 11
2 13
2 16
3 6
3 3
3 9
2 9
2 14
4 5
3 10
3 13
3 4
3 5
3 14
3 5
2 15
3 10
3 3
3 3
3 14
2 3
3 6
3 3
3 6
3 11
3 17
3 7
3 2
3 6
3 13
3 9
3 11
3 14
3 6
3 2
2 2
2 11
4 4
3 6
3 6
3 5
3 11
2 10
3 5
4 5
2 18
3 13
3 5
3 3
3 12
3 9
2 11
3 2
3 3
3 4
2 7
3 3
3 3
3 2
3 8
3 10
2 15
3 3
3 12
3...

result:

ok 6676 lines