QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#634384 | #9424. Stop the Castle 2 | Savior | WA | 276ms | 57472kb | C++20 | 4.7kb | 2024-10-12 17:11:38 | 2024-10-12 17:11:39 |
Judging History
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())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())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;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],i+n});
py[b[i][1]].insert({b[i][0],i+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=px[b[i][1]].upper_bound({b[i][0],0});
if(it!=px[b[i][1]].end()&&it!=px[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;
}
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 52916kb
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: 276ms
memory: 57472kb
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:
5 2 3 4 5 6 7 8 9 10 11 12 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 -2 6 7 8 9 10 11 12 6 17 18 19 1 1 2 3 4 5 6 7 8 8 7 8 7 13 14 15 -2 8 10 11 12 13 14 15 17 18 19 20 0 1 1 2 3 0 5 6 7 8 11 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 5 but is actually 7 (test case 1)