夢追い人

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

JOI練習だよ。多分

今日予選の賞状もらた

0527

ネットでは個数をまとめて持っておく的なことが書いてあったけど、自分は区間っぽくやりました。。。
ちょっと無駄だったかも?w
最初は偶数個目で色を変えるときに、その前の集合とまとめわすれてWA。

#include <cstdio>
#include <map>
#include <stack>
#define f first
#define s second
using namespace std;
typedef pair<int, int> p;
typedef pair<int, p> pp;
// 0=white, 1=black
int main() {
    int n;
    while (scanf("%d",&n)) {
        if (!n) break;
        stack<pp> list;
        int in; scanf("%d", &in);
        list.push(make_pair(in, make_pair(0, 1)));
        for (int i=1; i<n; i++) {
            scanf("%d",&in);
            if (i%2!=0) {
                pp bef=list.top(); list.pop();
                // printf("%d %d %d\n", bef.f, bef.s.f, bef.s.s);
                if (bef.f==in) {
                    bef.s.s++;
                    list.push(bef);
                } else {
                    if (list.empty()) {
                        bef.f=in;
                        bef.s.s++;
                        list.push(bef);
                    } else {
                        pp bef2=list.top(); list.pop();
                        bef2.s.s=bef.s.s+1;
                        list.push(bef2);
                    }
                }
            } else {
                pp bef=list.top();
                // printf("%d %d %d\n", bef.f, bef.s.f, bef.s.s);
                if (bef.f==in) {
                    list.pop();
                    bef.s.s++;
                    list.push(bef);
                } else {
                    list.push(make_pair(in, make_pair(i, i+1)));
                }
            }
        }
        int res=0;
        while (!list.empty()) {
            pp x=list.top(); list.pop();
            // printf("%d %d %d\n",x.f,x.s.f,x.s.s);
            if (!x.f) res+=x.s.s-x.s.f;
        }
        printf("%d\n",res);
    }
}

0549

Webチラ見するまで二点間の距離をはかる基本的なアイデアを思いつけなかった・・・
これも経験なのだろうか(汗)

#include <cstdio>
#include <algorithm>
#define MOD 100000
using namespace std;
int main() {
    int n, m;
    scanf("%d%d",&n,&m);
    int yado[n];
    yado[0]=0;
    scanf("%d",&yado[1]);
    for (int i=2; i<n; i++) {
        scanf("%d",&yado[i]);
        yado[i]+=yado[i-1];
    }
    int npos=0, in, res=0;
    for (int i=0; i<m; i++) {
        scanf("%d",&in);
        int s=npos, e=npos+in;
        npos=e;
        if (s>e) swap(s, e);
        // printf("%d %d\n",s,e);
        res += yado[e]-yado[s];
        res %= MOD;
    }
    printf("%d\n",res);
}

本選1番 in AOJコンプ