Submission #753414

#TimeUsernameProblemLanguageResultExecution timeMemory
753414MateiKing80T-Covering (eJOI19_covering)C++14
100 / 100
358 ms45172 KiB
#include <bits/stdc++.h>

using namespace std;

int m,n;

int fct(int x, int y)
{
    x--;
    y--;
    return m*x+y;
}

int v[1000005];
int f[1000005];
bool viz[1000005];
pair<int,int>red[1000005];
bool oc[1000005];
vector<int>graf[1000005];



struct sus
{
    int nrmuch=0, nrnod=0, minn=2100000000;
};


sus dfs(int nod)
{
    sus ans;
    if(viz[nod])
        return ans;
    viz[nod]=true;
    ans.nrnod=1;
    ans.nrmuch=graf[nod].size();
    int a=red[nod].first;
    int b=red[nod].second;
    if(a>1)
        ans.minn=min(ans.minn,v[fct(a-1,b)]),oc[fct(a-1,b)]=true;
    if(b>1)
        ans.minn=min(ans.minn,v[fct(a,b-1)]),oc[fct(a,b-1)]=true;
    if(b<m)
        ans.minn=min(ans.minn,v[fct(a,b+1)]),oc[fct(a,b+1)]=true;
    if(a<n)
        ans.minn=min(ans.minn,v[fct(a+1,b)]),oc[fct(a+1,b)]=true;
    for(int i=0;i<graf[nod].size();i++)
    {
        sus p=dfs(graf[nod][i]);
        ans.nrnod+=p.nrnod;
        ans.nrmuch+=p.nrmuch;
        ans.minn=min(ans.minn,p.minn);
    }
    return ans;
}





int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>v[fct(i,j)];
    int k;
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>red[i].first>>red[i].second;
        red[i].first++;
        red[i].second++;
        oc[fct(red[i].first,red[i].second)]=true;
        f[fct(red[i].first,red[i].second)]=i;
    }
    for(int i=1;i<=k;i++)
    {
        int a=red[i].first;
        int b=red[i].second;
        if(a==1)
            graf[i].push_back(i),graf[i].push_back(i);
        if(a==n)
            graf[i].push_back(i),graf[i].push_back(i);
        if(b==1)
            graf[i].push_back(i),graf[i].push_back(i);
        if(b==m)
            graf[i].push_back(i),graf[i].push_back(i);
        if(a>1 && b<m && f[fct(a-1,b+1)])
            graf[i].push_back(f[fct(a-1,b+1)]),graf[f[fct(a-1,b+1)]].push_back(i),graf[i].push_back(f[fct(a-1,b+1)]),graf[f[fct(a-1,b+1)]].push_back(i);
        if(b<m && f[fct(a,b+1)])
            graf[i].push_back(f[fct(a,b+1)]),graf[f[fct(a,b+1)]].push_back(i),graf[i].push_back(f[fct(a,b+1)]),graf[f[fct(a,b+1)]].push_back(i);
        if(b<m-1 && f[fct(a,b+2)])
            graf[i].push_back(f[fct(a,b+2)]),graf[f[fct(a,b+2)]].push_back(i);
        if(b<m && a<n && f[fct(a+1,b+1)])
            graf[i].push_back(f[fct(a+1,b+1)]),graf[f[fct(a+1,b+1)]].push_back(i),graf[i].push_back(f[fct(a+1,b+1)]),graf[f[fct(a+1,b+1)]].push_back(i);
        if(a<n && f[fct(a+1,b)])
            graf[i].push_back(f[fct(a+1,b)]),graf[f[fct(a+1,b)]].push_back(i),graf[i].push_back(f[fct(a+1,b)]),graf[f[fct(a+1,b)]].push_back(i);
        if(a<n-1 && f[fct(a+2,b)])
            graf[i].push_back(f[fct(a+2,b)]),graf[f[fct(a+2,b)]].push_back(i);

    }
    int ans=0;
    for(int i=1;i<=k;i++)
    {
        if(!viz[i])
        {
            sus x=dfs(i);
            x.nrmuch/=2;
            if(x.nrmuch<x.nrnod)
                ans+=x.minn;
            if(x.nrmuch>x.nrnod)
            {
                cout<<"No";
                return 0;
            }
        }
    }
    int ras=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(oc[fct(i,j)])
                ras+=v[fct(i,j)];
    cout<<ras-ans;
}

Compilation message (stderr)

covering.cpp: In function 'sus dfs(int)':
covering.cpp:47:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |     for(int i=0;i<graf[nod].size();i++)
      |                 ~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...