大约一年半前,我写下了人生中的第一个程序:
『你好,世界!』
#include <bits/stdc++.h>
using namespace std;
int main() {
puts("Hello World!");
return 0;
}
但是,在大约半年前,我养成了一个坏习惯——压行
所以,直至今天,我的程序大多都长成这样:
#include <bits/stdc++.h>
#define N 100000
using namespace std;
struct Splay {
int tot,rt,ch[N|1][2],fa[N|1],val[N|1],cnt[N|1],siz[N|1];
void upd(int k) { siz[k]=siz[ch[k][0]]+siz[ch[k][1]]+cnt[k]; }
int get(int k) { return k==ch[fa[k]][1]; }
void ini(int k) { ch[k][0]=ch[k][1]=fa[k]=val[k]=cnt[k]=siz[k]=0; }
void rotate(int k,int o) {
int dad=fa[k],gra=fa[dad],anc=fa[gra],son=get(k);
if(o==0) {
ch[dad][son]=ch[k][son^1],fa[ch[dad][son]]=dad,ch[k][son^1]=dad,fa[dad]=k,fa[k]=gra;
if(gra) ch[gra][ch[gra][1]==dad]=k; upd(dad),upd(k);
} else if(o==1) {
ch[gra][son]=ch[dad][son^1],fa[ch[gra][son]]=gra,ch[dad][son]=ch[k][son^1],fa[ch[dad][son]]=dad;
fa[k]=anc,ch[k][son^1]=dad,fa[dad]=k,ch[dad][son^1]=gra,fa[gra]=dad;
if(anc) ch[anc][ch[anc][1]==gra]=k; upd(gra),upd(dad),upd(k);
} else {
ch[gra][son^1]=ch[k][son],fa[ch[k][son]]=gra,ch[dad][son]=ch[k][son^1],fa[ch[dad][son]]=dad;
fa[k]=anc,ch[k][son]=gra,fa[gra]=k,ch[k][son^1]=dad,fa[dad]=k;
if(anc) ch[anc][ch[anc][1]==gra]=k; upd(gra),upd(dad),upd(k);
}
}
void splay(int k) { for(int d=fa[k];d=fa[k];rotate(k,d==rt?0:get(k)==get(d)?1:2)); rt=k; }
void insert(int k) {
if(!rt) { val[++tot]=k,cnt[tot]=1,rt=tot; return; }
for(int cur=rt,d=0;;) {
if(val[cur]==k) { cnt[cur]++,upd(cur),upd(d),splay(cur); break; } d=cur,cur=ch[cur][val[cur]<k];
if(!cur) { val[++tot]=k,cnt[tot]++,fa[tot]=d,ch[d][val[d]<k]=tot,upd(tot),upd(d),splay(tot); break; }
}
}
int rankof(int k) {
for(int res=0,cur=rt;;) {
if(k<val[cur]) { cur=ch[cur][0]; continue; } res+=siz[ch[cur][0]];
if(k==val[cur]) { splay(cur); return res+1; } res+=cnt[cur],cur=ch[cur][1];
}
}
int kthnum(int k) {
for(int cur=rt;;) {
if(ch[cur][0]&&k<=siz[ch[cur][0]]) { cur=ch[cur][0]; continue; }
k-=cnt[cur]+siz[ch[cur][0]]; if(k<=0) { return val[cur]; } cur=ch[cur][1];
}
}
int getprev() { int cur=ch[rt][0]; while(ch[cur][1]) cur=ch[cur][1]; return cur; }
int getnext() { int cur=ch[rt][1]; while(ch[cur][0]) cur=ch[cur][0]; return cur; }
void delnod(int k) {
rankof(k); if(cnt[rt]>1) { cnt[rt]--; upd(rt); return; }
if(!ch[rt][0]&&!ch[rt][1]) { ini(rt); rt=0; return; }
if(!ch[rt][0]) { int dad=rt; rt=ch[rt][1]; fa[rt]=0; ini(dad); return; }
if(!ch[rt][1]) { int dad=rt; rt=ch[rt][0]; fa[rt]=0; ini(dad); return; }
int x=getprev(),dad=rt; splay(x); fa[ch[dad][1]]=x; ch[x][1]=ch[dad][1]; ini(dad); upd(rt);
}
} Tree;
int n,opt,num;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d%d",&opt,&num);
if(opt==1) Tree.insert(num);
if(opt==2) Tree.delnod(num);
if(opt==3) printf("%d\n",Tree.rankof(num));
if(opt==4) printf("%d\n",Tree.kthnum(num));
if(opt==5) Tree.insert(num),printf("%d\n",Tree.val[Tree.getprev()]),Tree.delnod(num);
if(opt==6) Tree.insert(num),printf("%d\n",Tree.val[Tree.getnext()]),Tree.delnod(num);
}
return 0;
}
而这些经过压行的程序,不仅不美观,反而会令人眼花缭乱、头皮发麻、放弃调试。
于是,我决定作出一些改变。
让我改掉压行的坏习惯,遵循大佬们的代码规范,写出崭新的程序吧!
下面的程序将是我向新世界迈出的第一步:
『你好,新的世界!』
#include <bits/stdc++.h>
using namespace std;
int main() {
for (int i = 1; i <= 3; i++)
puts("Hello,New World!");
return 0;
}