QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#620394#2439. Line GraphsAfterlife#AC ✓602ms40440kbC++204.6kb2024-10-07 17:55:512024-10-07 17:55:53

Judging History

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

  • [2024-10-07 17:55:53]
  • 评测
  • 测评结果:AC
  • 用时:602ms
  • 内存:40440kb
  • [2024-10-07 17:55:51]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=1000020;
int n,m,d[N];
vector<int> G[N],cg[N];
ll ans,tot;
struct Ans{
    int mx;
    ll tot;
};
Ans Merge(Ans a,Ans b){
    if(a.mx>b.mx)return a;
    if(b.mx>a.mx)return b;
    a.tot=(a.tot+b.tot)%mod;
    return a;
}
inline int C2(int x){
    return 1LL*x*(x-1)/2%mod;
}
inline int C3(int x){
    return 1LL*x*(x-1)*(x-2)/6%mod;
}
int k;
vector<pair<int,int> > H[N];
vector<pair<int,int> > E;
void Baoli(){
    for(int t=1;t<=k;++t){
        int z=E.size();
        for(int i=1;i<=n;++i){
            H[i].clear();
        }
        for(int i=0;i<(int)E.size();++i){
            int u=E[i].first,v=E[i].second;
            H[u].emplace_back(v,i+1);
            H[v].emplace_back(u,i+1);
        }
        vector<pair<int,int> > _E;
        for(int u=1;u<=n;++u){
            for(int i=0;i<(int)H[u].size();++i){
                for(int j=i+1;j<(int)H[u].size();++j){
                    _E.emplace_back(H[u][i].second,H[u][j].second);
                }
            }
        }
        n=z;
        E=_E;
    }
    for(int i=1;i<=n;++i)G[i].clear();
    for(auto [u,v]:E){
        G[u].push_back(v);
        G[v].push_back(u);
    }
    Ans ans={0,1};
    if(n)
        ans=Merge(ans,{1,n});
    if(E.size())
        ans=Merge(ans,{2,(int)E.size()});
    Ans now={3,0};
    vector<int> vis(n+1);
    for(int u=1;u<=n;++u){
        for(auto x:G[u])
            vis[x]++;
        for(auto x:G[u]){
            for(auto y:G[x]){
                if(y==u)
                    continue;
                now.tot=(now.tot+vis[y])%mod;
            }
        }
        for(auto x:G[u])
            vis[x]--;
    }
    now.tot/=6;
    if(now.tot)
        ans=Merge(ans,now);
    cout<<ans.mx<<' '<<ans.tot<<'\n';
}
void Solve(){
    cin>>n>>m>>k;
    E.clear();
    for(int i=1;i<=n;++i){
        cg[i].clear();
        G[i].clear();
    }
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
        E.emplace_back(u,v);
    }
    for(int i=1;i<=n;++i){
        d[i]=G[i].size();
    }
    for(int i=1;i<=n;++i){
        sort(G[i].begin(),G[i].end(),[&](int u,int v){return G[u].size()>G[v].size();});
        cg[i].resize(G[i].size());
        for(int j=(int)cg[i].size()-1;j>=0;--j){
            cg[i][j]=1;
            if(j+1<(int)cg[i].size()&&d[G[i][j]]==d[G[i][j+1]])cg[i][j]+=cg[i][j+1];
        }
    }
    Ans ans={0,0};
    if(k==1){
        for(int i=1;i<=n;++i){
            ans=Merge(ans,{d[i],1});
        }
    }
    else if(k==2){
        for(auto [u,v]:E){
            ans=Merge(ans,{d[u]+d[v]-2,1});
        }
    }
    else if(k==3){
        for(int u=1;u<=n;++u){
            if(d[u]<2)continue;
            Ans now;
            now.mx=2*d[u]+d[G[u][0]]+d[G[u][1]]-6;
            if(d[G[u][0]]==d[G[u][1]]){
                now.tot=C2(cg[u][0]);
            }
            else{
                now.tot=cg[u][1];
            }
            ans=Merge(ans,now);
        }
    }
    else{
        for(auto [u,v]:E){
            if(d[u]<2||d[v]<2)continue;
            Ans now;
            int x=G[u][0]==v?G[u][1]:G[u][0];
            int y=G[v][0]==u?G[v][1]:G[v][0];
            now.mx=3*(d[u]+d[v])+(d[x]+d[y])-14;
            int cx=(G[u][0]==v?cg[u][1]:(cg[u][0]-(d[x]==d[v])));
            int cy=(G[v][0]==u?cg[v][1]:(cg[v][0]-(d[y]==d[u])));
            now.tot=1ll*cx*cy%mod;
            // now.tot=1LL*cg[u][G[u][0]==v]*cg[v][G[v][0]==u]%mod;
            ans=Merge(ans,now);
        }
        for(int u=1;u<=n;++u){
            if(d[u]<3)continue;
            Ans now;
            int d2=d[G[u][0]];
            int d3=d[G[u][1]];
            int d4=d[G[u][2]];
            now.mx=4*d[u]+2*d[G[u][0]]+d[G[u][1]]+d[G[u][2]]-14;
            if(d2==d3){
                if(d3==d4){
                    now.tot=1LL*C2(cg[u][0]-1)*cg[u][0]%mod;
                }
                else{
                    now.tot=2*cg[u][2];
                }
            }
            else{
                if(d3==d4){
                    now.tot=C2(cg[u][1]);
                }
                else{
                    now.tot=cg[u][2];
                }
            }
            ans=Merge(ans,now);
        }
    }
    if(ans.mx<=3){
        Baoli();
        return;
    }
    cout<<ans.mx<<' '<<ans.tot<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)
        Solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 7760kb

input:

3
5 0 4
5 4 1
1 2
1 3
1 4
1 5
5 4 4
1 2
1 3
1 4
1 5

output:

0 1
4 1
6 12

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 7684kb

input:

12
8 7 1
1 2
1 3
1 4
1 5
6 7
7 8
8 6
8 7 2
1 2
1 3
1 4
1 5
6 7
7 8
8 6
8 7 3
1 2
1 3
1 4
1 5
6 7
7 8
8 6
8 7 4
1 2
1 3
1 4
1 5
6 7
7 8
8 6
8 7 1
1 2
1 3
1 4
4 5
6 7
7 8
8 6
8 7 2
1 2
1 3
1 4
4 5
6 7
7 8
8 6
8 7 3
1 2
1 3
1 4
4 5
6 7
7 8
8 6
8 7 4
1 2
1 3
1 4
4 5
6 7
7 8
8 6
10 8 1
1 2
1 3
1 4
4 5
6 ...

output:

4 1
3 9
4 6
6 12
3 2
3 3
3 5
4 1
4 1
3 10
4 6
6 12

result:

ok 12 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 7700kb

input:

100
13 29 3
6 8
5 11
8 13
3 9
1 8
6 12
4 11
2 12
3 11
6 10
8 11
3 13
4 8
6 13
3 12
8 9
9 10
6 9
7 12
8 12
1 3
1 2
2 13
4 6
1 4
10 13
2 4
6 11
2 10
12 1 4
7 8
20 34 3
8 17
3 20
2 14
14 17
8 12
9 18
3 15
16 19
1 17
9 13
8 18
2 9
17 20
7 16
13 16
10 12
7 11
11 15
7 10
3 7
7 8
1 10
4 20
13 15
4 14
13 14...

output:

20 8
0 1
16 1
3 4
1 1
32 6
8 1
8 1
7 1
3 2
6 1
6 2
0 1
11 3
0 1
7 2
20 3
7 2
0 1
50 1
11 1
26 3
7 1
0 1
2 2
30 95
36 3
18 4
64 1
17 1
5 2
24 1
3 1
0 1
10 2
0 1
25 2
5 1
1 1
8 1
2 3
0 1
7 2
11 2
4 1
6 5
34 3
11 2
22 3
3 1
22 1
35 1
25 2
42 150
3 8
4 7
5 6
72 4
0 1
5 2
1 1
2 1
3 1
8 19
6 1
34 12
54 3
...

result:

ok 100 lines

Test #4:

score: 0
Accepted
time: 602ms
memory: 40440kb

input:

1000
5 0 4
5 4 1
1 2
1 3
1 4
1 5
5 4 4
1 2
1 3
1 4
1 5
3 0 3
7 20 3
7 5
7 2
1 6
2 3
5 1
7 4
5 6
1 2
2 6
6 4
4 3
4 2
3 5
7 3
4 1
1 7
3 6
3 1
7 6
4 5
6 5 2
3 1
5 1
2 6
6 1
6 3
9 7 3
1 6
6 4
8 3
3 7
2 8
7 6
7 5
6 5 3
3 2
3 1
2 1
6 5
6 3
4 4 2
1 2
2 4
2 3
3 4
4 5 1
3 2
2 4
1 2
3 4
1 3
7 2 3
4 6
7 3
10 2...

output:

0 1
4 1
6 12
0 1
18 30
4 1
5 1
4 3
3 4
3 4
0 1
16 1
0 1
19 3
0 1
0 1
0 1
2 2
22 3
40 6
6 7
0 1
0 1
4 1
5 3
0 1
0 1
18 3
3 1
0 1
9 8
0 1
15 4
28 6
1 1
1 1
0 1
0 1
0 1
6 3
3 1
1 1
25 6
34 36
8 3
10 4
10 3
40 1
0 1
0 1
1 1
0 1
4 1
8 2
6 2
1 1
2 1
1 1
26 12
0 1
0 1
3 1
2 1
6 1
11 1
18 30
14 13
0 1
1 1
0...

result:

ok 1000 lines