夢追い人

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

ともちんの美容室ステマ

タイトルはなにも関係ありません

AOJ 0562

俗に言うJOI王国のお買い物
難しく考えてたけど全ての点のお祭り距離を出して、ある二点間の距離+二点のお祭り距離を2で割るだけだった

#include <cstdio>
#include <climits>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <functional>
using namespace std;
typedef pair<int, int> P;
struct edge { int to, cost; };
vector<edge> G[3000];
int mind[3000];
int d[3000];
int n, m, k;
void dijkstra(int s) {
    fill(d, d+n, INT_MAX);
    d[s]=0;
    priority_queue<P, vector<P>, greater<P> > que;
    que.push(P(0,s));
    while (!que.empty()) {
        P p=que.top(); que.pop();
        int v=p.second;
        if (d[v]<p.first) continue;
        for (int i=0; i<G[v].size(); i++) {
            edge e=G[v][i];
            if (d[e.to]>d[v]+e.cost) {
                d[e.to]=d[v]+e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
    for (int i=0; i<n; i++) mind[i]=min(mind[i],d[i]);
}
int main() {
    scanf("%d%d%d",&n,&m,&k);
    fill(mind, mind+n, INT_MAX);
    for (int i=0; i<m; i++) {
        int a, b, l; scanf("%d%d%d",&a,&b,&l);
        G[a-1].push_back((edge){b-1,l});
        G[b-1].push_back((edge){a-1,l});
    }
    for (int i=0; i<k; i++) {
        int s; scanf("%d",&s);
        dijkstra(s-1);
    }
    int res=0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<G[i].size(); j++) {
            edge e=G[i][j];
            res=max(res,(mind[i]+mind[e.to]+e.cost+1)/2);
        }
    }
    printf("%d\n",res);
}

Banner

やったよ!通せたよ!!!
カンニングしたけどね(白目)

#include <cstdio>
typedef long long ll;
int ban[400][400];
int brow[400], grow[400], wrow[400];
int bcol[400], gcol[400], wcol[400];
int main() {
    int h, w; scanf("%d%d",&h,&w);
    for (int i=0; i<h; i++) for (int j=0; j<w; j++) 
        scanf("%d",&ban[i][j]);
    for (int i=0; i<h; i++) {
        for (int j=0; j<w; j++) {
            if (ban[i][j]==1) {
                grow[i]++;
                gcol[j]++;
            } else if (ban[i][j]==2) {
                wrow[i]++;
                wcol[j]++;
            } else {
                brow[i]++;
                bcol[j]++;
            }
        }
    }
    ll res=0;
    for (int i=0; i<h; i++) for (int j=0; j<w; j++) {
        if (ban[i][j]==0) {
            res+=grow[i]*wcol[j]+gcol[j]*wrow[i];
        } else if (ban[i][j]==1) {
            res+=brow[i]*wcol[j]+bcol[j]*wrow[i];
        } else {
            res+=brow[i]*gcol[j]+bcol[j]*grow[i];
        }
    }
    printf("%lld\n",res/2);
}

JOI Poster

なんか巷で再帰でゴリゴリとか言ってましたが
僕はループでごりごりしてました

#include <cstdio>
#include <iostream>
using namespace std;
int len;
int main() {
    int n, k; scanf("%d%d",&n,&k);
    len=1<<n;
    string res="";
    if (k<=len/2) {
        for (int i=0; i<len/2; i++) res+='J';
        for (int i=0; i<len/2; i++) res+='O';
    } else {
        int temp=0;
        int x=n-1;
        temp+=1<<x;
        if ((1<<n)==k) {
            x=0;
        } else {
            while (temp<k) temp+=1<<(--x);
            x++;
        }
        for (int i=0; i<(1<<n)-(1<<x); i++) res+='I';
        x--;
        if (x<0) res+='J';
        else {
            for (int i=0; i<1<<x; i++) res+='J';
            while (res.length()<(1<<n)) {
                res+='O';
            }
        }
    }
    cout<<res<<endl;
}