$Yeasion$的码风修改历程
总之,今天是一个值得纪念的伟大日子,我将自己的码风进行了彻底的修改,大概是参考了Pks和\(Rqy\)的码风,分为以下几点。
1.变量名。在所有的计算符号之前和之后加空格。如:"&","|","!","\(+\)","\(-\)","\(\times\)","\(/\)"这些运算符。两个相邻的计算符之间不加空格。
原版:
while(c<'0'||c>'9') c=getchar();
后版:
while(c < '0' || c > '9') c = getchar();
2.逗号。每一个逗号之后都跟一个空格,比如:
LL A, B, C, Mark, N, M, Value[MAXN];
3.变量名。尽可能多的使用大写字符和下划线。
例:原版线段树1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000010
using namespace std;
long long value[MAXN],tag[MAXN];
struct point
{
long long left;
long long right;
long long sum;
}edge[MAXN*4];
#define leftson now*2
#define rightson now*2+1
void update(long long now)
{
edge[now].sum=edge[leftson].sum+edge[rightson].sum;
}
void build(long long left,long long right,long long now)
{
if(left==right)
{
edge[now].sum=value[left];
return ;
}
long long mid=(left+right)/2;
build(left,mid,now*2);
build(mid+1,right,now*2+1);
update(now);
}
void put(long long now,long long mid,long long left,long long right)
{
if(tag[now])
{
tag[leftson]+=tag[now];
tag[rightson]+=tag[now];
edge[leftson].sum+=(mid-left+1)*tag[now];
edge[rightson].sum+=(right-mid)*tag[now];
tag[now]=0;
}
}
void change(long long left,long long right,long long now,long long v,long long now_left,long long now_right)
{
if(now_left<=left)
if(now_right>=right)
{
tag[now]+=v;
edge[now].sum+=(right-left+1)*v;
return ;
}
long long mid=(left+right)/2;
put(now,mid,left,right);
if(now_left<=mid)
change(left,mid,now*2,v,now_left,now_right);
if(mid<now_right)
change(mid+1,right,now*2+1,v,now_left,now_right);
update(now);
}
long long ask(long long left,long long right,long long now,long long now_left,long long now_right)
{
long long ans=0;
if(now_left<=left)
if(now_right>=right)
return edge[now].sum;
long long mid=(left+right)/2;
put(now,mid,left,right);
if(mid>=now_left)
ans+=ask(left,mid,now*2,now_left,now_right);
if(mid<now_right)
ans+=ask(mid+1,right,now*2+1,now_left,now_right);
return ans;
}
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
scanf("%lld",&value[i]);
build(1,n,1);
for(long long i=1;i<=m;i++)
{
long long p; scanf("%lld",&p);
if(p==1)
{
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
change(1,n,1,z,x,y);
}
else if(p==2)
{
long long x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(1,n,1,x,y));
}
}
return 0;
}
后版
#include <iostream>
#include <cstdio>
#define MAXN 1000100
#define LL long long
#define Re register
#define LS (now << 1)
#define RS (now << 1 | 1)
#define Mid ((L + R) >>1)
#define E_Mid ((Edge[now].L + Edge[now].R) >> 1)
using namespace std;
inline void Read(LL & x){
char c = getchar(); x = 0;
while(c < '0' || c > '9') c = getchar();
while(c <= '9' && c >= '0')
x = x * 10 + c - 48, c = getchar();
}
inline void Print(LL x){
int num = 0; char c[15];
while(x) c[++num]=(x % 10) + 48, x /= 10;
while(num) putchar(c[num --]);
putchar('\n');
}
struct Node{
LL L, R, Sum, Tag;
}Edge[MAXN << 1];
LL A, B, C, Mark, N, M, Value[MAXN];
inline void Push_Up(LL now){
Edge[now].Sum = Edge[LS].Sum + Edge[RS].Sum;
}
inline void Push_Down(LL now){
if(Edge[now].Tag){
Edge[LS].Tag += Edge[now].Tag, Edge[RS].Tag += Edge[now].Tag;
Edge[LS].Sum += Edge[now].Tag * (Edge[LS].R - Edge[LS].L + 1);
Edge[RS].Sum += Edge[now].Tag * (Edge[RS].R - Edge[RS].L + 1);
Edge[now].Tag = 0;
}
}
void Build_Tree(LL now, LL L, LL R){
if(L == R){
Edge[now].L = L, Edge[now].R = R;
Edge[now].Sum = Value[L];
return ;
}
Edge[now].L = L; Edge[now].R = R;
Build_Tree(RS, Mid + 1, R); Build_Tree(LS, L, Mid);
Push_Up(now);
}
void Add(LL now, LL L, LL R, LL K){
if(Edge[now].L >= L && Edge[now].R <= R){
Edge[now].Tag += K;
Edge[now].Sum += K * (Edge[now].R - Edge[now].L + 1);
return ;
} Push_Down(now);
if(E_Mid >= L) Add(LS, L, R, K);
if(E_Mid < R) Add(RS, L, R, K);
Push_Up(now);
}
LL Query(LL now, LL L, LL R){
if(Edge[now].L >= L && Edge[now].R <= R)
return Edge[now].Sum;
Push_Down(now); LL Ans = 0;
if(E_Mid >= L) Ans += Query(LS, L, R);
if(E_Mid < R) Ans += Query(RS, L, R);
return Ans;
}
int main(){
Read(N); Read(M);
for(int i = 1; i <= N; i ++)
Read(Value[i]);
Build_Tree(1, 1, N);
for(int i = 1; i <= M; i ++){
Read(Mark);
if(Mark == 1){
Read(A); Read(B); Read(C);
Add(1, A, B, C);
} else{
Read(A); Read(B);
Print(Query(1, A, B));
}
} return 0;
}
随机推荐
- Java 重写(Override)与重载(Overload)区别
2019-04-1217:31:19 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading). (2)方法重写是在子 ...
- Be opinionated out of the box but get out of the way quickly as requirements start to diverge from
Be opinionated out of the box but get out of the way quickly as requirements start to diverge from t ...
- IntelliJ IDEA 16创建Web项目
首先要理解一个概念:在IntelliJ IDEA中“new Project”相当于eclipse中的工作空间(Workspace),而“new Module”相当于eclipse中的工程(Projec ...
- Js事件监听封装(支持匿名函数)
先看demo:http://liutian1937.github.io/demo/EventListen.html/*绑定事件与取消绑定*/ var handleHash = {}; var bind ...
- BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)
题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...
- cf1043D. Mysterious Crime(枚举)
题意 题目链接 给出\(m\)个长度为\(n\)的排列,问有多少连续公共子串 \(m \leqslant 10, n \leqslant 10^5\) Sol 非常naive的一道题然而交了3遍才过( ...
- 删除SVN版本信息 .svn文件夹
环境:MyEclipse.Windows 问题描述: 在MyEclipse中当我们需要将一个文件夹(包含若干文件或嵌套文件夹)拷贝到另一个文件夹时,此时文件内容虽然拷贝过去了,但其下面的 .svn文件 ...
- How to use Log4cplus
Introduction Log4cplus is derived by the popular Log4j written in java.<br>This tutorial show ...
- 12_Redis缓存穿透
[何为缓存穿透] 缓存穿透是查询一个一定不存在的数据,这样的请求都要到存储层MySql去查询,失去了缓存的意义,在流量大时,可能MySql就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是 ...
- js 生成md5
原理比较复杂,不过人类区别与其他动物是因为会用工具,所以,把下面代码复制保存一下就好了. <script> var hex_chr = "0123456789abcdef&quo ...