板子

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了板子脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
  • 快读,快输
//#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');
}
  • 筛素数、欧拉函数、(mu)
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,请注明来意。
标签: