51 条题解
-
1bao_h LV 7 @ 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; }
-
12015-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; } } } }
-
02017-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;
} -
02016-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!) -
02016-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 Treeprocedure 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. -
02015-11-23 14:13:28@
-
02013-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;
} -
02010-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 -
02009-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 -
02009-10-27 16:09:13@
输出.......
疯掉了....想AC,用write,并把输出的句子里的空格全都去掉,程序结束前加个writeln
60>70>90>AC
我就是这么熬出来的.. -
02009-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 是什么意思,谢谢了
-
02009-10-22 21:22:23@
此题WS之处:
1.可能末尾没有0
2.要去掉空格,换行,不然70
3.同样的价格...我不会处理,搞了个Hash,可见我之沙茶......
Treap AC -
02009-10-08 11:35:28@
90分。
├ 测试数据 01:答案错误...程序输出比正确答案长
强烈鄙视这道题。
先要把所有空格和换行去掉不然60.
然后不知道为啥第一个wa。难道是程序问题么。
如果有大牛发现了第一个数据的特殊性。
麻烦告诉一下。发消息。 -
02009-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 有效耗时:41msTreap!
其实想想很简单…… -
02009-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!!!! -
02009-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] -
02009-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 无法言表的愉快啊!!!
-
02009-09-27 21:56:38@
第一个数据很特殊吗?好囧的测评结果!
编译通过...
├ 测试数据 01:答案错误...程序输出比正确答案长
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 25ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms -
02009-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 -
02009-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,则输出第三个。