My code style

前言

我把我的码风叫做:标风标程码风退化版(少了一些空格)
首先主要概述一下
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++似乎更快
&lt; = , &gt; = , &lt; , &gt; , = &lt;=, &gt;=, &lt;, &gt;, = <=,>=,<,>,=前后各加一个空格
除了小括号(非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 ) &gt; &gt; 1 mid = (l+r) &gt;&gt; 1 mid=(l+r)>>1)
2.数组下标里的运算符号不加空格( a [ l + r ] a[l+r] a[l+r])
3. f o r for for循环随便加空格在所有 ; ; ;都后有一个, &lt; = , &gt; = , &lt; , &gt; , = &lt;=, &gt;=, &lt;, &gt;, = <=,>=,<,>,=前后各有一个
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));
		}
	}
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值