个人代码风格相关
代码外观方面
-
- 左大括号不换行;
- 一般情况下(指语句长度不会很长或很短),若单个选择 / 循环下仅有单个语句,
if、else和range-for不换行,普通for、while和do-while换行;有多个较短语句时使用,(逗号)进行连接; - 仅在
;(分号)之后加空格,其它非必要地方不加空格;一般情况下对于定义的单个变量,定义和输入语句写在同一行,两个语句用空格隔开; - 习惯使用结构化绑定。
代码内容方面
- 使用万能头文件与
using namespace std; - 一般使用 iostream 输入输出(关同步);
- 一般使用
vector(而不是 C 风格数组)以及其他 STL 容器;习惯使用pair和tuple; - 必要时经常使用 gnu_pbds;
sort等函数内常用 lambda 表达式。
编译选项方面
- 常用 GNU C++17 (64 bit);
- 使用 -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;
}