RT。
时间:21/8/29
-
万能头(除了某神仙OJ
-
快读板子封装(不怎么写)
-
代码块和代码块,空行区别。
-
大括号不换行。
-
for里register (如果卡register 就不写
-
while 和 if 如果后面能只用一行就不打括号。
-
线段树Define来写。
-
写图论喜欢写 u,v
-
++i 和 i++ 随缘
-
一道题如果要多个数据结构,会用namespace封装(或者注释一行等号来分割)。
-
如果不是撞关键字基本不大写。
-
讨厌空格(除了压行的if后面)。
-
能连等直接连着写(除了UB)。
-
同类型(功能)操作一般压在一行用逗号隔开一下。
-
尖括号能不空格就不空。
-
maxn不写,写si(size缩写)
-
一个模块的变量定义到一起。
-
if里多条件要打空格
-
cnt
这种有多个的话会在后面用下划线标识功能。 -
注释:
code... // description
(两个空格) -
cmp
死也不写,operator
好。 -
push_back
->pb
,first
->fr
-
bool b[]
少用,一般写bitset<si>b
。 -
英文注释较多
-
一般用前向星而且写
Next
-
不怎么压行,但一旦压行会舍弃上面的某些条件
-
不喜欢手写 min max swap 之类的,除非要卡常。
几份代码:
tarjan:
#include<bits/stdc++.h>
using namespace std;
const int si_n=1e5+10;
const int si_m=1e6+10;
#define pb push_back
struct Edge{
int ver,Next,head;
}e[si_m];
int cnt_e=0;
void add(int u,int v){
e[++cnt_e].ver=v,e[cnt_e].Next=e[u].head;
e[u].head=cnt_e;
}
stack<int>s;
bool ins[si_n]; // in the stack or not
int c[si_n]; //c[x] = the num of SCC which is x iside
vector<int>scc[si_n]; // scc[i] -> all node in i-th scc (information of i-th scc)
int dfn[si_n],low[si_n];
int n,m,cnt_t=0,tot=0; // tot = how many scc in the graph.
void tarjan(int u){
dfn[u]=low[u]=++cnt_t;
s.push(u),ins[u]=true;
for(register int i=e[u].head;i;i=e[i].Next){
int v=e[i].ver;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
++tot;
int x;
do{
x=s.top(),s.pop(),ins[x]=false;
c[x]=tot,scc[tot].pb(x);
}while(u!=x);
}
}
Edge edag[si_m];
int cnt_d=0;
void add_n(int u,int v){
edag[++cnt_d].ver=v,edag[cnt_d].Next=edag[u].head;
edag[u].head=cnt_d;
}
void contract(){
for(register int u=1;u<=n;++u){
for(register int i=e[u].head;i;i=e[i].Next){
int v=e[i].ver;
if(c[u]==c[v]) continue;
add_n(c[u],c[v]);
}
}
}
int main(){
cin>>n>>m;
for(register int i=1,u,v;i<=m;++i){
cin>>u>>v;
add(u,v);
}
for(register int i=1;i<=n;++i){
if(!dfn[i]) tarjan(i);
}
//......
}
segment tree:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define l(o) t[o].l
#define r(o) t[o].r
#define sum(o) t[o].value
#define tag(o) t[o].lazy
#define lson(o) o<<1
#define rson(o) o<<1|1
const int si=4e5+10;
int n,m,a[si];
struct segment_tree{
int l,r; // Data interval
int value,lazy; // Information & Lazytag
}t[si*4];
inline void pushdown(int p){
if(tag(p)){
sum(lson(p))+=tag(p)*(r(lson(p))-l(lson(p))+1);
sum(rson(p))+=tag(p)*(r(rson(p))-l(rson(p))+1); // Update information
tag(lson(p))+=tag(p),tag(rson(p))+=tag(p); // Spread tag
tag(p)=0; // Delete
}return;
}
inline void build(int p,int l,int r){
l(p)=l,r(p)=r,tag(p)=0;
if(l==r){
sum(p)=a[l];return;
} // Or a[r](value of leaf)
int mid=(l+r)>>1;
build(lson(p),l,mid);
build(rson(p),mid+1,r);
sum(p)=sum(lson(p))+sum(rson(p)); // Pushup(or minv,maxv,sin,cos...)
}
inline void modify(int p,int x,int val){
int l=l(p),r=r(p);
if(l==r){ //Find leaf
sum(p)=val;return; //Here is CHANGE x to val
}
int mid=(l+r)>>1;
if(x<=mid) modify(lson(p),x,val); // In leftson
else modify(rson(p),x,val); // In rightson
sum(p)=sum(lson(p))+sum(rson(p)); // Pushup
}
inline int query(int p,int l,int r){
int res=0,nl=l(p),nr=r(p);
if(l<=nl && nr<=r) return sum(p);
pushdown(p);
int mid=(nl+nr)>>1;
if(l<=mid) res+=query(lson(p),l,r);
if(r>mid) res+=query(rson(p),l,r);
return res;
}
inline void update(int p,int l,int r,int v){
int nl=l(p),nr=r(p);
if(l<=nl && nr<=r){
sum(p)+=v*(nr-nl+1);tag(p)+=v;
return;
}// Here is to ADD v for all elements in range[l,r]
pushdown(p);
int mid=(nl+nr)>>1;
if(l<=mid) update(lson(p),l,r,v);
if(r>mid) update(rson(p),l,r,v);
sum(p)=sum(lson(p))+sum(rson(p));
}
signed main(){
scanf("%lld%lld",&n,&m);
for(register int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
int op,l,r,k;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
scanf("%lld",&k);
update(1,l,r,k);
}
else printf("%lld\n",query(1,l,r));
}
return 0;
}
如果以前的代码和当前马蜂不一样以现在为准。