Submission #1174462


Source Code Expand

#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <string.h>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <map>
#include <set>
#include <iostream>
#include <sstream>
#include <numeric>
#include <cctype>
#include <bitset>
#include <cassert>
#include <random>
#define fi first
#define se second
#define rep(i,n) for(int i = 0; i < (n); ++i)
#define rrep(i,n) for(int i = 1; i <= (n); ++i)
#define drep(i,n) for(int i = (n)-1; i >= 0; --i)
#define gep(i,g,j) for(int i = g.head[j]; i != -1; i = g.e[i].next)
#define each(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define rng(a) a.begin(),a.end()
#define maxs(x,y) x = max(x,y)
#define mins(x,y) x = min(x,y)
#define pb push_back
#define sz(x) (int)(x).size()
#define pcnt __builtin_popcount
#define uni(x) x.erase(unique(rng(x)),x.end())
#define snuke srand((unsigned)clock()+(unsigned)time(NULL));
#define df(x) int x = in()
#define dame { puts("-1"); return 0;}
#define show(x) cout<<#x<<" = "<<x<<endl;
#define PQ(T) priority_queue<T,vector<T>,greater<T> >
#define bn(x) ((1<<x)-1)
#define newline puts("")
using namespace std;
typedef long long int ll;
typedef pair<int,int> P;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<ll> vl;
typedef vector<P> vp;
inline int in() { int x; scanf("%d",&x); return x;}
inline void priv(vi a) { rep(i,sz(a)) printf("%d%c",a[i],i==sz(a)-1?'\n':' ');}
template<typename T>istream& operator>>(istream&i,vector<T>&v)
{rep(j,sz(v))i>>v[j];return i;}
template<typename T>string join(const vector<T>&v)
{stringstream s;rep(i,sz(v))s<<' '<<v[i];return s.str().substr(1);}
template<typename T>ostream& operator<<(ostream&o,const vector<T>&v)
{if(sz(v))o<<join(v);return o;}
template<typename T1,typename T2>istream& operator>>(istream&i,const pair<T1,T2>&v)
{return i>>v.fi>>v.se;}
template<typename T1,typename T2>ostream& operator<<(ostream&o,const pair<T1,T2>&v)
{return o<<v.fi<<","<<v.se;}
const ll LINF = 1e18;
const double eps = 1e-10;
typedef vector<string> vs;
const int di[] = {-1,0,1,0,0}, dj[] = {0,-1,0,1,0}; //^<v>
const string dc = "ULDR-";
const int cost[] = {1,1,1,1};
// const int cost[] = {10,25,50,100};

const int MH = 30, INF = 1001001001;
const int MN = 450;
const int TURN = 200, AD = 1000, ED = 100;
const int MS = 10;

int h, w, n, T;
struct V {
  int i, j;
  V(int i = 0, int j = 0):i(i),j(j){}
  bool operator==(const V& a)const{ return i==a.i&&j==a.j;}
};
struct D {
  int d;
  V v;
  D(int d = 0, V v = V(0,0)):d(d),v(v){}
  bool operator<(const D& a)const{ return d>a.d;}
};
typedef vector<V> vv;
vv s, t;
V inV() {
  int i,j;
  scanf("%d%d",&i,&j);
  return V(i-1,j-1);
}
vvi o;
int& ov(V& v) { return o[v.i][v.j];}
void prii(vvi& data) {
  for (vi nd : data) {
    // for (int md : nd) printf("%d",md);
    // newline;
    cout<<nd<<endl;
  }
}

int vc[MH][MH][5];
void setxv() {
  auto setvc = [&](int nvc[5], int v, int u) {
    nvc[v] = cost[0];
    nvc[u] = cost[1];
    nvc[u^2] = cost[2];
    nvc[v^2] = cost[3];
  };
  rep(x,h/2) {
    int i = x, j = x;
    if (x&1) {
      while (j<w-1-x) {
        setvc(vc[i][j],3,0);
        ++j;
      }
      while (i<h-1-x) {
        setvc(vc[i][j],2,3);
        ++i;
      }
      while (j>x) {
        setvc(vc[i][j],1,2);
        --j;
      }
      while (i>x) {
        setvc(vc[i][j],0,1);
        --i;
      }
    } else {
      while (i<w-1-x) {
        setvc(vc[i][j],2,1);
        ++i;
      }
      while (j<h-1-x) {
        setvc(vc[i][j],3,2);
        ++j;
      }
      while (i>x) {
        setvc(vc[i][j],0,3);
        --i;
      }
      while (j>x) {
        setvc(vc[i][j],1,0);
        --j;
      }
    }
  }
}

vvi dist[MN];
vi pre;

int main() {
  scanf("%d%d%d%d",&h,&w,&n,&T);
  s = t = vv(n);
  rep(i,n) {
    s[i] = inV();
    t[i] = inV();
  }
  // o = vvi(h,vi(w));
  // rep(i,n) ov(s[i]) = (s[i]==t[i]?2:1);
  setxv();
  vs ans;
  pre = vi(n,-1);
  vi st(n);
  rep(k,n) {
    priority_queue<D> q;
    vvi& ds = dist[k];
    ds = vvi(h,vi(w,INF));
    ds[t[k].i][t[k].j] = 0;
    q.push(D(0,t[k]));
    while (sz(q)) {
      D d = q.top(); q.pop();
      int i = d.v.i, j = d.v.j;
      if (ds[i][j] != d.d) continue;
      rep(v,4) {
        int ni = i+di[v], nj = j+dj[v];
        if (ni<0||nj<0||ni>=h||nj>=w) continue;
        int nd = d.d+vc[ni][nj][v^2];
        if (ds[ni][nj] <= nd) continue;
        ds[ni][nj] = nd;
        q.push(D(nd,V(ni,nj)));
      }
    }
  }
  rep(ti,TURN+AD+ED) {
    o = vvi(h,vi(w));
    rep(i,n) ov(s[i]) = (st[i]==1?2:1);
    vector<P> ps;
    rep(k,n) {
      if (ti > TURN && st[k]) continue;
      priority_queue<D> q;
      vvi& ds = dist[k];
      if (ti > TURN) {
        ds = vvi(h,vi(w,INF));
        ds[t[k].i][t[k].j] = 0;
        q.push(D(0,t[k]));
        while (sz(q)) {
          D d = q.top(); q.pop();
          int i = d.v.i, j = d.v.j;
          if (ds[i][j] != d.d) continue;
          rep(v,4) {
            int ni = i+di[v], nj = j+dj[v];
            if (ni<0||nj<0||ni>=h||nj>=w) continue;
            if (o[ni][nj] == 2) continue;
            // if (ti > TURN && o[ni][nj] == 2) continue;
            int nd = d.d+vc[ni][nj][v^2];
            if (ds[ni][nj] <= nd) continue;
            ds[ni][nj] = nd;
            q.push(D(nd,V(ni,nj)));
          }
        }
      }
      ps.pb(P(-ds[s[k].i][s[k].j],k));
    }
    sort(rng(ps));
    bool upd = false;
    string now(n,'-');
    vi updx(n);
    for (P np : ps) {
      if (np.fi == -INF) continue;
      int k = np.se;
      if (s[k] == t[k]) {
        st[k] = 1;
        continue;
      }
      int best = INF, bv = 4;
      int& i = s[k].i;
      int& j = s[k].j;
      rep(v,4) {
        if (pre[k] == v) continue;
        int ni = i+di[v], nj = j+dj[v];
        if (ni<0||nj<0||ni>=h||nj>=w) continue;
        if (o[ni][nj]) continue;
        int nd = dist[k][ni][nj]+vc[i][j][v];
        if (nd <= best) {
          best = nd;
          bv = v;
        }
      }
      if (best == INF) continue;
      // if (best > -np.fi+100) continue;
      i += di[bv];
      j += dj[bv];
      now[k] = dc[bv];
      pre[k] = bv^2; updx[k] = 1;
      if (s[k] == t[k]) st[k] = 1;
      ov(s[k]) = -1;
      upd = true;
    }
    if (!upd) break;
    rep(i,n) if (!updx[i]) pre[i] = -1;
    if (ti > TURN) {
      rep(i,n) if (ti < TURN+AD && now[i] == '-' && st[i] && rand()%50==0) st[i] = -(MS-MS*ti/(TURN+AD));
      rep(i,n) if (st[i] < 0) {
        vi vls;
        rep(v,4) {
          int ni = s[i].i+di[v], nj = s[i].j+dj[v];
          if (ni<0||nj<0||ni>=h||nj>=w) continue;
          if (o[ni][nj]) continue;
          vls.pb(v);
        }
        if (sz(vls)) {
          int v = vls[rand()%sz(vls)];
          now[i] = dc[v];
          s[i].i += di[v];
          s[i].j += dj[v];
          ov(s[i]) = -1;
        }
        st[i]++;
      }
    }
    ans.pb(now);
    // cerr<<now<<endl;
  }
  cout<<sz(ans)<<endl;
  for (string ns : ans) cout<<ns<<endl;
  return 0;
}




















Submission Info

Submission Time
Task B - 日本橋大渋滞
User snuke
Language C++14 (GCC 5.4.1)
Score 184996
Code Size 7363 Byte
Status AC
Exec Time 2578 ms
Memory 4480 KB

Compile Error

./Main.cpp: In function ‘V inV()’:
./Main.cpp:91:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&i,&j);
                      ^
./Main.cpp: In function ‘int main()’:
./Main.cpp:156:32: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d",&h,&w,&n,&T);
                                ^

Judge Result

Set Name test_01 test_02 test_03 test_04 test_05 test_06 test_07 test_08 test_09 test_10 test_11 test_12 test_13 test_14 test_15 test_16 test_17 test_18 test_19 test_20 test_21 test_22 test_23 test_24 test_25 test_26 test_27 test_28 test_29 test_30
Score / Max Score 5876 / 50000 3851 / 50000 8909 / 50000 9087 / 50000 3951 / 50000 8909 / 50000 4021 / 50000 5901 / 50000 8271 / 50000 6990 / 50000 7701 / 50000 9452 / 50000 12280 / 50000 4783 / 50000 7435 / 50000 4102 / 50000 5744 / 50000 3810 / 50000 6884 / 50000 5901 / 50000 3646 / 50000 4057 / 50000 7573 / 50000 6400 / 50000 6990 / 50000 3661 / 50000 5341 / 50000 7212 / 50000 3523 / 50000 2735 / 50000
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
test_01 subtask_01_01.txt
test_02 subtask_01_02.txt
test_03 subtask_01_03.txt
test_04 subtask_01_04.txt
test_05 subtask_01_05.txt
test_06 subtask_01_06.txt
test_07 subtask_01_07.txt
test_08 subtask_01_08.txt
test_09 subtask_01_09.txt
test_10 subtask_01_10.txt
test_11 subtask_01_11.txt
test_12 subtask_01_12.txt
test_13 subtask_01_13.txt
test_14 subtask_01_14.txt
test_15 subtask_01_15.txt
test_16 subtask_01_16.txt
test_17 subtask_01_17.txt
test_18 subtask_01_18.txt
test_19 subtask_01_19.txt
test_20 subtask_01_20.txt
test_21 subtask_01_21.txt
test_22 subtask_01_22.txt
test_23 subtask_01_23.txt
test_24 subtask_01_24.txt
test_25 subtask_01_25.txt
test_26 subtask_01_26.txt
test_27 subtask_01_27.txt
test_28 subtask_01_28.txt
test_29 subtask_01_29.txt
test_30 subtask_01_30.txt
Case Name Status Exec Time Memory
subtask_01_01.txt AC 1659 ms 3584 KB
subtask_01_02.txt AC 1522 ms 3456 KB
subtask_01_03.txt AC 1372 ms 3456 KB
subtask_01_04.txt AC 1555 ms 3456 KB
subtask_01_05.txt AC 1575 ms 3456 KB
subtask_01_06.txt AC 1710 ms 3456 KB
subtask_01_07.txt AC 1924 ms 3456 KB
subtask_01_08.txt AC 1285 ms 3456 KB
subtask_01_09.txt AC 1826 ms 3584 KB
subtask_01_10.txt AC 1976 ms 3456 KB
subtask_01_11.txt AC 1724 ms 3456 KB
subtask_01_12.txt AC 1766 ms 3584 KB
subtask_01_13.txt AC 1646 ms 3456 KB
subtask_01_14.txt AC 1684 ms 3456 KB
subtask_01_15.txt AC 1916 ms 3456 KB
subtask_01_16.txt AC 1404 ms 3584 KB
subtask_01_17.txt AC 2578 ms 3456 KB
subtask_01_18.txt AC 2265 ms 3584 KB
subtask_01_19.txt AC 1645 ms 3456 KB
subtask_01_20.txt AC 2185 ms 3456 KB
subtask_01_21.txt AC 1886 ms 3456 KB
subtask_01_22.txt AC 1939 ms 3456 KB
subtask_01_23.txt AC 1679 ms 3456 KB
subtask_01_24.txt AC 1916 ms 3456 KB
subtask_01_25.txt AC 1650 ms 3456 KB
subtask_01_26.txt AC 1558 ms 3456 KB
subtask_01_27.txt AC 1639 ms 3456 KB
subtask_01_28.txt AC 2345 ms 4480 KB
subtask_01_29.txt AC 1837 ms 3456 KB
subtask_01_30.txt AC 1805 ms 3456 KB