QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#634470#9424. Stop the Castle 2SaviorWA 267ms58328kbC++204.7kb2024-10-12 17:24:032024-10-12 17:24:04

Judging History

This is the latest submission verdict.

  • [2024-10-12 17:24:04]
  • Judged
  • Verdict: WA
  • Time: 267ms
  • Memory: 58328kb
  • [2024-10-12 17:24:03]
  • Submitted

answer

#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
//#define int long long
#define double long double
using ll = long long;
const int N=4e5+5,inf=2e9,mod=1e9+7;
typedef pair<int,int>P;
struct edge{
    int to,cap,rev,dir;
};
int n,m,k,S,T;
vector<edge>e[N];
void add(int u,int v,int w,int d){
    e[u].push_back({v,w,(int)e[v].size(),1});
    e[v].push_back({u,0,(int)e[u].size()-1,0});
    return;
}
int level[N];
void bfs(int u){
    memset(level,-1,sizeof(level));
    queue<int>q;level[u]=0;
    q.push(u);
    while(!q.empty()){
        int cur=q.front();
        q.pop();
        for(auto it:e[cur]){
            if(level[it.to]<0&&it.cap>0){
                level[it.to]=level[cur]+1;
                q.push(it.to);
            }
        }
    }
    return;
}
int iter[N];
int dfs(int u,int f){
    if(u==T) return f;
    int sz=e[u].size();
    for(int&i=iter[u];i<sz;i++){
        edge&it=e[u][i];
        if(it.cap>0&&level[it.to]>level[u]){
            int d=dfs(it.to,min(f,it.cap));
            if(d>0){
                it.cap-=d;
                e[it.to][it.rev].cap+=d;
                return d;
            }
        }
    }
    return 0;
}
int flow(int s,int t){
    int flow=0;
    while(1){
        bfs(s);
        if(level[t]<0) return flow;
        memset(iter,0,sizeof(iter));
        int d=0;
        while((d=dfs(s,inf))>0) flow+=d;
    }
    return flow;
}
int a[N][2],b[N][2];
int arr[N<<1],tot=0;
int cal(int x){
    return lower_bound(arr+1,arr+1+tot,x)-arr;
}
set<P>px[N],py[N];

map<P,int>mp;

bool use[N];
int lef[N],up[N];


void solve(){
    cin>>n>>m>>k;
    S=0,T=2*n+2;int T1=2*n+1;
    tot=0;mp.clear();
    for(int i=1;i<=2*n+2*m;i++) px[i].clear(),py[i].clear();
    for(int i=1;i<=m;i++) use[i]=lef[i]=up[i]=0;
    for(int i=S;i<=T;i++) e[i].clear();
    for(int i=1;i<=n;i++) cin>>a[i][0]>>a[i][1],arr[++tot]=a[i][0],arr[++tot]=a[i][1];
    for(int i=1;i<=m;i++) cin>>b[i][0]>>b[i][1],arr[++tot]=b[i][0],arr[++tot]=b[i][1];
    sort(arr+1,arr+tot+1);tot=unique(arr+1,arr+1+tot)-1-arr;
    for(int i=1;i<=n;i++) a[i][0]=cal(a[i][0]),a[i][1]=cal(a[i][1]);
    for(int i=1;i<=m;i++) b[i][0]=cal(b[i][0]),b[i][1]=cal(b[i][1]);
    for(int i=1;i<=n;i++) px[a[i][0]].insert({a[i][1],i}),py[a[i][1]].insert({a[i][0],i});
    for(int i=1;i<=m;i++){
        int rig=0,dow=0;
        auto it=px[b[i][0]].upper_bound({b[i][1],0});
        if(it==px[b[i][0]].end()||it==px[b[i][0]].begin())continue;
        rig=it->second;
        lef[i]=prev(it)->second;
        it=py[b[i][1]].upper_bound({b[i][0],0});
        if(it==py[b[i][1]].end()||it==py[b[i][1]].begin())continue;
        dow=it->second+n;
        up[i]=prev(it)->second;
        add(rig,dow,1,1);
        mp[{rig,dow}]=i;
    }
    for(int i=1;i<=n;i++) add(S,i,1,1);
    for(int i=n+1;i<=2*n;i++) add(i,T1,1,1);
    add(T1,T,m-k,1);
    flow(S,T);
    int ans=0,num=0;
    for(int i=1;i<=2*n+2*m;i++){
        if(!px[i].empty()) ans+=px[i].size()-1;
        if(!py[i].empty()) ans+=py[i].size()-1;
    }
    for(int i=1;i<=n;i++){
        for(auto&it:e[i]){
            if(it.cap==0&&it.dir==1){
                int id=mp[{i,it.to}];
                use[id]=1;
                num++;
                ans-=2;
                px[b[i][0]].insert({b[i][1],id+n});
                py[b[i][1]].insert({b[i][0],id+n});
                break;
            }
        }
    }
    int res=m-k-num;
    for(int i=1;i<=m;i++){
        if(use[i])continue;
        if(res==0)break;
        auto it=px[b[i][0]].upper_bound({b[i][1],0});
        if(it!=px[b[i][0]].end()&&it!=px[b[i][0]].begin()){
            if(it->second<=n&&prev(it)->second<=n){
                use[i]=1;ans-=1;
                res-=1;
                px[b[i][0]].insert({b[i][1],i+n});
                py[b[i][1]].insert({b[i][0],i+n});
                continue;
            }
        }
        it=py[b[i][1]].upper_bound({b[i][0],0});
        if(it!=py[b[i][1]].end()&&it!=py[b[i][1]].begin()){
            if(it->second<=n&&prev(it)->second<=n){
                use[i]=1;ans-=1;
                res-=1;
                px[b[i][0]].insert({b[i][1],i+n});
                py[b[i][1]].insert({b[i][0],i+n});
                continue;
            }
        }
    }
    if(res){
        for(int i=1;i<=m;i++){
            if(use[i]==0){
                use[i]=1;
                res--;
            }
            if(res==0) break;
        }
    }
    cout<<ans<<endl;
    for(int i=1;i<=m;i++) if(!use[i]) cout<<i<<' ';
    cout<<endl;
    return;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int t=1;cin>>t;
    while(t--)solve();
    return 0;
}


Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 6ms
memory: 53908kb

input:

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

output:

4
2 3 5 6 
2
2 
0
2 3 

result:

ok ok 3 cases (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 267ms
memory: 58328kb

input:

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

output:

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

result:

wrong answer Participant states the answer to be 2 but is actually 3 (test case 48)