【模板複習+重構( 重 新 開 始 )記錄】

1.【模板】快速冪||取餘運算

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
long long mod;
inline long long pow_(long long a,long long b)
{
	long long ans=1,base=a;
	while (b)
	{
		if (b&1)
		{
			ans*=base;
			ans%=mod;
		}
		base*=base;
		base%=mod;
		b>>=1;
	}
	return ans;
}

int main()
{
	long long n,m;
	scanf("%lld%lld%lld",&n,&m,&mod);
	printf("%lld^%lld mod %lld=%lld\n",n,m,mod,pow_(n,m));
}

(tips:long tmd)

2.【模板】線段樹1(區間加)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN (int)(1e5+233) 
long long ans[MAXN<<2],tag[MAXN<<2];
int n,m;
#define leftson cur<<1
#define rightson cur<<1|1
#define mid ((l+r)>>1)
#define len (r-l+1)
#define push_up ans[cur]=ans[leftson]+ans[rightson]
#define push_down down(leftson,l,mid,tag[cur]); down(rightson,mid+1,r,tag[cur]); tag[cur]=0
void build(int cur,int l,int r)
{
	if (l==r)
	{
		scanf("%lld",&ans[cur]);
		return;
	}
	build(leftson,l,mid);
	build(rightson,mid+1,r);
	push_up;
}
inline void down(int cur,int l,int r,long long k)
{
	ans[cur]+=(len*k);
	tag[cur]+=k;
	return;
}
void add(int cur,int l,int r,int cl,int cr,long long k)
{
	if (cl<=l&&r<=cr)
	{
		ans[cur]+=(k*len);
		tag[cur]+=k;
		return;
	}
	push_down;
	if (cl<=mid) add(leftson,l,mid,cl,cr,k);
	if (cr>mid) add(rightson,mid+1,r,cl,cr,k);
	push_up; 
}
long long query(int cur,int l,int r,int ql,int qr)
{
	if (ql<=l&&r<=qr) return ans[cur];
	push_down;
	long long answ=0;
	if (ql<=mid) answ+=query(leftson,l,mid,ql,qr);
	if (qr>mid) answ+=query(rightson,mid+1,r,ql,qr);
	push_up;
	return answ;
}
int main()
{
	scanf("%d%d",&n,&m);
	build(1,1,n);
	int opt,x,y;
	long long k;
	while(m--)
	{
		scanf("%d%d%d",&opt,&x,&y);
		if (opt==1)
		{
			scanf("%lld",&k);
			add(1,1,n,x,y,k);
		}
		else printf("%lld\n",query(1,1,n,x,y));
	}
	return 0;
}

(tips:傻逼纔會把len mid k寫亂位置,我是傻逼)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章