前言
我把我的码风叫做:标风标程码风退化版(少了一些空格)
首先主要概述一下
1.一般会加上using namespace std;
2.一般不用#
d
e
f
i
n
e
define
define定义N,M而用const
未完待续
1.头文件们
首先从每个程序的开始讲起
我的
i
n
c
l
u
d
e
include
include后不加空格,大概长这样
:
:
:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
坚决不用 . h .h .h而在开头加上 c : c: c:
#include<ctime>
//#include<time.h>
#include<cstdio>
//#include<stdio.h>
#include<cstring>
//#include<string.h>
2.空格与小括号的那些事
左括号前(一般情况下,比如
f
o
r
for
for循环什么的)加空格
右括号后(一般情况下,同上)加空格
如果括号内的运算较少,括号内运算符号(一般情况下,除了
f
o
r
for
for循环什么的)前后不加空格
大概长这样
:
:
:
for (register int i = 1; i <= n; ++i)
if (i <= (n>>1)) balabala++; else balabala--;
3.花括号
左花括号不换行,前面加空格
右花括号常规
大概长这样
:
:
:
int main() {
scanf("%d", &n);
for (register int i = 1; i <= (n<<1) + 1; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
}
}
4.for循环
循环变量要么
i
i
i,要么
j
j
j,要么
k
k
k,要么
i
i
,
i
1
,
j
j
,
j
1
,
k
k
,
k
1
ii,i1,jj,j1,kk,k1
ii,i1,jj,j1,kk,k1……(jj讲究)
括号上面讲过了
然后里面
;
;
;后加空格,定义循环变量前加上
r
e
g
i
s
t
e
r
register
register
用
+
+
i
++i
++i而不是
i
+
+
i++
i++似乎更快
<
=
,
>
=
,
<
,
>
,
=
<=, >=, <, >, =
<=,>=,<,>,=前后各加一个空格
除了小括号(非for循环的小括号)内运算符号前后加空格
栗例子在上面
5.if语句
if语句里面除了小括号(非
i
f
if
if的小括号)外的所有运算符号和等于前后各加一个空格
&&
∣
∣
||
∣∣ 左右各加一个空格
举个栗子
:
:
:
if ((y > z || x > y) && (1<<x) > (1<<z))
return 0;
6.空格
综上所述:不是很多我的空格似乎吧
1.不在小括号内的运算符号前后各加空格(
m
i
d
=
(
l
+
r
)
>
>
1
mid = (l+r) >> 1
mid=(l+r)>>1)
2.数组下标里的运算符号不加空格(
a
[
l
+
r
]
a[l+r]
a[l+r])
3.
f
o
r
for
for循环随便加空格在所有
;
;
;都后有一个,
<
=
,
>
=
,
<
,
>
,
=
<=, >=, <, >, =
<=,>=,<,>,=前后各有一个
4.
i
f
,
w
h
i
l
e
if,while
if,while等类似
f
o
r
for
for
5.左花括号前加空格
6.逗号后面加空格
7.缩进
对于每个代码块,使用4个空格或者等长的Tab缩进
8.变量
根据中文意思定义变量名(不用time之类的)
比如深度:
d
e
p
o
r
d
e
p
t
h
dep\ or\ depth
dep or depth因为depth太长了所以一般用dep
或者实在不想搞那么麻烦就
a
,
b
,
c
,
d
,
e
,
f
,
g
…
…
a,b,c,d,e,f,g……
a,b,c,d,e,f,g……
当N,M定义为全局变量时一般使用大写
定义变量时:
首先const在最上面
如果有多个const中间不换行
const后面换行
再定义结构体,
s
t
r
u
c
t
struct
struct前面必须时空行,结构体名称后空格再加花括号
定义结构体不超过(n+2)行,n为结构体中变量类型总数
定义完后必须换行
接着定义STL什么的
然后其他先定义变量,在定义数组,同类型分两行,第一行定义变量,第二行定义数组
然后大概长这样
:
:
:
#include<queue>
#include<cstdio>
using namespace std;
const int Inf = 0x7fffffff;
const int Maxn = 1e5 + 5;
struct Node {
int x, y;
}a[Maxn];
struct Line {
int from, to, next;
long long w;
double time;
}e[Maxn<<1];
priority_queue < pair<int, int> > que;
int N, M;
long long num;
int x[Maxn], y[Maxn];
long long ans[Maxn];
//定义完后加换行
最后,是我的标风程序:
#include<cstdio>
using namespace std;
const N = 1e5 + 5;
struct node {
long long l, r, sum, add, ft;
}tree[N<<2];
int n, q;
int a[N];
void build(int p, int l, int r) {
tree[p].l = l;
tree[p].r = r;
if (l == r) {
tree[p].sum = a[l];
tree[p].ft = a[l] * a[l];
return;
}
int mid = (l+r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
tree[p].ft = tree[p<<1].ft + tree[p<<1|1].ft;
}
void spread(int p) {
if (tree[p].add) {
tree[p<<1].add += tree[p].add;
tree[p<<1|1].add += tree[p].add;
tree[p<<1].ft += 2 * tree[p<<1].sum * tree[p].add + (tree[p<<1].r-tree[p<<1].l+1) * tree[p].add * tree[p].add;
tree[p<<1|1].ft += 2 * tree[p<<1|1].sum * tree[p].add + (tree[p<<1|1].r-tree[p<<1|1].l+1) * tree[p].add * tree[p].add;
tree[p<<1].sum += tree[p].add * (tree[p<<1].r-tree[p<<1].l+1);
tree[p<<1|1].sum += tree[p].add * (tree[p<<1|1].r-tree[p<<1|1].l+1);
tree[p].add = 0;
}
}
void change(int p, int l, int r, int v) {
if (l <= tree[p].l && tree[p].r <= r) {
tree[p].ft += ((tree[p].sum * v)<<1) + (tree[p].r-tree[p].l+1) * v * v;
tree[p].sum += v * (tree[p].r-tree[p].l+1);
tree[p].add += v;
return;
}
spread(p);
int ft = (tree[p].l+tree[p].r) >> 1;
if (l <= ft) change(p << 1, l, r, v);
if (r > ft) change(p << 1 | 1, l, r, v);
tree[p].sum = tree[p<<1].sum + tree[p<<1|1].sum;
tree[p].ft = tree[p<<1].ft + tree[p<<1|1].ft;
}
long long ask(int p, int l, int r) {
if (l <= tree[p].l && tree[p].r <= r)
return tree[p].sum;
spread(p);
int ft = (tree[p].l+tree[p].r) >> 1;
long long solve = 0;
if (l <= ft) solve += ask(p << 1, l, r);
if (r > ft) solve += ask(p << 1 | 1, l, r);
return solve;
}
long long ask_(int p, int l, int r) {
if (l <= tree[p].l && tree[p].r <= r)
return tree[p].ft;
spread(p);
int ft = (tree[p].l+tree[p].r) >> 1;
long long solve = 0;
if (l <= ft) solve += ask_(p << 1, l, r);
if (r > ft) solve += ask_(p << 1 | 1, l, r);
return solve;
}
signed main() {
scanf("%d %d", &n, &q);
for (register int i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
int op = 0, x = 0, y = 0, z = 0;
while (q--) {
scanf("%d", &op);
if (op == 0) {
scanf("%d %d", &x, &y);
change(1, x, x, y);
} else if (op == 1) {
scanf("%d %d %d", &x, &y, &z);
change(1, x, y, z);
} else if (op == 2) {
scanf("%d %d", &x, &y);
printf("%d\n", ask(1, x, y));
} else if (op == 3) {
scanf("%d %d", &x, &y);
long long s1 = ask_(1, x, y), s2 = ask(1, x, y);
double pjs = (double)s2 / (y-x+1), s3 = s1 - 2 * s2 * pjs + (y-x+1) * pjs * pjs;
printf("%.10lf\n", s3 / (y-x+1));
}
}
}