QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#597988 | #9424. Stop the Castle 2 | ucup-team1004# | WA | 61ms | 17420kb | C++14 | 2.5kb | 2024-09-28 19:51:47 | 2024-09-28 19:51:52 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct edge{
int next,to,f;
}e[N<<3];
int first[N],len,cur[N],vis[N],p[N];
void add(int a,int b,int c)
{
e[++len]=edge{first[a],b,c};
first[a]=len;
}
struct my_queue{
int head,tail,q[N];
void push(int x){q[tail++]=x;}
int size(){return tail-head;}
int top(){return q[head++];}
void clr()
{
for(int i=0,x;i<=tail;i++)
x=q[i],cur[x]=vis[x]=0;
head=tail=0;
}
}q;
int X,Y,n,m,k,p1[N],p2[N],v1[N],v2[N],id[N];
map<int,int> t1,t2;
bool bfs(int x)
{
q.clr(),cur[x]=first[x];
q.push(x),vis[x]=1;
while(q.size())
for(int i=first[x=q.top()],y;i;i=e[i].next)
if(e[i].f&&!vis[y=e[i].to])
{
vis[y]=vis[x]+1,q.push(y),cur[y]=first[y];
if(y==Y) return 1;
}
return 0;
}
int dfs(int x,int flow)
{
if(x==Y) return flow;
int s=0,h;
for(int &i=cur[x],y;i;i=e[i].next)
{
if(e[i].f&&vis[y=e[i].to]==vis[x]+1)
h=dfs(y,min(e[i].f,flow)),e[i].f-=h,e[i^1].f+=h,s+=h,flow-=h;
if(!flow) break;
}
return s;
}
void Add(int a,int b,int c){add(a,b,c),add(b,a,0);}
struct node{
int x,y,p;
}a[N];
bool operator <(node a,node b)
{
return a.x==b.x?a.y<b.y:a.x<b.x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
vector<int> v;
scanf("%d%d%d",&n,&m,&k);
k=m-k,len=1;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y),a[i].p=0;
for(int i=n+1;i<=n+m;i++)
scanf("%d%d",&a[i].x,&a[i].y),a[i].p=i-n;
sort(a+1,a+n+m+1);
int num=0,S=0;
for(int i=1,cnt=0;i<=n+m;i++)
{
int x=a[i].x,y=a[i].y;
if(a[i].p==0)
{
p1[t1[x]]=p2[t2[y]]=1;
t1[x]=t2[y]=++cnt;
}
else
{
x=t1[x],y=t2[y];
v1[x]=v2[y]=a[i].p;
if(x&&y) Add(x,y+n,1),id[++num]=a[i].p;
}
}
X=2*n+1,Y=2*n+2;
for(int i=1;i<=n;i++)
{
if(p1[i]) Add(X,i,1),S++;
if(p2[i]) Add(i+n,Y,1),S++;
}
while(bfs(X)) dfs(X,n);
for(int i=1;k&&i<=num;i++)
{
int w=i<<1;
if(!e[w].f)
p2[e[w].to-n]=p1[e[w^1].to]=0,p[id[i]]=1,k--,S-=2;
}
for(int i=1;i<=n;i++)
{
if(k&&p1[i]&&v1[i])
S--,k--,p[v1[i]]=1;
if(k&&p2[i]&&v2[i])
S--,k--,p[v2[i]]=1;
}
for(int i=1;k&&i<=n;i++)
if(!p[i]) p[i]=1,k--;
printf("%d\n",S);
for(int i=1;i<=m;i++)
if(!p[i]) printf("%d ",i);
puts("");
for(int i=1;i<=max(n,m);i++) v1[i]=v2[i]=p[i]=id[i]=p1[i]=p2[i]=0;
t1.clear(),t2.clear();
for(int i=1;i<=Y;i++) vis[i]=cur[i]=first[i]=0;
for(int i=1;i<=len;i++) e[i]=e[0];
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 14204kb
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: 61ms
memory: 17420kb
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 2 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 15 16 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 4 5 6 7 7 8 12 13 14 15 2 10 11 12 13 14 4 3 ...
result:
wrong answer Integer parameter [name=part] equals to 6, violates the range [0, 1] (test case 4)