萌新求助大佬 调了一天了还是0分。。。头发快没了。。。。
查看原帖
萌新求助大佬 调了一天了还是0分。。。头发快没了。。。。
46694
少帅_zjm楼主2020/11/11 16:56

样例能过,测试点一不%求余也能过(好像不%求余至少答案是对的),但是一加上取余就错了。。。当然有可能会超时(这是后话)。。。感觉我对乘法和加法的取余理解没错啊怎么会完全%不到一块儿呢????

#include<bits/stdc++.h>
using namespace std;
struct node 
{
	int num,zhi;
};
int p;
vector<node> biao[200000];
long long a[200000]={0};
long long build(int l,int r,int k)
{
	if(l==r) return a[k];
	a[k*2]=build(l,(l+r)/2,k*2);
	a[k*2+1]=build((l+r)/2+1,r,k*2+1);
//	a[k]=((a[k*2]%p)+(a[k*2+1]%p))%p;
    a[k]=a[k*2]+a[k*2+1];
//	return a[k]%p;
    return a[k];
}

long long quy(int x,int y,int l,int r,int k)
{
//	cout<<l<<" "<<r<<endl;
	if(l>=x && r<=y)
	{
//		cout<<"a[k]="<<a[k]<<endl; 
//		return a[k]%p;
		return a[k]; 
	}
	else if(l>y || r<x) return 0;
	else 
	{   
	 	if(biao[k].size())
	 	{
	 	    int t=biao[k].size();
	 	    for(int i=0;i<t;i++)
	 	    {
	 	       biao[2*k].push_back(biao[k][i]);
			   biao[2*k+1].push_back(biao[k][i]);
			   if(biao[k][i].num==1)
			   {
//			   	   a[k*2]=((a[k*2]%p)*(biao[k][i].zhi%p))%p;
//			   	   a[k*2+1]=((a[k*2+1]%p)*(biao[k][i].zhi%p))%p;
				  a[k*2]=(a[k*2]*biao[k][i].zhi);
				  a[k*2+1]=a[k*2+1]*biao[k][i].zhi;
				}	
			   else 
			   {
			   	int xx=(r+l)/2-l+1; 
			   	int xxx=(r-l+1)-xx;
//			   	a[k*2+1]+=((biao[k][i].zhi*xxx)%p);
//			   	a[k*2+1]%=p;
//				a[k*2+1]=(a[k*2+1]%p+(biao[k][i].zhi%p*xxx%p)%p)%p;
				a[k*2+1]+=(biao[k][i].zhi*xxx);
				a[k*2]+=(biao[k][i].zhi*xx);
//			   	a[k*2]+=((biao[k][i].zhi*xx)%p);
//			   	a[k*2]%=p;
//				a[k*2]=(a[k*2]%p+(biao[k][i].zhi%p*xx%p)%p)%p;
				} 
			}
			biao[k].clear();
		}
//		long long sum=0;
		long long k1=quy(x,y,l,(l+r)/2,k*2);
		long long k2=quy(x,y,(l+r)/2+1,r,k*2+1); 
		return k1+k2;
	}
}
long long up(int x,int y,int kk,int l,int r,int k,int num)
{
//	cout<<l<<" "<<r<<"  "<<kk<<endl;
//	cout<<"x="<<x<<" "<<"y="<<y<<endl;
	if(l>=x && r<=y)
	{
	 	node t={num,kk};biao[k].push_back(t);
	 	if(num==2)
	 	{
	 		long long x=(r-l+1)*kk;
	 		a[k]+=x;
//	 		a[k]%=p;
//            a[k]=(a[k]%p+(x%p))%p; 
//	 		cout<<"x="<<x<<endl; 
//	 		return (x%p);
			return x;
		}
		else
		{
			long long x=a[k]*(kk-1);
//			a[k]=(a[k]%p+(x%p))%p; 
            a[k]+=x;
//			cout<<"x="<<x<<endl;
//			return (x%p);
			return x; 
		}
	}
	else if(l>y || r<x ) return 0;
	else
	{
		long long k1=up(x,y,kk,l,(l+r)/2,k*2,num);
		long long k2=up(x,y,kk,(l+r)/2+1,r,k*2+1,num);
		a[k]+=k1+k2;
//		a[k]%=p;
//        a[k]=(a[k]%p+((k1%p)+(k2%p))%p)%p;
		cout<<"k1+k2="<<k1+k2<<endl;
//		return ((k1%p)+(k2%p))%p;
		return k1+k2;
	}
}
int main()
{
	freopen("in.txt","r",stdin);
//	fill(biao1,biao1+200000,1);
	int n,m;
//	int p;
	cin>>n>>m>>p;
//	cout<<n<<" "<<m<<" "<<p<<endl;
	int nn=1;
	while(nn<n)
	nn*=2;
	for(int i=1;i<=n;i++)
	cin>>a[i+nn-1];
	build(1,nn,1);
//	for(int i=1;i<=nn;i++) cout<<a[i]<<" ";
//	cout<<endl;
	for(int i=1;i<=m;i++)
	{
		int x;
		cin>>x;
		if(x==1)
		{
			int s,ss,sss;
			cin>>s>>ss>>sss;
			long long u=up(s,ss,sss,1,nn,1,1);
		}
		else if(x==2)
		{
			int s,ss,sss;
			cin>>s>>ss>>sss;
			long long u=up(s,ss,sss,1,nn,1,2);
		}
		else
		{
			int l,r;
			cin>>l>>r;
			cout<<quy(l,r,1,nn,1)%p<<endl;
		}
	}
//	for(int i=1;i<=nn;i++) cout<<a[i]<<endl;	
 }
2020/11/11 16:56
加载中...