求助卡常
查看原帖
求助卡常
337878
EastSnowLotus楼主2023/10/14 09:22

rt,TLE on 55

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
#define fi first
#define se second
#define endl '\n'
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define Cl(x) memset(x,0,sizeof(x))
const bool DC=0;
const ll mod=1e9+7;
const int N=0;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll b,ll p=mod){ll ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
void NO(){cout<<"NO\n";}
void YES(){cout<<"YES\n";}
mt19937 rnd((unsigned long long)new char);
inline char gc () {
    static char buf[1048576], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin), p1 == p2) ? EOF : *p1 ++ ;
}

int read () {
    int ans = 0; char ch = gc();
    while(!isdigit(ch)) ch = gc();
    while(isdigit(ch)) ans = ans * 10 + ch - '0', ch = gc();
    return ans;
}
int w[100005];
struct mat{
	ll a[3][3];
	mat(int i=0){a[1][1]=a[2][2]=i,a[1][2]=a[2][1]=0;}
	mat operator *(const mat&b)const{
		mat ans;
		ans.a[1][1]=(a[1][1]*b.a[1][1]+a[1][2]*b.a[2][1])%mod;
		ans.a[1][2]=(a[1][1]*b.a[1][2]+a[1][2]*b.a[2][2])%mod;
		ans.a[2][1]=(a[2][1]*b.a[1][1]+a[2][2]*b.a[2][1])%mod;
		ans.a[2][2]=(a[2][1]*b.a[1][2]+a[2][2]*b.a[2][2])%mod;
		return ans;
	}
	mat operator+(const mat&b)const{
		mat ans;
		ans.a[1][1]=(a[1][1]+b.a[1][1])%mod;
		ans.a[1][2]=(a[1][2]+b.a[1][2])%mod;
		ans.a[2][1]=(a[2][1]+b.a[2][1])%mod;
		ans.a[2][2]=(a[2][2]+b.a[2][2])%mod;
		return ans;
	}
	bool operator==(const mat&b)const{
		return a[1][1]==b.a[1][1]&&a[1][2]==b.a[1][2]&&a[2][1]==b.a[2][1]&&a[2][2]==b.a[2][2];
	}
}a[400005],lz[400005],bs,I(1);
mat qpow(mat a,ll b){
	mat ans(1);
	for(;b;b>>=1,a=a*a)if(b&1)ans=ans*a;
	return ans;
}
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
void build(int p,int l,int r){
	lz[p]=I;
	if(l==r){
		a[p]=qpow(bs,w[l]-1);
		return;
	}
	build(ls,l,mid);build(rs,mid+1,r);
	a[p]=a[ls]+a[rs];
}
void pd(int p){
	if(lz[p]==I)return;
	a[ls]=a[ls]*lz[p];
	lz[ls]=lz[ls]*lz[p];
	a[rs]=a[rs]*lz[p];
	lz[rs]=lz[rs]*lz[p];
	lz[p]=I;
}
void chg(int p,int l,int r,int L,int R,int v){
	if(l>=L&&r<=R){
		a[p]=a[p]*qpow(bs,v);
		lz[p]=lz[p]*qpow(bs,v);
		return;
	}
	pd(p);
	if(L<=mid)chg(ls,l,mid,L,R,v);
	if(R>mid)chg(rs,mid+1,r,L,R,v);
	a[p]=a[ls]+a[rs];
}
ll qry(int p,int l,int r,int L,int R){
	if(l>=L&&r<=R)return a[p].a[1][1];
	ll tmp=0;
	pd(p);
	if(L<=mid)tmp=tmp+qry(ls,l,mid,L,R);
	if(R>mid) tmp=tmp+qry(rs,mid+1,r,L,R);
	return tmp%mod;
}

void __INIT__(){bs.a[1][1]=bs.a[1][2]=bs.a[2][1]=1;}
void __SOLVE__(int _case){
	const int n=read(),m=read();
	for(int i=1;i<=n;i++)w[i]=read();
	build(1,1,n);
	for(int i=1;i<=m;i++){
		const int op=read(),l=read(),r=read();
		if(op==1){
			chg(1,1,n,l,r,read());
		}else{
			cout<<qry(1,1,n,l,r)<<endl;
		}
	}
}
int main(){/*freopen(".in","r",stdin);freopen(".out","w",stdout);*/__INIT__();int T;DC?cin>>T,1:T=1;for(int _CASE=1;_CASE<=T;_CASE++)__SOLVE__(_CASE);return 0;}

不知道还有什么地方可以卡常了

2023/10/14 09:22
加载中...