个人代码风格相关

· · 个人记录

代码外观方面

  1. 左大括号不换行;
  2. 一般情况下(指语句长度不会很长或很短),若单个选择 / 循环下仅有单个语句,ifelserange-for 不换行,普通 forwhiledo-while 换行;有多个较短语句时使用 ,(逗号)进行连接;
  3. 仅在 ;(分号)之后加空格,其它非必要地方不加空格;一般情况下对于定义的单个变量,定义和输入语句写在同一行,两个语句用空格隔开;
  4. 习惯使用结构化绑定。

代码内容方面

  1. 使用万能头文件与 using namespace std
  2. 一般使用 iostream 输入输出(关同步);
  3. 一般使用 vector(而不是 C 风格数组)以及其他 STL 容器;习惯使用 pairtuple
  4. 必要时经常使用 gnu_pbds;
  5. sort 等函数内常用 lambda 表达式。

编译选项方面

  1. 常用 GNU C++17 (64 bit);
  2. 使用 -O2 优化。

示例代码

示例代码 1(CF1784B Letter Exchange):

#include<bits/stdc++.h>
using namespace std;
typedef tuple<int,int,int,int> tpi;
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int t; cin>>t;
  while(t--){
    int n; cin>>n;
    vector<tpi> a(n);
    vector<tuple<int,char,int,char> > v;
    for(int i=0;i<n;i++){
      string s; cin>>s;
      a[i]=make_tuple(i,count(s.begin(),s.end(),'w'),count(s.begin(),s.end(),'i'),count(s.begin(),s.end(),'n'));
    }
    sort(a.begin(),a.end(),[](tpi x,tpi y){return get<1>(x)==get<1>(y)?get<2>(x)>get<2>(y):get<1>(x)>get<1>(y);});
    int l=0,r=n-1;
    while(l<r){
      if(get<1>(a[l])<2)break;
      if(get<1>(a[l])==3){
        char c; get<1>(a[l])--,get<1>(a[r])++;
        if(get<2>(a[r])>1)get<2>(a[r])--,get<2>(a[l])++,c='i';
        else get<3>(a[r])--,get<3>(a[l])++,c='n';
        v.emplace_back(get<0>(a[l]),'w',get<0>(a[r]),c);
      }
      else if(get<1>(a[l])==2){
        char c; get<1>(a[l])--,get<1>(a[r])++;
        if(get<2>(a[r])>1)get<2>(a[r])--,get<2>(a[l])++,c='i';
        else get<3>(a[r])--,get<3>(a[l])++,c='n';
        v.emplace_back(get<0>(a[l]),'w',get<0>(a[r]),c);
      }
      else break;
      l++,r--;
    }
    sort(a.begin(),a.end(),[](tpi x,tpi y){return get<1>(x)==get<1>(y)?get<2>(x)>get<2>(y):get<1>(x)>get<1>(y);});
    l=0,r=n-1;
    while(l<r){
      if(get<1>(a[l])<2)break;
      if(get<1>(a[l])==2){
        char c; get<1>(a[l])--,get<1>(a[r])++;
        if(get<2>(a[r])>1)get<2>(a[r])--,get<2>(a[l])++,c='i';
        else get<3>(a[r])--,get<3>(a[l])++,c='n';
        v.emplace_back(get<0>(a[l]),'w',get<0>(a[r]),c);
      }
      l++,r--;
    }
    sort(a.begin(),a.end(),[](tpi x,tpi y){return get<2>(x)==get<2>(y)?get<3>(x)>get<3>(y):get<2>(x)>get<2>(y);});
    l=0,r=n-1;
    while(l<r){
      if(get<2>(a[l])<2)break;
      v.emplace_back(get<0>(a[l]),'i',get<0>(a[r]),'n');
      l++,r--;
    }
    cout<<v.size()<<'\n';
    for(auto [a,b,c,d]:v)
      cout<<a+1<<' '<<b<<' '<<c+1<<' '<<d<<'\n';
  }
  return 0;
}

示例代码 2(ABC301E Pac-Takahashi):

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,m,t,c=0,k=0,r=-1; cin>>n>>m>>t;
  vector<string> a(n);
  vector b(n,vector<int>(m,-1)),d=b;
  for(auto &i:a){cin>>i; for(char j:i)c+=(bool)isalpha(j);}
  vector<pii> v(c);
  vector l(c,vector<int>(c,3e6));
  for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
      switch(a[i][j]){
        case 'S':v[b[i][j]=0]=make_pair(i,j); break;
        case 'G':v[b[i][j]=c-1]=make_pair(i,j); break;
        case '#':b[i][j]=-2; break;
        case 'o':v[b[i][j]=++k]=make_pair(i,j);
      }
  for(int i=0;i<c;i++){
    queue<pair<pii,int> > q;
    q.emplace(v[i],0),d[v[i].first][v[i].second]=true;
    for(auto &i:d)for(auto &j:i)j=0;
    while(!q.empty()){
      auto [p,c]=q.front(); auto [x,y]=p; q.pop();
      if(b[x][y]>=0&&b[x][y]!=i)l[i][b[x][y]]=c;
      for(int j=0;j<4;j++){
        int xx=x+dx[j],yy=y+dy[j];
        if(min(xx,yy)>=0&&xx<n&&yy<m&&b[xx][yy]>-2&&!d[xx][yy])
          d[xx][yy]=true,q.emplace(make_pair(xx,yy),c+1);
      }
    }
  }
  vector f(c,vector<int>(1<<c,3e6));
  for(int i=f[0][1]=0;i<1<<c;i++)
    for(int j=0;j<c;j++)
      for(int k=0;k<c;k++)
        if(!(i>>k&1))f[k][i|(1<<k)]=min(f[k][i|(1<<k)],f[j][i]+l[j][k]);
  for(int i=0;i<1<<c;i++)
    if((i>>c-1&1)&&f[c-1][i]<=t)r=max(r,__builtin_popcount(i)-2);
  cout<<r<<endl;
  return 0;
}

示例代码 3(P9191 Tree Merging Special Judge):

#include "testlib.h"
#include<bits/stdc++.h>
using namespace std;
int main(int argc,char* argv[]){
  registerTestlibCmd(argc,argv);
  int t=inf.readInt();
  while(t--){
    int n=inf.readInt();
    vector<int> f1(n),f2(n),r(n);
    vector<vector<int> > g(n);
    for(int i=1;i<n;i++){
      int v=inf.readInt(),p=inf.readInt();
      f1[--v]=--p,g[p].emplace_back(v);
    }
    int m=inf.readInt();
    vector<bool> b(n),d(n);
    for(int i=1;i<m;i++){
      int v=inf.readInt(),p=inf.readInt();
      f2[--v]=--p,b[v]=b[p]=true;
    }
    for(int i=0;i<n;i++){
      if(!f1[i])f1[i]=-1;
      if(b[i]&&!f2[i])f2[i]=-1;
    }
    int q=ouf.readInt();
    while(q--){
      int u=ouf.readInt(1,n),v=ouf.readInt(1,n);
      if(u>v)swap(u,v);
      if(--u==--v||f1[u]!=f1[v]||d[u]||d[v])quitf(_wa,"Wrong Answer");
      for(int i:g[u])if(!d[i])f1[i]=v,g[v].emplace_back(i);
      g[u].clear(),f1[u]=0,d[u]=true;
    }
    for(int i=0;i<n;i++)
      if(f1[i]!=f2[i])quitf(_wa,"Wrong Answer");
  }
  quitf(_ok,"Accepted");
  return 0;
}