QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#597478 | #9424. Stop the Castle 2 | ucup-team5075# | RE | 36ms | 302848kb | C++14 | 5.0kb | 2024-09-28 17:54:10 | 2024-09-28 17:54:10 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
#define int long long
const int N=3e6+9,M=3e6+9,inf=1e16;
namespace WLL{
struct Edge{
int nxt,to,dis;
Edge(){}
Edge(int x,int y,int z){nxt=x,to=y,dis=z;}
}edge[M<<1];
int head[N],edge_cnt=1;
void Add_edge(int u,int v,int w){edge[++edge_cnt]=Edge(head[u],v,w);head[u]=edge_cnt;}
void Add(int u,int v,int w)
{
// cerr<<"Add "<<u<<" "<<v<<" "<<w<<endl;
Add_edge(u,v,w),Add_edge(v,u,0);
}
int S,T;
queue<int> q;
int dep[N];
bool bfs()
{
while(!q.empty()) q.pop();
for(int i=1;i<=T;i++) dep[i]=0;
dep[S]=1;q.push(S);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u],v;i;i=edge[i].nxt)
if(!dep[v=edge[i].to]&&edge[i].dis>0)
{
dep[v]=dep[u]+1;
q.push(v);
}
}
return dep[T];
}
int cur[N];
int dfs(int u,int flow)
{
if(u==T) return flow;
for(int &i=cur[u],v;i;i=edge[i].nxt)
if(dep[v=edge[i].to]==dep[u]+1&&edge[i].dis>0)
{
int qwq=dfs(v,min(flow,edge[i].dis));
if(qwq)
{
edge[i].dis-=qwq;
edge[i^1].dis+=qwq;
return qwq;
}
}
return 0;
}
int Dinic()
{
int ans=0;
while(bfs())
{
for(int i=1;i<=T;i++) cur[i]=head[i];
while(int d=dfs(S,inf)) ans+=d;
}
return ans;
}
void Clear()
{
for(int i=1;i<=edge_cnt;i++) edge[i]=Edge(0,0,0);
for(int i=1;i<=T;i++) head[i]=dep[i]=cur[i]=0;
edge_cnt=1;
S=T=0;
}
}
using WLL::Add;
using WLL::Dinic;
//--------------------------------------------------------------------------
int pos1[N][2],pos2[N][2];
int n,m,K;
int lsh[N<<1],lm=0;
vector<pair<int,int> > ma1[N],ma2[N];
int hcnt,lcnt;
int idx[N][2];
int ans=0;
map<int,int> ma[N];
int used[N];
int used2[N];
void Clear2()
{
for(int i=1;i<=lm;i++) ma1[i].clear(),ma2[i].clear();
for(int i=0;i<=hcnt+lcnt;i++) ma[i].clear();
hcnt=lcnt=0;
for(int i=1;i<=m;i++) idx[i][0]=idx[i][1]=used[i]=0;
ans=0;
lm=0;
}
void work()
{
WLL::Clear();
Clear2();
scanf("%lld%lld%lld",&n,&m,&K);
// cerr<<n<<" "<<m<<" "<<K<<endl;
K=m-K;
for(int i=1;i<=n;i++) scanf("%lld%lld",&pos1[i][0],&pos1[i][1]);
for(int i=1;i<=m;i++) scanf("%lld%lld",&pos2[i][0],&pos2[i][1]);
for(int i=1;i<=n;i++) lsh[++lm]=pos1[i][0],lsh[++lm]=pos1[i][1];
for(int i=1;i<=m;i++) lsh[++lm]=pos2[i][0],lsh[++lm]=pos2[i][1];
sort(lsh+1,lsh+lm+1);
lm=unique(lsh+1,lsh+lm+1)-lsh-1;
for(int i=1;i<=n;i++)
for(int j=0;j<=1;j++)
pos1[i][j]=lower_bound(lsh+1,lsh+lm+1,pos1[i][j])-lsh;
for(int i=1;i<=m;i++)
for(int j=0;j<=1;j++)
pos2[i][j]=lower_bound(lsh+1,lsh+lm+1,pos2[i][j])-lsh;
// for(int i=1;i<=n;i++) cerr<<pos1[i][0]<<" "<<pos1[i][1]<<endl;
for(int i=1;i<=n;i++)
ma1[pos1[i][0]].push_back(make_pair(pos1[i][1],0));
for(int i=1;i<=n;i++)
ma2[pos1[i][1]].push_back(make_pair(pos1[i][0],0));
for(int i=1;i<=m;i++)
ma1[pos2[i][0]].push_back(make_pair(pos2[i][1],i));
for(int i=1;i<=m;i++)
ma2[pos2[i][1]].push_back(make_pair(pos2[i][0],i));
for(int i=1;i<=lm;i++)
{
sort(ma1[i].begin(),ma1[i].end());
int lst=-1;
for(int j=0;j<ma1[i].size();j++)
if(ma1[i][j].second==0)
{
if(lst!=-1)
{
if(lst==j-1) ans++;
else
{
hcnt++;
for(int k=lst+1;k<j;k++)
idx[ma1[i][k].second][0]=hcnt;
}
}
lst=j;
}
}
for(int i=1;i<=lm;i++)
{
sort(ma2[i].begin(),ma2[i].end());
int lst=-1;
for(int j=0;j<ma2[i].size();j++)
if(ma2[i][j].second==0)
{
if(lst!=-1)
{
if(lst==j-1) ans++;
else
{
lcnt++;
for(int k=lst+1;k<j;k++)
idx[ma2[i][k].second][1]=lcnt;
}
}
lst=j;
}
}
WLL::S=hcnt+lcnt+1;
WLL::T=hcnt+lcnt+2;
for(int i=1;i<=hcnt;i++) Add(WLL::S,i,1);
for(int i=1;i<=lcnt;i++) Add(i+hcnt,WLL::T,1);
for(int i=1;i<=m;i++)
if(idx[i][0]&&idx[i][1]) Add(idx[i][0],idx[i][1]+hcnt,1);
int fuck=Dinic();
int ts_cnt=min(fuck,K);
int normal_cnt=min(hcnt+lcnt-ts_cnt*2,K-ts_cnt);
// cerr<<ts_cnt<<" "<<normal_cnt<<endl;
int qwq=ans+(hcnt+lcnt)-(2*ts_cnt+normal_cnt);
printf("%lld\n",qwq);
//print answer
int fz1=0;
for(int i=1;i<=m;i++) ma[idx[i][0]][idx[i][1]]=i;
for(int i=1;i<=hcnt+lcnt;i++) used2[i]=0;
for(int u=1;u<=hcnt;u++)
for(int i=WLL::head[u];i;i=WLL::edge[i].nxt)
if(WLL::edge[i].dis==0)
{
int v=WLL::edge[i].to;
if(v<WLL::S)
{
if(fz1<ts_cnt)
{
fz1++;
used[ma[u][v-hcnt]]=1;
used2[u]=1;
used2[v]=1;
}
}
}
int fz2=0;
for(int i=1;i<=hcnt;i++)
if(!used2[i]&&fz2<normal_cnt&&ma[i][0])
{
fz2++;
used[ma[i][0]]=1;
}
for(int i=1;i<=lcnt;i++)
if(!used2[i+hcnt]&&fz2<normal_cnt&&ma[0][i])
{
fz2++;
used[ma[0][i]]=1;
}
int fz3=fz1+fz2;
for(int i=1;i<=m;i++)
if(!used[i]&&fz3<K)
{
fz3++;
used[i]=1;
}
if(fz1!=ts_cnt) exit(-1);
if(fz2!=normal_cnt) exit(-1);
for(int i=1;i<=m;i++)
if(!used[i]) printf("%lld ",i);
puts("");
}
signed main()
{
int T;
scanf("%lld",&T);
// T=1;
while(T--) work();
}
詳細信息
Test #1:
score: 100
Accepted
time: 36ms
memory: 302848kb
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
Runtime Error
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 11 12 13 14 2 10 11 12 13 14 4 3 4 5 6 7 8 ...