如何卡进 1s?
查看原帖
如何卡进 1s?
365654
封禁用户楼主2023/1/7 10:15

rt,此代码不开 O2 TLE 70pts 1.16s,问题应该不大。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int PTA=131071;
int a[300012],aaa[300012],all[300012];
int p;
int qry(int l,int r,int ii,int aa,int xb)
{
	int ans=0;
	while(1)
	{
		if(l==ii&&r==aa) return (ans+all[xb])%p;
		int lmid=(ii+aa)>>1,rmid=lmid+1;
        aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
        a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
		a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
        a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
		if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
		if(r<=lmid) {aa=lmid;xb<<=1;continue;}
		if(ii==l) {ans+=all[xb<<1];ans%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
		if(aa==r) {ans+=all[(xb<<1)+1];ans%=p;aa=lmid;r=lmid;xb<<=1;continue;}
		return (ans+qry(l,lmid,ii,lmid,xb<<1)+qry(rmid,r,rmid,aa,(xb<<1)+1))%p;
	}
}
void mdfmdf(int l,int r,int v,int ii,int aa,int xb)
{
	while(1)
	{
        int t=qry(l,r,ii,aa,xb); // O(N * log N * log N)
		all[xb]+=t*(v-1);all[xb]%=p;
		if(l==ii&&r==aa) {aaa[xb]*=v;aaa[xb]%=p;a[xb]*=v;a[xb]%=p;return;}
		int lmid=(ii+aa)>>1,rmid=lmid+1;
        aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
        a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
		a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
        a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
		if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
		if(r<=lmid) {aa=lmid;xb<<=1;continue;}
		if(ii==l) {aaa[xb<<1]*=v,a[xb<<1]*=v,all[xb<<1]*=v;a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
		if(aa==r) {aaa[(xb<<1)+1]*=v,a[(xb<<1)+1]*=v,all[(xb<<1)+1]*=v;a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;aa=lmid;r=lmid;xb<<=1;continue;}
		mdfmdf(l,lmid,v,ii,lmid,xb<<1);mdfmdf(rmid,r,v,rmid,aa,(xb<<1)+1);
		break;
	}
}
void mdf(int l,int r,int v,int ii,int aa,int xb)
{
	while(1)
	{

		all[xb]+=(r-l+1)*v;all[xb]%=p;
		if(l==ii&&r==aa) {a[xb]+=v;a[xb]%=p;return;}
		int lmid=(ii+aa)>>1,rmid=lmid+1;
        aaa[xb<<1]*=aaa[xb],all[xb<<1]*=aaa[xb];aaa[(xb<<1)+1]*=aaa[xb],all[(xb<<1)+1]*=aaa[xb];
        a[xb<<1]*=aaa[xb];a[(xb<<1)+1]*=aaa[xb];aaa[xb]=1;
		a[xb<<1]+=a[xb],all[xb<<1]+=(lmid-ii+1)*a[xb];a[(xb<<1)+1]+=a[xb],all[(xb<<1)+1]+=(aa-rmid+1)*a[xb];a[xb]=0;
        a[xb<<1]%=p,aaa[xb<<1]%=p,all[xb<<1]%=p,a[(xb<<1)+1]%=p,aaa[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;
		if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
		if(r<=lmid) {aa=lmid;xb<<=1;continue;}
		if(ii==l) {a[xb<<1]+=v,all[xb<<1]+=(lmid-l+1)*v;a[xb<<1]%=p,all[xb<<1]%=p;ii=rmid;l=rmid;xb<<=1;xb++;continue;}
		if(aa==r) {a[(xb<<1)+1]+=v,all[(xb<<1)+1]+=(r-rmid+1)*v;a[(xb<<1)+1]%=p,all[(xb<<1)+1]%=p;aa=lmid;r=lmid;xb<<=1;continue;}
		mdf(l,lmid,v,ii,lmid,xb<<1);mdf(rmid,r,v,rmid,aa,(xb<<1)+1);
		break;
	}
}
signed main()
{
	int n,m;
	cin>>n>>m>>p;
    for(int i=1;i<=PTA*2-1;i++)
        aaa[i]=1;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		mdf(i,i,x,1,PTA+1,1);
	}
	for(int i=1;i<=m;i++)
	{
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op==1)
		{
			cin>>k;
			mdfmdf(x,y,k,1,PTA+1,1);
		}
        else if(op==2)
		{
			cin>>k;
			mdf(x,y,k,1,PTA+1,1);
		}
		else cout<<qry(x,y,1,PTA+1,1)<<endl;
	}
	return 0;
}
2023/1/7 10:15
加载中...