poj 2182 Lost Cows 暴力或者用线段树 + poj2828Buy Tickets

来源:互联网 发布:seo从入门到精通 编辑:程序博客网 时间:2024/06/05 15:59

这两题差不多一个意思, 2828加了一个ID;

poj 2182

题意简述:

 有N头牛,编号为1~N,乱序排成一列,现在已知每头牛前面有多少头牛比它的编号小,求排队后从前往后数,每头牛的编号。

暴力思路:从后往前求,定义一个a[I]数组表示前面有i头牛比它编号小,此时的位置,每求出一头牛的具体位置,就要更新a数组;

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define MAXN 8008using namespace std;int a[MAXN], pre[MAXN], res[MAXN];int main() {    int n;    scanf("%d", &n);    int m = n-1;    for(int i = 0; i < m; i++) {        a[i] = i+1;        scanf("%d", &pre[i]);    }    a[m] = n;    for(int i = n-2; i >= 0; i--) {        res[i+1] = a[pre[i]];        for(int j = pre[i]; j < m; j++)            a[j] = a[j+1];        m--;    }    res[0] = a[0];    for(int i = 0; i < n; i++)        printf("%d\n", res[i]);    return 0;}

线段树做法:

线段树里面的v表示这个区间内未被删除的数字个数;

具体看代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define MAXN 8008using namespace std;struct Node{    int l, r, v;} tree[3*MAXN];//是不是有人疑问这里,你举个例子就好了;int res[MAXN], a[MAXN];void build(int k, int l, int r) {    tree[k].l = l;    tree[k].r = r;    tree[k].v = r-l+1;    if (l == r) return;    int mid = (l+r)/2;    build(k*2, l, mid);    build(k*2+1, mid+1, r);    return ;}int query(int j, int k) {    tree[j].v--; // 节点长度减一    if (tree[j].l == tree[j].r) return tree[j].l;    if (tree[j*2].v >= k) //如果左子树的长度大于k就搞左子树        return query(j*2, k);    else        return query(j*2+1, k-tree[2*j].v); //搞右子树的话就要减去左子树的长度;}int main() {    int n;    scanf("%d", &n);    for(int i = 2; i <= n; i++)        scanf("%d", a+i);    a[1] = 0;    build(1, 1, n);    for(int i = n; i > 0; i--)        res[i] = query(1, a[i]+1);    for(int i = 1; i <= n; i++)        printf("%d\n", res[i]);    return 0;}

poj 2828,不多bb,一样的;
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define MAXN 200008using namespace std;struct Node{    int l, r, v;} tree[3*MAXN];int a[MAXN], val[MAXN], res[MAXN];void build(int k, int l, int r) {    tree[k].l = l;    tree[k].r = r;    tree[k].v = r-l+1;    if (l == r) return ;    int mid = (l+r)/2;    build(k*2, l, mid);    build(k*2+1, mid+1, r);    return ;}int query(int j, int k) {    tree[j].v--;    if (tree[j].l == tree[j].r) return tree[j].l;    if (tree[j*2].v >= k)        return query(j*2, k);    else        return query(j*2+1, k-tree[2*j].v);}int main() {    int n;    while (~scanf("%d", &n)) {        for(int i = 1; i <= n; i++)            scanf("%d%d", a+i, val+i);        build(1, 1, n);        for(int i = n; i > 0; i--) {           int tmp = query(1, a[i]+1);           res[tmp] = val[i]; //就这里不同,要想一下下        }        for(int i = 1; i <= n; i++)            printf("%d ", res[i]);        puts(" ");    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 顺产后下面会痛怎么办 产后肚子瘦不下来怎么办 出月子后臀部很疼怎么办 做月子时臀部疼怎么办 月子臀部大腿疼困怎么办 产后抱孩子腰疼怎么办 剖腹产后5年小肚子很大怎么办 压力大工作忙瘦了怎么办? 哺乳乳房一大一小怎么办 哺乳期乳房一大一小怎么办 上班之后奶少了怎么办 出了月子还流恶露怎么办? 剖腹产2年刀疤痒怎么办 刨宫产6天伤口痒怎么办 脸的皮肤油油的怎么办 狗狗子宫蓄脓怎么办 刮宫后子宫壁薄怎么办 产妇有痔疮怎么办很疼 二胎着床在剖腹产切口怎么办 刨腹产3月后怀孕怎么办 破腹产两年了肚子还是很大怎么办 抛妇产后肚子大怎么办 破腹产后想大便怎么办 破腹产后肚子硬怎么办 在月子里同房了怎么办 胃变大凸出来了怎么办 坐完月子脊背疼怎么办 月子过后脊背疼该怎么办 怀孕的时候牙疼怎么办 练瑜伽后弯腰疼怎么办 练完瑜伽腰椎疼怎么办 瑜伽开髋动作受伤怎么办 才学瑜伽教培上课紧张怎么办 瑜伽馆不给退费怎么办 脚运动后酸痛该怎么办 婴儿误吞拉链头怎么办 肠功能蠕动慢便秘怎么办 胃肠型和蠕动波怎么办 胃不蠕动了怎么办偏方 喂母乳母亲奶头裂开怎么办 给宝宝吃奶被吃到奶头裂开怎么办