脚本宝典收集整理的这篇文章主要介绍了板子,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
//#define getchar()(X==Y&&(Y=(X=sRead)+fread(sRead,1,1<<21,stdin),X==Y)?EOF:*X++)
//char sRead[1<<21],*X=sRead,*Y=sRead;
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//以上三行 CCF 不能用
inline int read(){
int ans=0,f=1;
char in=getchar();
while(in<'0'||in>'9'){
if(in=='-'){
f=-f;
}
in=getchar();
}
while(in>='0'&&in<='9'){
ans=(ans<<1)+(ans<<3)+(in^'0');
in=getchar();
}
return ans*f;
}
inline void write(int x){
if(x<0){
putchar('-');write(-x);
return ;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
}
euler[1]=1;mu[1]=1;
for(int i=2;i<=nn;i++){
if(nprime[i]==false){
prime[++len]=i;
mu[i]=-1;euler[i]=i-1;
}
for(int j=1;prime[j]*i<=nn;j++){
nprime[prime[j]*i]=true;
if(i%prime[j]==false){
euler[i*prime[j]]=euler[i]*prime[j];
break;
}
else{
euler[i*prime[j]]=euler[i]*(prime[j]-1);
mu[prime[j]*i]=-mu[i];
}
}
}
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int nn=1000005;
int n,a[nn],tree[nn<<2],tag[nn<<2];
int opt,x,y,v,que;
inline void pushup(int root){
tree[root]=tree[root<<1]+tree[root<<1|1];
}
inline void build_tree(int lft,int rht,int root){
if(lft==rht){
tree[root]=a[lft];
return ;
}
int middle=(lft+rht)>>1;
build_tree(lft,middle,root<<1);
build_tree(middle+1,rht,root<<1|1);
pushup(root);
}
inline void pushdown(int lft,int rht,int root){
int middle=(lft+rht)>>1;
tree[root<<1]+=tag[root]*(middle-lft+1);
tree[root<<1|1]+=tag[root]*(rht-middle);
tag[root<<1]+=tag[root];tag[root<<1|1]+=tag[root];
tag[root]=0;
}
inline void add(int lft,int rht,int root){
if(x<=lft&&rht<=y){
tree[root]+=v*(rht-lft+1);tag[root]+=v;
return ;
}
int middle=(lft+rht)>>1;
if(x<=middle){
add(lft,middle,root<<1);
}
if(middle<y){
add(middle+1,rht,root<<1|1);
}
pushup(root);
}
inline int query(int lft,int rht,int root){
if(x<=lft&&rht<=y){
return tree[root];
}
int middle=(lft+rht)>>1,ans=0;
if(x<=middle){
ans=query(lft,middle,root<<1);
}
if(middle<y){
ans+=query(middle+1,rht,root<<1|1);
}
return ans;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build_tree(1,n,1);
cin>>que;
for(int i=1;i<=que;i++){
cin>>opt>>x>>y;
switch(opt){
case 1: cin>>v;add(1,n,1);break;
case 2: cout<<query(1,n,1)<<endl;break;
}
}
return 0;
}
以上是脚本宝典为你收集整理的板子全部内容,希望文章能够帮你解决板子所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。