QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#706424 | #239. Maximum Weighted Matching | TheZone | 100 ✓ | 1608ms | 28048kb | C++20 | 4.6kb | 2024-11-03 11:14:48 | 2024-11-03 11:14:59 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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