QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#578706#5114. Cells Coloring7islandsWA 84ms11996kbC++232.7kb2024-09-20 20:54:302024-09-20 20:54:30

Judging History

你现在查看的是最新测评结果

  • [2024-09-20 20:54:30]
  • 评测
  • 测评结果:WA
  • 用时:84ms
  • 内存:11996kb
  • [2024-09-20 20:54:30]
  • 提交

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)&&sum;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,0);
    for (int i=1;i<=m;i++)ADD(i+n,T_,0);
    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++){
       
       for (int j=0;j<(m+n+1)*2;j+=2){
            E_[j].w++;
        }
        sum+=Dinic();
        ans=min(ans,c*i+d*(sumdot-sum));
    }
    cout <<ans<<endl;
}

详细

Test #1:

score: 0
Wrong Answer
time: 84ms
memory: 11996kb

input:

3 4 2 1
.***
*..*
**..

output:

3

result:

wrong answer 1st numbers differ - expected: '4', found: '3'