QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#407981#6414. Classical Maximization Problemgrass8cow#TL 0ms13196kbC++171.6kb2024-05-09 15:36:452024-05-09 15:36:46

Judging History

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

  • [2024-05-09 15:36:46]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:13196kb
  • [2024-05-09 15:36:45]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
vector<int>g[401000];int m;
map<int,int>fx,fy;
#define pb push_back
int X[400100],Y[401000],dfn[400100];
int U[401000],V[400100];bool vis[401000];
int ans,A[400100],B[401000],n1,n2;
void lj(int x,int y){
    ans++,A[ans]=x,B[ans]=y,vis[x]=vis[y]=1;
}
#define pb push_back
void ad(int u,int v,int w){U[w]=u,V[w]=v,g[u].pb(w),g[v].pb(w);}
void dfs(int x,int o){
    dfn[x]=++dfn[0];
    vector<int>Z;
    for(int i:g[x]){
        int v=U[i]^V[i]^x;
        if(!dfn[v]){
            dfs(v,i);
            if(!vis[i])Z.pb(i);
        }
        else if(dfn[x]<dfn[v])Z.pb(i);
    }
    while(Z.size()>=2){
        int x=Z.back();Z.pop_back();
        int y=Z.back();Z.pop_back();
        lj(x,y);
    }
    if(o&&!Z.empty())lj(o,Z.back());
}
void sol(){
    scanf("%d",&m);m*=2;
    fx.clear(),fy.clear();
    for(int i=1;i<=m;i++){
        vis[i]=0;
        scanf("%d%d",&X[i],&Y[i]);
        if(!fx[X[i]])fx[X[i]]=++n1;
        X[i]=fx[X[i]];
        if(!fy[Y[i]])fy[Y[i]]=++n2;
        Y[i]=fy[Y[i]];
    }
    dfn[0]=0;
    for(int i=1;i<=n1+n2;i++)g[i].clear(),dfn[i]=0;
    for(int i=1;i<=m;i++)ad(X[i],n1+Y[i],i);
    ans=0;for(int i=1;i<=n1+n2;i++)if(!dfn[i])dfs(i,0);
    printf("%d\n",ans);for(int i=1;i<=ans;i++)printf("%d %d\n",A[i],B[i]);
    vector<int>Z;
    for(int i=1;i<=m;i++)if(!vis[i])Z.pb(i);
    while(Z.size()>=2){
        int x=Z.back();Z.pop_back();
        int y=Z.back();Z.pop_back();
        printf("%d %d\n",x,y);
    }
}
int main(){
    int T;scanf("%d",&T);
    while(T--)sol();
    return 0;
}

詳細信息

Test #1:

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

input:

3
2
0 0
0 1
1 0
1 1
2
0 0
0 1
0 2
0 3
2
0 0
1 1
2 2
3 3

output:

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

result:

ok ok (3 test cases)

Test #2:

score: -100
Time Limit Exceeded

input:

10000
2
-107276936 -310501829
419434212 585811870
-65754386 -491212232
381152038 897148193
3
-474045168 493506332
299114415 540203303
165808153 983551
-506936261 -694189769
766718170 -725540031
975267148 -593051087
1
-818952276 -762387923
584023914 -612401389
6
-77701228 -266484128
659434465 6322062...

output:

0
4 3
2 1
0
6 5
4 3
2 1
0
2 1
0
12 11
10 9
8 7
6 5
4 3
2 1
0
14 13
12 11
10 9
8 7
6 5
4 3
2 1
0
2 1
0
66 65
64 63
62 61
60 59
58 57
56 55
54 53
52 51
50 49
48 47
46 45
44 43
42 41
40 39
38 37
36 35
34 33
32 31
30 29
28 27
26 25
24 23
22 21
20 19
18 17
16 15
14 13
12 11
10 9
8 7
6 5
4 3
2 1
0
6 5
4 3...

result: