QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#417830 | #5202. Dominoes | mayunfei | TL | 803ms | 6176kb | C++14 | 3.2kb | 2024-05-22 23:04:23 | 2024-05-22 23:04:23 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define lll __int128
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
ll rint(ll l,ll r){return uniform_int_distribution<ll>(l,r)(rnd);}
const int maxn=1010,N=2010,M=2e4+10,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int n,m,S,T,tot,tot1,pf[maxn][maxn],typ[N],f[N],cnt,fir[N],fir_[N],dep[N],use[N],tim;
char s[maxn][maxn];
struct node{int u,v,w,op,next;}e[M];
void add_edge(int u,int v,int w)
{
cnt++,e[cnt].u=u,e[cnt].v=v,e[cnt].w=w,e[cnt].next=fir[u],fir[u]=cnt;
cnt++,e[cnt].u=v,e[cnt].v=u,e[cnt].w=0,e[cnt].next=fir[v],fir[v]=cnt;
e[fir[u]].op=fir[v],e[fir[v]].op=fir[u];
}
queue<int> q;
bool bfs()
{
memset(dep+1,0x3f,sizeof(dep[1])*T),q.push(S),dep[S]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=fir[x];i;i=e[i].next)
if(e[i].w&&dep[e[i].v]>dep[x]+1)
dep[e[i].v]=dep[x]+1,q.push(e[i].v);
}
return dep[T]<1e9;
}
int dfs(int now,int flow)
{
if(now==T) return flow;
int res=0;
for(int &i=fir_[now];i&&flow;i=e[i].next)
{
if(e[i].w&&dep[e[i].v]==dep[now]+1)
{
int tmp=dfs(e[i].v,min(flow,e[i].w));
if(!tmp)
{
dep[e[i].v]=-1;
continue;
}
flow-=tmp,res+=tmp,e[i].w-=tmp,e[e[i].op].w+=tmp;
if(!flow) return res;
}
}
return res;
}
int dinic()
{
int res=0;
while(bfs()) memcpy(fir_+1,fir+1,sizeof(fir[1])*T),res+=dfs(S,1e9);
return res;
}
int bfs2(int st)
{
int res=1;
use[st]=++tim,q.push(st);
while(!q.empty())
{
int x=q.front();
if(typ[x]==1&&x!=f[st]) cerr<<st<<"->"<<x<<endl,res++;
q.pop();
for(int i=fir[x];i;i=e[i].next)
if(e[i].w&&use[e[i].v]!=tim&&typ[e[i].v])
use[e[i].v]=tim,q.push(e[i].v);
}
cerr<<st<<":"<<res<<endl;
return tot1-res;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]=='.') pf[i][j]=++tot;
if(tot>2000) printf("1000000"),exit(0);
S=tot+1,T=S+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='.')
{
typ[pf[i][j]]=((i+j)&1)+1;
if((i+j)&1)
{
add_edge(S,pf[i][j],1);
for(int k=0;k<4;k++)
{
int nx=i+dx[k],ny=j+dy[k];
if(s[nx][ny]=='.') add_edge(pf[i][j],pf[nx][ny],1);
}
}
else add_edge(pf[i][j],T,1),tot1++;
}
}
}
int myf=dinic(),ans=tot1*(tot1-1);
for(int i=1;i<=cnt;i++)
if(e[i].w==0&&typ[e[i].u]==2&&typ[e[i].v]==1)
f[e[i].u]=e[i].v,f[e[i].v]=e[i].u;
for(int i=1;i<=tot;i++) cerr<<i<<"<->"<<f[i]<<endl;
for(int i=1;i<=tot;i++)
{
if(typ[i]==2)
{
ans+=bfs2(i);
if(ans>=1e6) printf("1000000"),exit(0);
}
}
printf("%d",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3748kb
input:
3 6 ...#.. ...... #...##
output:
52
result:
ok 1 number(s): "52"
Test #2:
score: 0
Accepted
time: 1ms
memory: 6052kb
input:
2 2 .. ..
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: 0
Accepted
time: 1ms
memory: 3848kb
input:
2 2 #. #.
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 1ms
memory: 5896kb
input:
4 5 ###.. .###. .##.. #...#
output:
34
result:
ok 1 number(s): "34"
Test #5:
score: 0
Accepted
time: 2ms
memory: 6020kb
input:
11 12 .#######..## .##..#.....# #####..##.#. #..##...#... ###..#..##.. ####..###... .#....##..## .#####....## .###..###### .######...## #....##...##
output:
1674
result:
ok 1 number(s): "1674"
Test #6:
score: 0
Accepted
time: 3ms
memory: 5960kb
input:
50 45 ####...#.#####..#..#.#########.##.#####..#..# ##.#.....#..#####....##..###...##.....##....# ##.#...####.##.#..#...####.#....##.###....... ...#...#..#..#.##.######...##..#...###..####. ##.....#.###.####.###..#....##..##..##.###... ..#.##.......##...##.........#..##.###.###... ###..##.###...###....
output:
496312
result:
ok 1 number(s): "496312"
Test #7:
score: 0
Accepted
time: 191ms
memory: 6176kb
input:
34 65 ...............#####.#..##..############.....###....#..########## .........#......#.......##..############.##..##........########## ..............#.......#.....##########..............##.########## ...##............#..............######.......#......#..########## ......#....#.....##......#.......
output:
279744
result:
ok 1 number(s): "279744"
Test #8:
score: 0
Accepted
time: 803ms
memory: 6084kb
input:
44 44 ............................................ ............................................ ............................................ ............................................ ............................................ ............................................ ...........................
output:
936056
result:
ok 1 number(s): "936056"
Test #9:
score: -100
Time Limit Exceeded
input:
45 45 ............................................. ............................................. ............................................. ............................................. ............................................. ............................................. .....................