QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#578688 | #5114. Cells Coloring | 7islands | WA | 539ms | 15592kb | C++23 | 2.7kb | 2024-09-20 20:49:10 | 2024-09-20 20:49:15 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=0x3f3f3f3f3f3f3f3f;
const ll infll=0x3f3f3f3f3f3f3f3f;
#define int long long
#define pii pair <int,int>
#define ld long double
#define endl "\n"
const int N=500050;
struct EDGE_{
int to,w,nxt;
}E_[N];
int HEAD_[N],cnt;
//链式前向星存图:HEAD[i]是i最后出现的位置,nxt是这个点为出点的上一个位置。
void INIT(int n){
for (int i=0;i<=n;i++)HEAD_[i]=-1;
cnt=0;
}
void ADD1(int u,int v,int w){
E_[cnt].nxt=HEAD_[u];
E_[cnt].to=v;
E_[cnt].w=w;
HEAD_[u]=cnt++;
}
void ADD(int u,int v,int w){
ADD1(u,v,w);
ADD1(v,u,0);
}
int S_,T_;
int NOW[N],DIS[N];
int BFS_(){
memset(DIS, 0x3f,sizeof DIS);//<-注意数据范围:如果需要开ll,应该改掉inf
queue<int> q;
q.push(S_);
DIS[S_]=0;
NOW[S_]=HEAD_[S_];
while (!q.empty()){
int u=q.front();
q.pop();
for (int i=HEAD_[u];i!=-1;i=E_[i].nxt){
int v=E_[i].to;
if(E_[i].w>0&&DIS[v]==inf){
q.push(v);
NOW[v]=HEAD_[v];
DIS[v]=DIS[u]+1;
if(v==T_)return 1;
}
}
}
return 0;
}
int DFS_(int u,int sum){
if(u==T_)return sum;
int k,res=0;
for (int i=NOW[u];(i!=-1)&∑i=E_[i].nxt){
NOW[u]=i;
int v=E_[i].to;
if(E_[i].w>0&&(DIS[v]==DIS[u]+1)){
k=DFS_(v,min(sum,E_[i].w));
if(k==0)DIS[v]=inf;
E_[i].w-=k;
E_[i^1].w+=k;
res+=k;
sum-=k;
}
}
return res;
}
int Dinic(){
int res=0;
while (BFS_()){
res+=DFS_(S_,inf);
}
return res;
//最坏时间复杂度:O(V^2·E)
//单位容量(w=1)网络时间复杂度:O(E·min((E^(1/2),V^(2/3))
}
//注意要调用INIT函数
//注意数据范围能不能memset(BFS_)
string a[500];
signed main (){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m,c,d;
cin >>n>>m>>c>>d;
S_=4060,T_=4061;
INIT (5000);
for (int i=1;i<=n;i++){
cin >>a[i];
a[i]=' '+a[i];
}
for (int i=1;i<=n;i++)ADD(S_,i,1);
for (int i=1;i<=m;i++)ADD(i+n,T_,1);
int sumdot=0;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (a[i][j]=='.'){
ADD(i,n+j,1);
sumdot++;
}
}
}
int ans=infll;
int sum=0;
for (int i=1;i<=300;i++){
sum+=Dinic();
for (int j=0;j<(m+n)*2;j+=2){
E_[j].w++;
}
ans=min(ans,c*i+d*(sumdot-sum));
}
cout <<ans<<endl;
}
详细
Test #1:
score: 100
Accepted
time: 44ms
memory: 13608kb
input:
3 4 2 1 .*** *..* **..
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 39ms
memory: 13432kb
input:
3 4 1 2 .*** *..* **..
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: 0
Accepted
time: 184ms
memory: 15592kb
input:
250 250 965680874 9042302 ..**.*****..**..**.*****..***..***.**......*.***.*...***.*....*.**.*.**.*.*.****...*.******.***.************....**.*..*..***.*******.*.***.*..**..****.**.*.*..***.****..**.....***.....*.****...*...*.***..****..**.*.*******..*.*******.*.*.*.****.*.*** ....**.*******.*.******...
output:
109972100048
result:
ok 1 number(s): "109972100048"
Test #4:
score: 0
Accepted
time: 240ms
memory: 13320kb
input:
250 250 62722280 506434 *.**.***.*.*....*....*...**.*..**..****.*.*..*.*.*..*.....**..*.*.*.*****.*.**..*.**....***..*..*.*.*.**.*..*..*.**..*...**....**..*.*.***.*****.*****.***..**.***.****....*.*.**.**.*...****....*..*.**.**********.......********...***.**..*.....**.*..* .*..********..*...*..****...
output:
8437726048
result:
ok 1 number(s): "8437726048"
Test #5:
score: 0
Accepted
time: 528ms
memory: 14536kb
input:
250 250 85956327 344333 ..*.............*...*.....*...*..........*.........*...*.......*..***......*.*........*.*........*........*..*..*.............*.*........*....*..*................***...................*..*.............*..*.....*..**..............*..*......*.....*..** .........*......*.*.........
output:
18268031127
result:
ok 1 number(s): "18268031127"
Test #6:
score: -100
Wrong Answer
time: 539ms
memory: 15348kb
input:
250 250 768323813 489146 ...*................*...........*.................*..***..*.......*..*......*.................*...*.........*.*.*.*...*.*.*.*.*.......*........*.............*...............*..*.............*.*...*.....................**.....**.....*.*........*...... ...................*.......
output:
26645125505
result:
wrong answer 1st numbers differ - expected: '25999088192', found: '26645125505'