题解

51 条题解

  • 1
    @ 2018-02-21 21:23:19

    来一发splay
    因为结点不能重复所以我们用to[]来记录每种菜对应的树上的结点编号
    vis[]来记录这种菜有没有被卖完
    tree[].cnt来记录价格为tree[].v的且没买完的菜有多少

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=100000+10;
    struct splay_node
    {
        int son[2],fa,size,cnt,v;
    }tree[maxn];
    int to[maxn],kind,vis[maxn];
    int root,price,tot;
    void update(int now)
    {
        if(!now)return ;
        int lc=tree[now].son[0],rc=tree[now].son[1];
        tree[now].size=tree[lc].size+tree[rc].size+1;
    }
    void rotate(int now)
    {
        int f=tree[now].fa,g=tree[f].fa;
        int flag=tree[f].son[1]==now;
        tree[now].fa=g;
        tree[g].son[tree[g].son[1]==f]=now;
        tree[f].son[flag]=tree[now].son[flag^1];
        tree[tree[now].son[flag^1]].fa=f;
        tree[f].fa=now;
        tree[now].son[flag^1]=f;
        update(f);update(now);
    }
    void splay(int now,int goal)
    {
        while(tree[now].fa!=goal)
        {
            int f=tree[now].fa,g=tree[f].fa;
            if(g!=goal)
            (tree[f].son[0]==now)^(tree[g].son[0]==f)?rotate(now):rotate(f);
            rotate(now);
        }
        if(!goal)root=now;
    }
    void insert(int value)
    {
        int now=root,f=0;
        while(now&&tree[now].v!=value)
        {
            f=now;
            now=tree[now].son[tree[now].v<value];
        }
        if(now)
        {
            tree[now].size++;
            tree[now].cnt++;
            to[++kind]=now;
            update(f);
        }
        else 
        {
            now=++tot;
            to[++kind]=now;
            tree[now].cnt=1;
            tree[now].size=1;
            tree[now].v=value;
            tree[now].fa=f;
            tree[f].son[tree[f].v<value]=now;
            update(f);
        }
        splay(now,0);
    }
    int find(int now,int k)
    {
        int lc=tree[now].son[0],rc=tree[now].son[1];
        if(tree[now].size-tree[rc].size==k)return now;
        else if(tree[lc].size>=k)return find(lc,k);
        else if(tree[now].size-tree[rc].size>k&&k>tree[lc].size)return now;
        else return find(rc,k-tree[lc].size-1);
    }
    inline void work(int x)
    {
        int pos=find(root,tot-x+1);
        if(tree[pos].v>price)printf("Dui bu qi,Mei you.\n");
        else if(tree[pos].v<=price&&tree[pos].cnt)printf("You. %d Yuan.\n",tree[pos].v);
        else if(tree[pos].v<=price&&tree[pos].cnt==0)printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
        splay(pos,0);
    }
    int op,x;
    int main()
    {
        scanf("%d",&price);
        while(~scanf("%d",&op)&&op)
        {
            scanf("%d",&x);
            switch(op)
            {
                case 1:insert(x);break;
                case 2:if(!vis[x])
                {
                    tree[to[x]].cnt--;
                    vis[x]=1;
                }break;
                case 3:work(x);break;
            }
        }
        return 0;
    }
    
  • 1
    @ 2015-04-27 17:14:57

    平板电视大法好。
    因为不能插入重复节点,所以用1个long long存编号和价格,并且用hash存每个价格对应的没有卖完的个数。
    用法见saffah神牛的WC课件
    要加读入优化,否则会T掉。

    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    #include <cstdio>
    #include <cstring>
    #ifdef LOCAL
    #define null_type null_mapped_type
    #endif
    using namespace std;
    using namespace __gnu_pbds;
    const int MAXBUFLEN=1700000;
    int h[1000001];
    int pr[100001];
    char buf[MAXBUFLEN];
    int bufpos;
    int read()
    {
        char c;
        int val = 0;
        for (; ((c = buf[bufpos]) < '0' || c > '9'); ++bufpos);
        for (; (c = buf[bufpos]) >= '0' && c <= '9'; ++bufpos)
            val = val * 10 + c - '0';
        return val;
    }
    int main(){
        buf[fread(buf, 1, MAXBUFLEN, stdin)] = '\0';
        bufpos=0;
        tree<long long,null_type,greater<long long>,rb_tree_tag,tree_order_statistics_node_update> bst;
        int p,n,price,now=0;
        price=read();
        memset(h,0,sizeof(h)); 
        while(p=read()){
            int t;
            if (p==0) break;
            n=read();
            switch (p){
                case 1:now++;h[n]++;pr[now]=n;bst.insert(n*1000000LL+now);break;
                case 2:h[pr[n]]--;break;
                case 3:{
                    t=*(bst.find_by_order(n-1))/1000000;
                    if (t>price) puts("Dui bu qi,Mei you.");
                    if ((t<=price) && (h[t]>0)) printf("You. %d Yuan.\n",t);
                    if ((t<=price) && (h[t]<=0)) puts("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!");
                    break;
                }
            }
        } 
    }
    
  • 0
    @ 2017-01-27 11:38:38

    题意不清!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!看了别人的代码,为啥价格高于price的相同价格算作不同的第i贵,而小于等于price的相同价格就算做同样的第i贵!!!!!
    #include <bits/stdc++.h>
    #include <ext/pb_ds/tree_policy.hpp>
    #include <ext/pb_ds/assoc_container.hpp>
    using namespace std;

    inline int read() {
    int x = 0, f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -f; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 - '0' + ch, ch = getchar(); }
    return x * f;
    }

    typedef pair<int, int> PII;
    const int INF = INT_MAX;

    struct Node {
    Node *ch[2];
    int v, w, sz, r;

    Node(int v): v(v) {
    ch[0] = ch[1] = NULL;
    w = sz = v == INF ? 0 : 1;
    r = rand();
    }

    int cmp(int x) const {
    if (x == v) return -1;
    return x < v ? 0 : 1;
    }

    void push_up() {
    sz = ch[0]->sz + ch[1]->sz + w;
    }
    };

    Node *null = new Node(INF);
    Node *root = null;

    inline void rotate(Node* &rt, int d) {
    Node *k = rt->ch[d ^ 1];
    rt->ch[d ^ 1] = k->ch[d];
    k->ch[d] = rt;
    rt->push_up(); k->push_up();
    rt = k;
    }

    int tot = 0;

    void Insert(int v, Node* &rt) {
    if (rt == null) {
    tot++;
    rt = new Node(v);
    rt->ch[0] = rt->ch[1] = null;
    } else {
    int d = rt->cmp(v);
    if (d == -1) rt->w++;
    else {
    Insert(v, rt->ch[d]);
    if (rt->ch[d]->r > rt->r) rotate(rt, d ^ 1);
    }
    }
    rt->push_up();
    }

    PII kth(int k, Node *rt) {
    if (rt == null || k <= 0 || k > rt->sz) return make_pair(0, 0);
    int s = rt->ch[0]->sz;
    if (k > s && k <= s + rt->w) return make_pair(rt->w, rt->v);
    else if (k <= s) return kth(k, rt->ch[0]);
    else return kth(k - s - rt->w, rt->ch[1]);
    }

    int price, p, n, sold[1000010], menu[1000010];

    int main() {
    price = read();
    int num = 0, cnt = 0;
    while (p = read()) {
    n = read();
    if (p == 1) {
    if (n > price) cnt++;
    else Insert(n, root);
    menu[++num] = n;
    } else if (p == 2) sold[menu[n]]++;
    else {
    if (n <= cnt) printf("Dui bu qi,Mei you.\n");
    else {
    PII x = kth(tot - n + cnt + 1, root);
    if (x.first - sold[x.second] >= 1) printf("You. %d Yuan.\n", x.second);
    else printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
    }
    }
    }
    return 0;
    }

  • 0
    @ 2016-06-25 20:08:14

    我靠!被第一个点坑惨
    数据如下:
    99
    1 100
    3 1
    1 99
    1 99
    1 99
    2 4
    2 2
    3 2
    0
    (mdzz)
    输出应为
    Dui bu qi,Mei you.
    You. 99 Yuan.
    (第二行不是Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!)

  • 0
    @ 2016-06-12 10:10:39

    弱弱的Splay跑得相当慢……400+ms才跑完……
    然而第一个点莫名其妙……Vijos的输出格式果然名不虚传……
    ```pascal
    program Vijos_1647;
    const
    MaxM=1000000;
    Inf=2000000;
    var
    cnt,price,c,n,root,x:longint;
    data:array[1..MaxM] of longint;
    emp:array[1..MaxM] of boolean;
    l,r,p,size:array[1..MaxM] of longint; // Data To Save The Splay Tree

    procedure maintain(x:longint);
    begin
    size[x]:=1;
    if l[x]<>0 then size[x]:=size[x]+size[l[x]];
    if r[x]<>0 then size[x]:=size[x]+size[r[x]];
    end;

    procedure rotate(x,dir:longint);
    var y:longint;
    begin
    y:=p[x];
    if dir=0 then begin
    l[y]:=r[x];
    if r[x]<>0 then p[r[x]]:=y;
    end else begin
    r[y]:=l[x];
    if l[x]<>0 then p[l[x]]:=y;
    end;
    p[x]:=p[y];
    if p[y]<>0 then begin
    if y=l[p[y]] then l[p[y]]:=x else r[p[y]]:=x;
    end;
    p[y]:=x;
    if dir=0 then r[x]:=y else l[x]:=y;
    maintain(y);
    maintain(x);
    end;

    procedure Splay(var x,S:longint);
    var y,z:longint;
    begin
    z:=p[S];
    while p[x]<>z do begin
    y:=p[x];
    if y=S then begin
    if x=l[y] then rotate(x,0) else rotate(x,1);
    break;
    end;
    if x=l[y] then begin
    if y=l[p[y]] then begin
    rotate(y,0);rotate(x,0);
    end else begin
    rotate(x,0);rotate(x,1);
    end;
    end else begin
    if y=r[p[y]] then begin
    rotate(y,1);rotate(x,1);
    end else begin
    rotate(x,1);rotate(x,0);
    end;
    end;
    end;
    S:=x;
    end;

    procedure insert(n:longint;var S:longint);
    var x:longint;
    begin
    x:=S;
    while true do begin
    if n>=data[x] then begin
    if l[x]<>0 then x:=l[x] else break;
    end else begin
    if r[x]<>0 then x:=r[x] else break;
    end;
    end;
    inc(cnt);
    l[cnt]:=0;
    r[cnt]:=0;
    p[cnt]:=x;
    data[cnt]:=n;
    size[cnt]:=1;
    emp[cnt]:=false;
    if n>=data[x] then l[x]:=cnt else r[x]:=cnt;
    Splay(cnt,S);
    end;

    function Query(n:longint;var S:longint):longint;
    var x:longint;
    begin
    x:=S;
    while true do begin
    if (l[x]<>0) and (n=size[l[x]]+1) or (l[x]=0) and (n=1) then break;
    if (l[x]<>0) and (n<size[l[x]]+1) then x:=l[x]
    else if (l[x]=0) or (n>size[l[x]]+1) then begin
    if l[x]<>0 then n:=n-size[l[x]]-1 else n:=n-1;
    x:=r[x];
    end;
    end;
    Splay(x,S);
    Query:=x;
    end;

    begin
    root:=1;
    cnt:=1;
    data[root]:=Inf;
    size[root]:=1;
    l[root]:=0;
    r[root]:=0;
    p[root]:=0;
    emp[root]:=false;

    readln(price);
    read(c);
    if c<>0 then readln(n);
    while c<>0 do begin
    case c of
    1:insert(n,root);
    2:emp[n+1]:=true;
    3:begin
    x:=Query(n+1,root);
    if data[x]>price then
    writeln('Dui bu qi,Mei you.')
    else
    if not emp[x] then
    writeln('You. ',data[x],' Yuan.')
    else
    writeln('Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!');
    end;
    end;
    read(c);
    if c<>0 then readln(n);
    end;
    readln;
    end.

    • @ 2016-06-25 19:24:56

      求解第一个点什么鬼啊!!!!!!!!!

  • 0
    @ 2013-07-28 22:26:46

    第一次写SBT 挺慢的啊。。。
    VijosEx via JudgeDaemon2/13.7.4.0 via libjudge
    编译成功

    测试数据 #0: Accepted, time = 0 ms, mem = 552 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 564 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 564 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #4: Accepted, time = 7 ms, mem = 620 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 600 KiB, score = 10
    测试数据 #6: Accepted, time = 202 ms, mem = 3164 KiB, score = 10
    测试数据 #7: Accepted, time = 218 ms, mem = 4476 KiB, score = 10
    测试数据 #8: Accepted, time = 62 ms, mem = 1212 KiB, score = 10
    测试数据 #9: Accepted, time = 109 ms, mem = 2120 KiB, score = 10
    Accepted, time = 598 ms, mem = 4476 KiB, score = 100
    #include <cstdio>
    #include <cstring>
    #include <algorithm>

    using namespace std;

    #define MAXN 100001

    struct saver {
    saver *next;
    int v;
    };

    struct node {
    node* left_child,*right_child;
    saver *rank;
    int price;
    int s,size;
    };

    int p,n;
    int price;
    int r=0;

    node *roof,*bank;

    int right_ratote(node* &t){
    int s0=(t).size,s1=((*(t).left_child).right_child).size;
    int s2=(
    (*t).left_child).size;
    node *k=(*t).left_child;
    (*t).size-=s2;
    (*t).size+=s1;
    (*k).size=s0;
    (t).left_child=((*t).left_child).right_child;
    (t).s=((t).left_child).s+((*t).right_child).s+1;
    (*k).right_child=t;
    (*k).s=(t).s+((*k).left_child).s+1;
    t=k;
    return 0;
    }

    int left_ratote(node* &t){
    node *k=(*t).right_child;
    int z=(*k).size;
    (*k).size=(*t).size;
    (*t).size-=z;
    (t).size+=((*k).left_child).size;
    (*t).right_child=(*k).left_child;
    (t).s=((t).left_child).s+((*t).right_child).s+1;
    (*k).left_child=t;
    (*k).s=(t).s+((*k).right_child).s+1;
    t=k;
    return 0;
    }

    int maintain(node* &t){
    if ((((t).left_child).left_child).s>((*t).right_child).s){
    right_ratote(t);
    maintain((t).right_child);
    maintain(t);
    return 0;
    }
    if ((
    (*(t).right_child).right_child).s>((*t).left_child).s){
    left_ratote(t);
    maintain((t).left_child);
    maintain(t);
    return 0;
    }
    if ((
    (*(t).left_child).right_child).s>((*t).right_child).s){
    left_ratote((*t).left_child);
    right_ratote(t);
    maintain((*t).left_child);
    maintain((t).right_child);
    maintain(t);
    return 0;
    }
    if ((
    (*(t).right_child).left_child).s>((*t).left_child).s){
    right_ratote((*t).right_child);
    left_ratote(t);
    maintain((*t).left_child);
    maintain((*t).right_child);
    maintain(t);
    return 0;
    }
    return 0;
    }

    int INSERT(int key,int rank,node* &t){
    if (t==bank){
    t=new(node);
    (*t).left_child=(*t).right_child=bank;
    (*t).s=(*t).size=1;
    (*t).price=key;
    (t).rank=new(saver);
    (
    (t).rank).next=NULL;
    (
    (*t).rank).v=rank;
    return 0;
    }
    (*t).size++;
    if ((*t).price==key){
    saver *p=new(saver);
    (*p).v=rank;
    (*p).next=(*t).rank;
    (*t).rank=p;
    return 1;
    }
    int flag;
    if (key<(*t).price){
    flag=INSERT(key,rank,(*t).left_child);
    } else flag=INSERT(key,rank,(*t).right_child);
    if (!flag) {
    (*t).s++;
    }
    maintain(t);
    return flag;
    }

    bool f[MAXN];

    node* SELECT(int x,node t){
    if (x>(
    (*t).right_child).size&&x<=(t).size-((t).left_child).size){
    return t;
    }
    if (x<=(
    (*t).right_child).size){
    return SELECT(x,(*t).right_child);
    }
    return SELECT(x-((t).size-((*t).left_child).size),(*t).left_child);
    }

    int main(){
    memset(f,true,sizeof(f));
    bank=new(node);
    (*bank).s=(*bank).size=0;
    roof=(*bank).left_child=(*bank).right_child=bank;
    scanf("%d",&price);
    while (1){
    scanf("%d",&p);
    if (!p){
    break;
    }
    scanf("%d",&n);
    if (p==1){
    INSERT(n,++r,roof);
    }
    if (p==2){
    f[n]=false;
    }
    if (p==3){
    node *p=SELECT(n,roof);
    if ((*p).price>price){
    printf("Dui bu qi,Mei you.\n");
    } else {
    bool flag=false;
    saver *q=(*p).rank;
    while (q!=NULL){
    if (f[(*q).v]){
    flag=true;
    break;
    }
    q=(*q).next;
    }
    if (flag){
    printf("You. %d Yuan.\n",(*p).price);
    } else printf("Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!\n");
    }
    }
    }
    return 0;
    }

  • 0
    @ 2010-03-16 22:42:16

    SBT

    如果觉得处理重复价格麻烦,可以直接

    procedure find(v,data:longint);

    begin

    if (v=0) then exit;

    if (not flag) then exit;

    if (tree[v].data=data) then

    begin

    if (not saleout[tree[v].no]) then

    begin

    write('You.',data,'Yuan.');

    flag:=false;

    exit;

    end;

    find(tree[v].left,data);

    find(tree[v].right,data);

    exit;

    end;

    if (tree[v].data>data) then find(tree[v].left,data);

    if (tree[v].data

  • 0
    @ 2009-11-09 17:48:59

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:运行超时|无输出...

    ├ 测试数据 08:运行超时|无输出...

    ├ 测试数据 09:运行超时|格式错误...

    什么现象。。

    一样的程序今天交。。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-10-27 16:09:13

    输出.......

    疯掉了....

    想AC,用write,并把输出的句子里的空格全都去掉,程序结束前加个writeln

    60>70>90>AC

    我就是这么熬出来的..

  • 0
    @ 2009-10-25 20:42:49

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案错误...程序输出比正确答案长

    ├ 测试数据 08:答案正确... 56ms

    ├ 测试数据 09:运行时错误...|错误号: -1073741819

    ├ 测试数据 10:答案正确... 88ms

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:80 有效耗时:144ms

    无语中………………这题谁有数据啊,我受不了了 - -!

    要么用SBT,要么用Treap,怎么会错了

    另外有哪位大牛知道错误号: -1073741819 是什么意思,谢谢了

  • 0
    @ 2009-10-22 21:22:23

    此题WS之处:

    1.可能末尾没有0

    2.要去掉空格,换行,不然70

    3.同样的价格...我不会处理,搞了个Hash,可见我之沙茶......

    Treap AC

  • 0
    @ 2009-10-08 11:35:28

    90分。

    ├ 测试数据 01:答案错误...程序输出比正确答案长

    强烈鄙视这道题。

    先要把所有空格和换行去掉不然60.

    然后不知道为啥第一个wa。难道是程序问题么。

    如果有大牛发现了第一个数据的特殊性。

    麻烦告诉一下。发消息。

  • 0
    @ 2009-10-04 21:23:33

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 41ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:41ms

    Treap!

    其实想想很简单……

  • 0
    @ 2009-10-03 15:13:44

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    强大的平衡树啊!!!我love it!!!!

  • 0
    @ 2009-10-03 12:21:00

    program p1659;

    var

    a,sum,left,right:array[1..1000000] of longint;

    i,j,k,n,m,x,y,z:longint;

    function max(x,y:longint):longint;

    begin

    if x>y then exit(x)

    else exit(y);

    end;

    procedure creat(root,h,t:longint);

    var

    m:longint;

    begin

    if h>t then exit;

    left[root]:=h;

    right[root]:=t;

    if h=t then sum[root]:=a[h]

    else

    begin

    m:=(h+t) div 2;

    creat(root*2,h,m);

    creat(root*2+1,m+1,t);

    sum[root]:=max(sum[root*2],sum[root*2+1]);

    end;

    end;

    procedure change(root,h,t,num:longint);

    begin

    if (left[root]>t)or(right[root]t)or(right[root]=h)and(right[root]

  • 0
    @ 2009-10-02 16:15:37

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 119ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:119ms

    蛤蛤蛤蛤蛤!!!!!!!!!!!!!

    终于AC了!!!!!!!!!!!!!!!!!!!!!!!!

    竟然有相同的啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    21次终于AC 无法言表的愉快啊!!!

  • 0
    @ 2009-09-27 21:56:38

    第一个数据很特殊吗?好囧的测评结果!

    编译通过...

    ├ 测试数据 01:答案错误...程序输出比正确答案长

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 25ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

  • 0
    @ 2009-09-26 19:42:19

    program buchaqian;

    type q=record

    data:longint;

    wei:integer;

    end;

    var i,j,k,m,n,price,e,r,t:longint;

    a:array[1..100000] of q;

    b:array[1..100000] of boolean;

    p:array[1..100000] of 0..4;

    procedure pp(m:longint);

    var sr:longint;

    begin

    for sr:=1 to k do

    if a[sr].wei=m then begin t:=sr;exit; end;

    end;

    procedure paixu(e,r:longint);

    var x,y,i1,j1:longint;

    asd:boolean;

    begin

    i1:=e;x:=a[e].data;y:=a[e].wei; j1:=r; asd:=b[e];

    while i1j1 do

    begin

    while (i1j1)and(a[j1].data>x) do j1:=j1-1;

    if (i1j1)then begin a[i1].data:=a[j1].data; a[i1].wei:=a[j1].wei;b[i1]:=b[j1]; i1:=i1+1 end;

    while (i1j1)and(a[i1].data=2 then paixu(e,i1-1);

    if r-i1>=2 then paixu(i1+1,r);

    end;

    procedure run(n:longint);

    begin

    if a[k-n+1].data>price then writeln('Dui bu qi,Mei you.');

    if (a[k-n+1].data

  • 0
    @ 2009-09-23 11:36:11

    竟然没有注意到优先值。

    应该按照题目中说的那样,

    输出格式 Output Format

    对于每个p=3,

    1如果第n贵的菜价格高于price,则输出“Dui bu qi,Mei you.”。

    2如果第n贵的菜价格不高于price,且没有卖完,则输出“You.”然后输出价格m Yuan;

    3如果已卖完,则输出“Mei you. Zhe ge ke yi you. Zhe ge zhen mei you!”

    如果满足1,则输出第一个,否则

    如果满足2,则输出第二个,否则

    如果满足3,则输出第三个。

信息

ID
1647
难度
9
分类
数据结构 | 平衡树数据结构 | 线段树 点击显示
标签
(无)
递交数
1927
已通过
137
通过率
7%
被复制
3
上传者