码迷,mamicode.com
首页 > 其他好文 > 详细

BestCoder Round #36

时间:2015-04-05 20:30:51      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

A:签到题,注意情况都考虑全了判断即可

B:hash树高,统计即可,要加读入挂(略坑)

C:离线操作,把询问和树高都从大到小排序,然后砍树变成加树,每次把超过当前询问的树都加进去,每次加树就和左右边判断下,记录下块变换的情况,然后把答案存到相应询问中

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char str[105];

bool judge() {
    int n = strlen(str);
    if (n % 3) return false;
    int a = n / 3;
    for (int i = 0; i < 3; i++) {
        for (int j = i * a + 1; j < (i + 1) * a; j++) {
            if (str[j] != str[j - 1]) return false;
        }
    }
    if (str[a] == str[0] || str[2 * a] == str[a] || str[0] == str[2 * a]) return false;
    return true;
}

int main() {
    while (gets(str) != NULL) {
        int n = strlen(str);
        if (judge()) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

inline void scanf_(int &num)//ÎÞ¸ºÊý
{
    char in;
    while((in=getchar()) > '9' || in<'0') ;
    num=in-'0';
    while(in=getchar(),in>='0'&&in<='9')
        num*=10,num+=in-'0';
}

const int N = 1000005;

int n, m, h[N], has[N], hn, cnt[N];

int get(int x) {
    int v = lower_bound(has, has + hn, x) - has;
    if (has[v] == x) return v;
    return -1;
}

int main() {
    while (~scanf("%d%d", &n, &m)) {
        for (int i = 0; i < n; i++) {
            scanf_(h[i]);
            cnt[i] = 0;
            has[i] = h[i];
        }
        hn = n;
        sort(has, has + hn);
        hn = unique(has, has + hn) - has;
        for (int i = 0; i < n; i++)
            cnt[get(h[i])]++;
        int q;
        while (m--) {
            scanf_(q);
            int ca = get(q);
            if (ca == -1) printf("0\n");
            else {
                printf("%d\n", cnt[ca]);
                cnt[ca] = 0;
            }
        }
    }
    return 0;
}

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 50005;

struct Query {
    int v, id;
    void read(int id) {
        scanf("%d", &v);
        this->id = id;
    }
} query[N];

struct Tree {
    int h, id;
    void read(int id) {
        scanf("%d", &h);
        this->id = id;
    }
} tree[N];

bool cmpq(Query a, Query b) {
    return a.v > b.v;
}

bool cmpt(Tree a, Tree b) {
    return a.h > b.h;
}

int parent[N];

int find(int x) {
    if (x == parent[x]) return x;
    return parent[x] = find(parent[x]);
}

int n, q, vis[N], tot;
int ans[N];

void uni(int u, int v) {
    int pu = find(u);
    int pv = find(v);
    if (pu != pv) {
        parent[pu] = pv;
        tot--;
    }
}

int main() {
    while (~scanf("%d%d", &n, &q)) {
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < n; i++) parent[i] = i;
        for (int i = 0; i < n; i++) tree[i].read(i);
        for (int i = 0; i < q; i++) query[i].read(i);
        int sum = n;
        sort(query, query + q, cmpq);
        sort(tree, tree + n, cmpt);
        int u = 0;
        tot = 0;
        for (int i = 0; i < q; i++) {
            while (u < n && tree[u].h > query[i].v) {
                vis[tree[u].id] = 1;
                tot++;
                if (tree[u].id != 0 && vis[tree[u].id - 1]) {
                    uni(tree[u].id, tree[u].id - 1);
                }
                if (tree[u].id != n - 1 && vis[tree[u].id + 1]) {
                    uni(tree[u].id, tree[u].id + 1);
                }
                u++;
            }
            ans[query[i].id] = tot;
        }
        for (int i = 0; i < q; i++)
            printf("%d\n", ans[i]);
    }
    return 0;
}


BestCoder Round #36

标签:

原文地址:http://blog.csdn.net/accelerator_/article/details/44890495

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!