代码风格
简单介绍一下我的代码风格。
头文件 & 宏定义
-
所有
#include
全部放在代码最开头,#define
紧随其后。 -
大部分情况下直接
#include<bits/stdc++.h>
。 -
大致使用到的宏定义如下,根据需要写其他的宏定义:
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define x first
#define y second
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
- 如果题目有爆
long long
的风险,大部分情况下直接#define int long long
。
名字空间 & 静态存储区变量声明
-
代码
using namespace std;
使用标准输入输出。 -
使用
const int
定义数组长度常量N
或M
而非宏定义方式。 -
数组一般开在 main 函数外的静态存储区,如果使用大空间 stl(例如 vector 存图)一般开在 main 函数外。
-
变量与数组名称大部分时间采用英文单词或其缩写,少量使用汉语拼音首字母或汉字全拼,题目中给出的变量与数组尽可能与题面保持一致。
自定义函数
-
自定义函数如果没有递归或者循环在开头加
inline
优化。 -
函数名清晰易懂,与数组名规则类似。
-
传参时按实际需要进行引用和值传递。
-
如果需要用到 main 函数中的变量或者函数较短,通常写成 lambda 表达式的形式。
main 函数
-
main 函数放在程序最末尾。
-
main 函数最后要用
return 0
标致结束。
标点、换行与空格
-
不添加多于换行和空格。
-
如果前后两则语句关系密切,用
,
隔开,否则用;
隔开。 -
如果前后两则都较短,可以考虑写入同行。
花括号
-
左花括号与前面的语句同行,用空格隔开。
-
右花括号与后面语句同行,用空格隔开。
-
如果语句仅有一行或无需分号隔开,不使用花括号。
实例:
int mx=0,cnt=0;
for(int i=1;i<=n;++i) {
if(a[i]==mx) cnt++;
else if(a[i]>mx) mx=a[i],cnt=1;
} cout<<mx<<' '<<cnt<<'\n';
其他
-
数组使用时主要采取 1-index(下标从 \(1\) 开始)。
-
写代码时如果遇到一些复杂的内容或者易错点(例如 dp 阶段的划分),用必要的注释提醒自己。
本人喜欢比较密集的代码,与诸位可能审美存在一定差异。
本文仅代表个人的代码风格。
最后放一个 csp-s 2024 超速检测的赛事代码,感受一下我的代码风格。
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned ll
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pii pair<int,int>
#define x first
#define y second
#define pb push_back
#define all(v) v.begin(),v.end()
#define lbt(i) (i&-i)
using namespace std;
const int N = 1e5+5, mod = 998244353, M = 1e6+5;
// be careful with multiple cases
struct cars {
ll d,v,a;
pii qj;
} c[N];
int p[N];
vector<pii> vc;
void solve() {
vc.clear();
// first check the init.
ll n,m,l,vmx;
cin>>n>>m>>l>>vmx;
auto mcl = [&](ll a,ll b) -> ll {
return (a+b-1)/b;
};
auto cal = [&](ll d,ll v,ll a) -> pii {
if(a==0) {
if(v>vmx) return {d,l};
return {-1,-1};
} if(a>0) {
if(v>vmx) return {d,l};
// v <= vmx, a > 0
ll pos=(vmx*vmx-v*v)/(2ll*a);
if(d+pos+1>l) return {-1,-1};
return {d+pos+1,l};
}
if(v<=vmx) return {-1,-1};
// v > vmx, a < 0
ll pos=mcl((v*v-vmx*vmx),(-2ll*a));
return {d,min(l,d+pos-1)};
};
rep(i,1,n) {
cin>>c[i].d>>c[i].v>>c[i].a;
c[i].qj=cal(c[i].d,c[i].v,c[i].a);
// cout<<c[i].qj.x<<' '<<c[i].qj.y<<'\n';
}
rep(i,1,m) cin>>p[i];
auto fmin = [&](int id) -> int {
auto tt=lower_bound(p+1,p+m+1,id)-p;
return tt;
};
auto fmax = [&](int id) -> int {
auto tt=upper_bound(p+1,p+m+1,id)-p-1;
return tt;
};
rep(i,1,n) {
int st=c[i].qj.x,ed=c[i].qj.y;
if(st==-1) continue;
int s=fmin(st),t=fmax(ed);
if(s>t) continue;
vc.pb({s,t});
} cout<<vc.size()<<' ';
int res=0,now=0;
sort(all(vc),[&](pii a,pii b){return a.y<b.y;});
for(auto c:vc) {
int st=c.x,ed=c.y;
if(now<st) res++,now=ed;
} cout<<m-res<<'\n';
}
signed main() {
freopen("detect.in","r",stdin);
freopen("detect.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}
本文作者:abensyl
本文链接:https://www.cnblogs.com/abensyl/articles/18564026
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步