Submission #637762

# Submission time Handle Problem Language Result Execution time Memory
637762 2022-09-03T07:13:55 Z ksu2009en T-Covering (eJOI19_covering) C++14
50 / 100
543 ms 16104 KB
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <cstring>
 
#include <unordered_map>
 
using namespace std;
typedef long long ll;
 
vector<pair<ll, ll>> state(ll x, ll y, ll ok){
    if(ok == 1)
        return {{x, y}, {x-1, y}, {x, y - 1}, {x, y + 1}};
    if(ok == 2)
        return {{x, y}, {x-1, y}, {x + 1, y}, {x, y + 1}};
    if(ok == 3)
        return {{x, y}, {x+1, y}, {x, y - 1}, {x, y + 1}};
    
    return {{x, y}, {x-1, y}, {x + 1, y}, {x, y - 1}};
}

ll n, m;
vector<vector<ll>>used;

ll check(ll x, ll y, vector<vector<ll>>&a, ll ok){
    auto d = state(x, y, ok);
    
    ll ans = 0;
    
    for(auto i: d){
        if(i.first <= 0 || i.second <= 0 || i.first > n || i.second > m)
            return -1e9;
        
        if(i.first != x || i.second != y){
            if(used[i.first][i.second] == 1)
                return -1e9;
        }
        ans += a[i.first][i.second];
    }
    
    return ans;
}
 
ll t[10007];
vector<pair<ll, ll>> d;
vector<vector<ll>>a;
 
ll res = -1e9;
 
void put(ll pos, ll val, ll& mx){
    t[pos] = val;
    
    if(pos == mx){
        set<pair<int, int>> st;
        
        bool ok = false;
        
        ll sum = 0;
        
        for(int i = 1; i <= pos; i++){
            if(st.count({d[i - 1].first, d[i - 1].second})){
                ok = true;
                break;
            }
            st.insert({d[i - 1].first, d[i - 1].second});
            if(t[i] == 1){
                if(st.count({d[i - 1].first - 1, d[i - 1].second}) || st.count({d[i - 1].first, d[i - 1].second - 1}) || st.count({d[i - 1].first, d[i - 1].second + 1})){
                    ok = true;
                    break;
                }
                st.insert({d[i - 1].first - 1, d[i - 1].second});
                st.insert({d[i - 1].first, d[i - 1].second - 1});
                st.insert({d[i - 1].first, d[i - 1].second + 1});
                
            }
            else if(t[i] == 2){
                if(st.count({d[i - 1].first - 1, d[i - 1].second}) || st.count({d[i - 1].first + 1, d[i - 1].second}) || st.count({d[i - 1].first, d[i - 1].second + 1})){
                    ok = true;
                    break;
                }
                st.insert({d[i - 1].first - 1, d[i - 1].second});
                st.insert({d[i - 1].first + 1, d[i - 1].second});
                st.insert({d[i - 1].first, d[i - 1].second + 1});
            }
            else if(t[i] == 3){
                if(st.count({d[i - 1].first, d[i - 1].second - 1}) || st.count({d[i - 1].first, d[i - 1].second + 1}) || st.count({d[i - 1].first + 1, d[i - 1].second})){
                    ok = true;
                    break;
                }
                st.insert({d[i - 1].first, d[i - 1].second - 1});
                st.insert({d[i - 1].first, d[i - 1].second + 1});
                st.insert({d[i - 1].first + 1, d[i - 1].second});
            }
            else{
                if(st.count({d[i - 1].first - 1, d[i - 1].second}) || st.count({d[i - 1].first + 1, d[i - 1].second}) || st.count({d[i - 1].first, d[i - 1].second - 1})){
                    ok = true;
                    break;
                }
                st.insert({d[i - 1].first - 1, d[i - 1].second});
                st.insert({d[i - 1].first + 1, d[i - 1].second});
                st.insert({d[i - 1].first, d[i - 1].second - 1});
            }
            
            if(check(d[i - 1].first, d[i - 1].second, a, t[i]) < 0){
                ok = true;
                break;
            }
            
            sum += check(d[i - 1].first, d[i - 1].second, a, t[i]);
        }
        
        if(!ok){
            res = max(res, sum);
        }
    }
    else
        for(int i = 1; i <= 4; i++)
            put(pos + 1, i, mx);
}
 
 
int main(){
    cin >> n >> m;
    
    a.resize(n + 1, vector<ll>(m + 1));
    
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> a[i][j];
    
    ll k;
    cin >> k;
    
    d.resize(k);
    
    for(int i = 0; i < k; i++){
        cin >> d[i].first >> d[i].second;
        d[i].first++;
        d[i].second++;
    }
    
    
    bool ok = false;
    
    for(int i = 0; i < k; i++)
        for(int j = i + 1; j < k; j++)
            if(abs(d[i].first - d[j].first) <= 2 && abs(d[i].second - d[j].second) <= 2)
                ok = true;
    
    used.resize(n + 1, vector<ll>(m + 1));
    for(auto i: d)
        used[i.first][i.second] = 1;
    
    bool isitpossible = false;
    
    for(auto i: d){
        
        if(check(i.first, i.second, a, 1) < 0 && check(i.first, i.second, a, 2) < 0 &&
           check(i.first, i.second, a, 3) < 0 && check(i.first, i.second, a, 4) < 0 )
            isitpossible = true;
    }
    
    if(isitpossible){
        cout << "No" << endl;
        return 0;
    }
    
    
    set<ll>row;
    
    for(auto i: d){
        row.insert(i.first);
    }
    
    if(row.size() == 1){
        sort(d.begin(), d.end());
    
    vector<vector<ll>>dp(k + 1, vector<ll>(5));
    
    for(int i =0 ; i < k; i++)
        for(int j = 1; j <= 4; j++)
            dp[i][j] = -1e9;
    
    for(int i = 1; i <= 4; i++){
        dp[0][i] = check(d[0].first, d[0].second, a, i);
    }
    
    for(int i = 1; i< k; i++){
        for(int j = 1; j <= 4; j++){
            for(int last = 1; last <= 4; last++){
                auto v1 = state(d[i].first, d[i].second, j);
                auto v2 = state(d[i - 1].first, d[i - 1].second, last);
                
                set<pair<ll, ll>> st;
                
                bool ok = false;
                
                for(auto l: v1){
                    if(st.count(l))
                        ok = true;
                    st.insert(l);
                }
                for(auto l: v2){
                    if(st.count(l))
                        ok = true;
                    st.insert(l);
                }
                
                if(ok) // overlaping
                    continue;
                
                dp[i][j] = max(dp[i][j], dp[i - 1][last] + check(d[i].first, d[i].second, a, j));
            }
        }
    }
    
    ll mx = -1;
    
    for(int j = 1; j <= 4; j++)
        mx = max(mx, dp[k - 1][j]);
    
    if(mx < 0)
        cout << "No" << endl;
    else
        cout << mx << endl;
        
        return 0;
    }
    else if(!ok){
        ll ans = 0;
        
        for(auto i: d){
            ll cnt = max({check(i.first, i.second, a, 1),
                         check(i.first, i.second, a, 2),
                         check(i.first, i.second, a, 3),
                        check(i.first, i.second, a, 4)});
            
            if(cnt == -1e9){
                cout << "No" << endl;
                return 0;
            }
            
            ans += cnt;
        }
        cout << ans << endl;
    }
    else if(k > 10){
        ll ans = 0;
        
        ok = false;
        
        for(int i = 0; i < k; i++)
            for(int j = i + 1; j < k; j++)
                if(abs(d[i].first - d[j].first) <= 2 && abs(d[i].second - d[j].second) <= 2){
                    
                    if(abs(d[i].first - d[j].first) == 0 && abs(d[i].second - d[j].second) == 1)
                       continue;
                    if(abs(d[i].first - d[j].first) == 1 && abs(d[i].second - d[j].second) == 0)
                          continue;
                    if(abs(d[i].first - d[j].first) == 1 && abs(d[i].second - d[j].second) == 1)
                          continue;
                    
                    ok = true;
                }
        
        if(ok){
            cout << "No" << endl;
            return 0;
        }
        
        
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(used[i][j]){
                    if(j + 1 <= m && used[i][j + 1]){
                        ll cnt = check(i, j, a, 4) + check(i, j + 1, a, 2);
                        if(cnt < 0){
                            cout << "No" << endl;
                            return 0;
                        }
                        
                        ans += cnt;
                    }
                    else if(i + 1 <= n && used[i + 1][j]){
                        ll cnt = check(i, j, a, 1) + check(i + 1, j, a, 3);
                        if(cnt < 0){
                            cout << "No" << endl;
                            return 0;
                        }
                        
                        ans += cnt;
                    }
                    else if((i - 1 <= 0 || !used[i - 1][j]) && (j - 1 <= 0 || !used[i][j - 1])
                        &&  (i - 1 <= 0 || j - 1 <= 0 || !used[i - 1][j - 1]) &&
                            (j + 1 > m || i - 1 <= 0 || !used[i - 1][j + 1])){
                        
                        if(i + 1 <= n && j + 1 <= m && used[i + 1][j + 1]){
                            ll cnt = check(i, j, a, 1) + check(i + 1, j + 1, a, 3);
                            if(cnt < 0){
                                cout << "No" << endl;
                                return 0;
                            }
                            
                            ans += cnt;
                            continue;
                        }
                        if(i + 1 <= n && j - 1 > 0 && used[i + 1][j - 1]){
                            ll cnt = check(i, j, a, 1) + check(i + 1, j - 1, a, 3);
                            if(cnt < 0){
                                cout << "No" << endl;
                                return 0;
                            }
                            
                            ans += cnt;
                            continue;
                        }
                        
                        ll cnt = max({check(i, j, a, 1),
                            check(i, j, a, 2),
                            check(i, j, a, 3),
                            check(i, j, a, 4)});
                        
                        if(cnt < 0){
                            cout << "No" << endl;
                            return 0;
                        }
                        
                        ans += cnt;
                    }
                }
            }
        }
        
        cout << ans << endl;
    }
    else{
        for(int i = 1; i <= 4; i++)
            put(1, i, k);
        
        if(res == -1e9)
            cout << "No" << endl;
        else
            cout << res << endl;
        
        return 0;
    }
    
    return 0;
}

Compilation message

covering.cpp: In function 'int main()':
covering.cpp:235:5: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
  235 |     else
      |     ^~~~
covering.cpp:238:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
  238 |         return 0;
      |         ^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 6 ms 724 KB Output is correct
3 Correct 19 ms 1864 KB Output is correct
4 Correct 57 ms 4976 KB Output is correct
5 Correct 187 ms 15980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 7 ms 724 KB Output is correct
3 Correct 19 ms 1864 KB Output is correct
4 Correct 74 ms 5064 KB Output is correct
5 Correct 203 ms 15976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 6 ms 724 KB Output is correct
3 Correct 19 ms 1876 KB Output is correct
4 Correct 57 ms 4968 KB Output is correct
5 Correct 196 ms 16104 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 10 ms 1236 KB Output is correct
4 Correct 10 ms 836 KB Output is correct
5 Correct 28 ms 2144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 515 ms 288 KB Output is correct
2 Correct 7 ms 212 KB Output is correct
3 Correct 543 ms 288 KB Output is correct
4 Correct 125 ms 284 KB Output is correct
5 Correct 506 ms 284 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 6 ms 724 KB Output is correct
3 Correct 19 ms 1864 KB Output is correct
4 Correct 57 ms 4976 KB Output is correct
5 Correct 187 ms 15980 KB Output is correct
6 Correct 2 ms 468 KB Output is correct
7 Correct 7 ms 724 KB Output is correct
8 Correct 19 ms 1864 KB Output is correct
9 Correct 74 ms 5064 KB Output is correct
10 Correct 203 ms 15976 KB Output is correct
11 Correct 2 ms 468 KB Output is correct
12 Correct 6 ms 724 KB Output is correct
13 Correct 19 ms 1876 KB Output is correct
14 Correct 57 ms 4968 KB Output is correct
15 Correct 196 ms 16104 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 10 ms 1236 KB Output is correct
19 Correct 10 ms 836 KB Output is correct
20 Correct 28 ms 2144 KB Output is correct
21 Incorrect 4 ms 468 KB Output isn't correct
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 6 ms 724 KB Output is correct
3 Correct 19 ms 1864 KB Output is correct
4 Correct 57 ms 4976 KB Output is correct
5 Correct 187 ms 15980 KB Output is correct
6 Correct 2 ms 468 KB Output is correct
7 Correct 7 ms 724 KB Output is correct
8 Correct 19 ms 1864 KB Output is correct
9 Correct 74 ms 5064 KB Output is correct
10 Correct 203 ms 15976 KB Output is correct
11 Correct 2 ms 468 KB Output is correct
12 Correct 6 ms 724 KB Output is correct
13 Correct 19 ms 1876 KB Output is correct
14 Correct 57 ms 4968 KB Output is correct
15 Correct 196 ms 16104 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 10 ms 1236 KB Output is correct
19 Correct 10 ms 836 KB Output is correct
20 Correct 28 ms 2144 KB Output is correct
21 Correct 515 ms 288 KB Output is correct
22 Correct 7 ms 212 KB Output is correct
23 Correct 543 ms 288 KB Output is correct
24 Correct 125 ms 284 KB Output is correct
25 Correct 506 ms 284 KB Output is correct
26 Incorrect 4 ms 468 KB Output isn't correct
27 Halted 0 ms 0 KB -