夢追い人

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

精進

やーーー

1258

Prim

#include <cstdio>
#include <algorithm>
#define INF 1000001
using namespace std;
typedef long long ll;
int cost[100][100];
int mincost[100];
bool used[100];
int V;
ll prim() {
    for (int i=0; i<V; i++) {
        mincost[i]=INF;
        used[i]=false;
    }
    mincost[0]=0;
    ll res=0;
    while (true) {
        int v = -1;
        for (int u=0; u<V; u++) {
            if (!used[u]&&(v==-1||mincost[u]<mincost[v])) v=u;
        }
        if (v==-1) break;
        used[v]=true;
        res+=mincost[v];
        for (int u=0; u<V; u++) {
            mincost[u]=min(mincost[u], cost[v][u]);
        }
    }
    return res;
}
int main() {
    while (scanf("%d",&V)!=EOF) {
        for (int i=0; i<V; i++) for (int j=0; j<V; j++) {
            scanf("%d",&cost[i][j]);
            if (i==j) cost[i][j]=INF;
        }
        printf("%lld\n",prim());
    }
}

3264

Segment-Tree RMQ

#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;
const int MAX_N = 1 << 17;
int n, dat[2*MAX_N-1], dat2[2*MAX_N-1];
void init(int n_) {
    n=1;
    while (n<n_) n*=2;
    for (int i=0; i<2*n-1; i++) {
        dat[i]=INT_MAX;
        dat2[i]=INT_MIN;
    }
}
void update(int k, int a) {
    k += n-1;
    dat[k]=a;
    dat2[k]=a;
    while (k>0) {
        k=(k-1)/2;
        dat[k]=min(dat[k*2+1],dat[k*2+2]);
        dat2[k]=max(dat2[k*2+1],dat2[k*2+2]);
    }
}
int query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return INT_MAX;
    if (a <= l && r <= b) return dat[k];
    else {
        int vl=query(a,b,k*2+1,l,(l+r)/2);
        int vr=query(a,b,k*2+2,(l+r)/2,r);
        return min(vl, vr);
    }
}
int query2(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return INT_MIN;
    if (a <= l && r <= b) return dat2[k];
    else {
        int vl=query2(a,b,k*2+1,l,(l+r)/2);
        int vr=query2(a,b,k*2+2,(l+r)/2,r);
        return max(vl, vr);
    }
}
int main() {
    int nx,q; scanf("%d%d",&n,&q);
    nx=n;
    init(n);
    for (int i=0; i<nx; i++) {
        int cow; scanf("%d",&cow);
        update(i,cow);
    }
    for (int i=0; i<q; i++) {
        int a, b; scanf("%d%d",&a,&b);
        int r1=query(a-1,b,0,0,n);
        int r2=query2(a-1,b,0,0,n);
        printf("%d\n",r2-r1);
    }
}

2823

deque
アルゴリズム自体は頭にあったけど実装力なくてずっと実装できなかったもの。
ちなみにG++だと通りません。C++で通ります。

#include <cstdio>
const int MAX_N = 1000000;
int n, k;
int a[MAX_N];

int min[MAX_N], max[MAX_N];
int deq1[MAX_N], deq2[MAX_N];
int main() {
    while (scanf("%d%d",&n,&k)!=EOF) {
        for (int i=0; i<n; i++) scanf("%d",&a[i]);
        int s=0, t=0;
        for (int i=0; i<n; i++) {
            while (s < t && a[deq1[t-1]] >= a[i]) t--;
            deq1[t++] = i;
            if (i - k + 1 >= 0) {
                min[i - k + 1] = a[deq1[s]];
                if (deq1[s] == i - k + 1) {
                    s++;
                }
            }
        }
        s=0; t=0;
        for (int i=0; i<n; i++) {
            while (s < t && a[deq2[t-1]] <= a[i]) t--;
            deq2[t++] = i;
            if (i - k + 1 >= 0) {
                max[i - k + 1] = a[deq2[s]];
                if (deq2[s] == i - k + 1) {
                    s++;
                }
            }
        }
        for (int i=0; i<=n-k; i++) printf("%d%c",min[i],i==n-k?'\n':' ');
        for (int i=0; i<=n-k; i++) printf("%d%c",max[i],i==n-k?'\n':' ');
    }
}

2190

やるだけですが、Xが末尾にしか使えないというのを最初知らずにWA

#include <iostream>
using namespace std;
int main() {
    string isbn; cin >> isbn;
    int pos, sum=0;
    for (int i=0; i<10; i++) {
        if (isbn[i]=='?') pos=10-i;
        else {
            if (isbn[i]=='X') {
                sum += 10*(10-i);
            } else {
                sum += (isbn[i]-'0')*(10-i);
            }
        }
    }
    int ans=-1;
    for (int i=0; i<11; i++) {
        if ((sum+i*pos)%11==0) {
            ans=i;
        }
    }
    if ((pos!=1&&ans==10)||ans==-1) {
        cout << -1 << endl;
    } else if (pos==1&&ans==10) {
       cout << "X" << endl;
    } else {
       cout << ans << endl;
    }
}

セグツリーいいですね。応用かけやすくて。
多分僕は数列の問題に対してしか使えませんが(^_^;)

広告を非表示にする