夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

JOI予選のこり

結果も発表されたことだし実装しますた

問5

#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, k;
int d[50][6];
int cnt[105][105][105];
vector<int> xx, yy, dd;
map<int, int> idx, idy, idd, dix, diy, did;
int main() {
    scanf("%d%d",&n,&k);
    for (int i=0; i<n; i++) {
        scanf("%d%d%d%d%d%d",
                &d[i][0],&d[i][1],&d[i][2],&d[i][3],&d[i][4],&d[i][5]);
        xx.push_back(d[i][0]); xx.push_back(d[i][3]);
        yy.push_back(d[i][1]); yy.push_back(d[i][4]);
        dd.push_back(d[i][2]); dd.push_back(d[i][5]);
    }
    sort(xx.begin(), xx.end());
    sort(yy.begin(), yy.end());
    sort(dd.begin(), dd.end());
    int idn=0, idm=0, ido=0;
    dix[0]=xx[0]; diy[0]=yy[0]; did[0]=dd[0];
    for (int i=1; i<xx.size(); i++) {
        if (dix[idn]!=xx[i]) idn++;
        idx[xx[i]] = idn;
        dix[idn]=xx[i];
    }
    for (int i=1; i<yy.size(); i++) {
        if (diy[idm]!=yy[i]) idm++;
        idy[yy[i]] = idm;
        diy[idm]=yy[i];
    }
    for (int i=1; i<dd.size(); i++) {
        if (did[ido]!=dd[i]) ido++;
        idd[dd[i]] = ido;
        did[ido]=dd[i];
    }
    for (int i=0; i<n; i++) {
        for (int j=idx[d[i][0]]; j<idx[d[i][3]]; j++) {
            for (int l=idy[d[i][1]]; l<idy[d[i][4]]; l++) {
                for (int m=idd[d[i][2]]; m<idd[d[i][5]]; m++) cnt[j][l][m]++;
            }
        }
    }
    ll res=0;
    for (int i=0; i<idn; i++) {
        for (int j=0; j<idm; j++) {
            for (int l=0; l<ido; l++) {
                if (cnt[i][j][l]>=k) res+=((ll)(dix[i+1]-dix[i])*(ll)(diy[j+1]-diy[j])*(ll)(did[l+1]-did[l]));
            }
        }
    }
    printf("%lld\n",res);
}
1801
347149566041429203
124015464949851877
991380998439054609
65264947770876113

問6

実装なぜだか苦戦したw
…ではなくバグ死なう。kagamizさんとsnukeさんのコード参考にしてほぼ違いないコードなのになぜかサンプルさえ通らない

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define MA (1<<12)-1
int h, w, k;
string mp[50];
int dp[1<<12][5][55][55];
// 0(00) up 1(01) left 2(10) down 3(11) right
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};

int dfs(int move, int waste, int x, int y) {
    if (dp[move][waste][x][y]!=-1) return dp[move][waste][x][y];
    int nmv = (move<<2)&MA;

    int valt=-999999;

    for (int i=0; i<4; i++) {
        if (waste>=k&&i<2) continue;
        int nx=x+dx[i], ny=y+dy[i];
        if (0>nx||h<=nx||0>ny||w<=ny||mp[nx][ny]=='#') continue;
        valt=max(valt, dfs(nmv|i, waste+(i<2), nx, ny));
    }

    bool same=false;
    int u=move,px=x,py=y;
    for (int i=0; i<6; i++) {
        px-=dx[u&3]; py-=dy[u&3];
        if (!(px>=0&&py>=0&&px<h&&py<w)) break;
        if (px==x&&py==y) same=true;
        u>>=2;
    }
    if (!same&&mp[x][y]!='.') valt+=mp[x][y]-'0';

    if (valt<0&&x==h-1&&y==w-1) valt=1;
    //printf("%d %d: %d\n",x,y,valt);
    return dp[move][waste][x][y]=valt;
}

int main() {
    scanf("%d%d%d",&h,&w,&k);
    for (int i=0; i<h; i++) cin>>mp[i];
    memset(dp, -1, sizeof(dp));
    int res=dfs(0,0,0,0)-1;
    printf("%d\n",res<0?0:res);
}