답안 #251489

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251489 2020-07-21T13:24:28 Z leaked Retro (COCI17_retro) C++14
40 / 100
162 ms 102904 KB
#include<bits/stdc++.h>
using namespace std;
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
//
//    #pragma GCC optimize("unroll-loops")
//    #pragma GCC optimize("Ofast")
//    #pragma GCC optimize("-O3")
//    #pragma GCC optimize("no-stack-protector")
//    #pragma GCC optimize("fast-math")
//#define LOCAL
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifndef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
	*this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
#define fi first
#define f first
#define se second
#define s second
#define vi_a vector<int>a;
#define p_b push_back
////////////////////////////////???????????????CHECK THIS OUT???????????????//////////////////////////////
#define ll long long
////////////////////////////////???????????????CHECK THIS OUT???????????????//////////////////////////////
#define ld long double
#define pll pair<ll,ll>
#define pii pair<int,int>
#define m_p make_pair
#define fast_io cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);
#define all(x) x.begin(),x.end()
#define getfiles    ifstream cin("input.txt");ofstream cout("output.txt");
#define pw(x) (1ll << x)
#define sz(x) (ll)x.size()
#define endl "\n"
#define rall(x) x.rbegin(),x.rend()
#define len(a) (ll)a.size()
#define rep(x,l,r) for(ll x=l;x<r;x++)

using namespace __gnu_pbds;
ld eps = (ld)1 / 1e6;
const ld pi=3.14159265359;
ll inf = 1e18,mod1=1e9+7;
ll sqr(ll a) { return a * a; }
ll qb(ll a) { return a * a * a; }
ll gcd(ll a, ll b) { return !a ? b : gcd(b % a, a); }
ll binpow(ll a, ll b, ll mod) { return b ? (b % 2 ? (a * (sqr(binpow(a, b / 2, mod)) % mod)) % mod : sqr(binpow(a, b / 2, mod)) % mod) : 1; }
ll binmult(ll a, ll b, ll mod) { return b ? (b % 2 ? (2 * binmult(a, b / 2, mod) + a) % mod : (2 * binmult(a, b / 2, mod)) % mod) : 0; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const ll R=1e4;
const ll tx[4]={0,0,-1,1};
const ll ty[4]={-1,1,0,0};
vector<pii>lol{{-1,1},{-1,0},{-1,-1}};
const char rev_to[4]={'E','W','N','S'};
const int N=3e2+100;
const int M=1e9+7;
//typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> st;
//int n,m,k;
//int a[N],b[N];
//int f[N],cnt[26],dp[N];
int dp[N][N][N];
char a[N][N];
bool can_be[N][N][N];
bool used[N][N],is[N][N];
int n,m;
vector<pair<char,pii>>loll[2*N];
void do_it(pii c,int level){
    if(a[c.f][c.s]!='.'){
        loll[level].p_b({a[c.f][c.s],{c.f,c.s}});
        is[c.f][c.s]=1;
    }else{
        for(auto &z : lol){
            int nx=z.f+c.f,ny=z.s+c.s;
            if(a[nx][ny]!='#' && used[nx][ny] && !is[nx][ny]){
                do_it({nx,ny},level);
            }
        }
    }
}
void go(int lvl){
    for(auto &z : loll[lvl]){
        for(auto &g : lol){
            int ni=z.s.f+g.f,nj=z.s.s+g.s;
            if(!is[ni][nj] && a[ni][nj]!='*' && used[ni][nj]){
                 do_it({ni,nj},lvl+1);
            }
        }
    }
    sort(all(loll[lvl+1]));
    int ps=0;
    for(auto &z : loll[lvl+1]){
        if(z.f==loll[lvl+1][0].f) ps++;
    }
    loll[lvl+1].resize(ps);
}
signed main()
{
    cin>>n>>m;
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            a[i][j]='*';
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    int st=-1;
    for(int i=1;i<=m;i++){
        if(a[n][i]=='M') st=i;
    }
    dp[n][st][0]=1;
    for(int i=n;i>1;i--){
        for(int j=1;j<=m;j++){
            for(int bal=0;bal<=(n-i);bal++){
                if(!dp[i][j][bal]) continue;
                for(auto &z : lol){
                    int ni=z.f+i,nj=z.s+j;
                    if(a[ni][nj]!='*'){
                        if(a[ni][nj]=='.'){
                            dp[ni][nj][bal]=max(dp[ni][nj][bal],dp[i][j][bal]);
                        }
                        else if(a[ni][nj]==')'){
                            if(bal>0){
                                dp[ni][nj][bal-1]=max(dp[ni][nj][bal-1],dp[i][j][bal]+1);
                            }
                        }else{
                             dp[ni][nj][bal+1]=max(dp[ni][nj][bal+1],dp[i][j][bal]+1);
                        }
                    }
                }
            }
        }
    }
    pii mx={n,st};
    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            if(!dp[i][j][0]) continue;
            bool ok=0;
            for(auto &z : lol){
                int ni=z.f+i,nj=z.s+j;
                if(a[ni][nj]=='*'){
                    ok=1;
                }
            }
            if(ok){
                if(dp[i][j][0]>dp[mx.f][mx.s][0]){
                    mx={i,j};
                }
            }
        }
    }
    int cur=1;
    priority_queue<pair<pii,pii>,vector<pair<pii,pii>>,greater<pair<pii,pii>>>q;
    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            if(!dp[i][j][0]) continue;
            bool ok=0;
            for(auto &z : lol){
                int ni=z.f+i,nj=z.s+j;
                if(a[ni][nj]=='*'){
                    ok=1;
                }
            }
            if(ok){
                if(dp[i][j][0]==dp[mx.f][mx.s][0]){
                   can_be[i][j][0]=1;
                   q.push({{dp[i][j][0],0},{i,j}});
                   used[i][j]=1;
                }
            }
        }
    }
    while(!q.empty()){
        auto c=q.top();
        auto bal=c.f.s,i=c.s.f,j=c.s.s,need=c.f.f;
        q.pop();
        int who=(a[i][j]==')' ? -1 :(a[i][j]=='(' ? 1 : 0));
        for(auto &z : lol){
            int nx=-z.f+i,ny=-z.s+j;
            if(a[nx][ny]!='*' && !used[nx][ny]){
                if(dp[nx][ny][bal-who]==dp[i][j][bal]-abs(who)){
                    q.push({{dp[nx][ny][bal-who],bal-who},{nx,ny}});
                    used[nx][ny]=1;
                }
            }
        }
    }
    cout<<dp[mx.f][mx.s][0]-1<<endl;
    loll[0].p_b({a[n][st],{n,st}});
    for(int i=0;i<=n;i++){
        if(sz(loll[i])){
            go(i);
        }
    }
    for(int i=1;i<=n;i++){
        if(sz(loll[i])){
            cout<<loll[i][0].f;
        }
//        cout<<loll[i][0].f;
    }
    return 0;
}
/*
    4 4
    1 2 a
    3 2 a
    1 4 a
    3 4 b




*/

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:200:40: warning: unused variable 'need' [-Wunused-variable]
         auto bal=c.f.s,i=c.s.f,j=c.s.s,need=c.f.f;
                                        ^~~~
retro.cpp:177:9: warning: unused variable 'cur' [-Wunused-variable]
     int cur=1;
         ^~~
# 결과 실행 시간 메모리 Grader output
1 Partially correct 1 ms 512 KB Partially correct
2 Partially correct 1 ms 512 KB Partially correct
3 Partially correct 1 ms 640 KB Partially correct
4 Partially correct 1 ms 768 KB Partially correct
5 Partially correct 1 ms 768 KB Partially correct
6 Partially correct 6 ms 5888 KB Partially correct
7 Partially correct 6 ms 5632 KB Partially correct
8 Partially correct 6 ms 5376 KB Partially correct
9 Partially correct 10 ms 9728 KB Partially correct
10 Partially correct 13 ms 12032 KB Partially correct
11 Partially correct 140 ms 91968 KB Partially correct
12 Partially correct 122 ms 84732 KB Partially correct
13 Partially correct 70 ms 51320 KB Partially correct
14 Partially correct 65 ms 49272 KB Partially correct
15 Partially correct 158 ms 99192 KB Partially correct
16 Partially correct 148 ms 90488 KB Partially correct
17 Partially correct 136 ms 91896 KB Partially correct
18 Partially correct 119 ms 84860 KB Partially correct
19 Partially correct 162 ms 102904 KB Partially correct
20 Partially correct 138 ms 94840 KB Partially correct