answer too sort on line 2 求助
查看原帖
answer too sort on line 2 求助
251130
Exber楼主2021/5/29 11:06

rt,感觉没什么错误啊!

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long long ll;

struct ask
{
	int l,lx,r,id,p;
}pro[100005];

class ckjlist
{
	public:
		struct node
		{
			int nxt,fro;
		}dat[100005];
		int tai;
		ckjlist(){tai=0;}
		void ins(int x)
		{
			dat[tai].nxt=x;
			dat[x].fro=tai;
			dat[x].nxt=0;
			tai=x;
		}
		void del(int x)
		{
			if(x!=tai)
			{
				dat[dat[x].fro].nxt=dat[x].nxt;
				dat[dat[x].nxt].fro=dat[x].fro;
			}
			else
			{
				dat[dat[tai].fro].nxt=0;
				tai=dat[tai].fro;
			}
			dat[x].fro=0;
			dat[x].nxt=0;
		}
}lis;

int n,m,lpos=1,rpos,a[100005],cnt[100005];
ll sum[100005],out[100005],poww[2][100005];
int blo;

inline int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
		{
			w=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		s=(s<<1)+(s<<3)+ch-'0';
		ch=getchar();
	}
	return s*w;
}

inline bool cmp(ask &x,ask &y)
{
	if(x.lx==y.lx)
	{
		return x.r<y.r;
	}
	return x.lx<y.lx;
}

inline void initpow(int mod)
{
	poww[0][0]=1;
	poww[1][0]=1;
	for(int i=1;i<=blo;i++)
	{
		poww[0][i]=poww[0][i-1]<<1;
		poww[0][i]%=mod;
	}
	for(int i=1;i<=blo;i++)
	{
		poww[1][i]=poww[0][blo]*poww[1][i-1];
		poww[1][i]%=mod;
	}
}

inline ll getpow(int x,int mod)
{
	return (poww[0][x%blo]*poww[1][x/blo])%mod;
}

inline void add(int x,int k)
{
	int num=a[x];
	if((sum[cnt[num]]-=num)==0)
	{
		lis.del(cnt[num]);
	}
	if(sum[cnt[num]+=k]==0)
	{
		lis.ins(cnt[num]);
	}
	sum[cnt[num]]+=num;
}

int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	blo=sqrt(n);
	for(int i=1;i<=m;i++)
	{
		pro[i].l=read();
		pro[i].r=read();
		pro[i].p=read();
		pro[i].id=i;
		pro[i].lx=(pro[i].l-1)/blo+1;
	}
	sort(pro+1,pro+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int nl=pro[i].l,nr=pro[i].r,np=pro[i].p;
		int len=nr-nl+1;
		initpow(np);
		while(lpos<nl) add(lpos++,-1);
		while(lpos>nl) add(--lpos,1);
		while(rpos>nr) add(rpos--,-1);
		while(rpos<nr) add(++rpos,1);
		for(int j=lis.dat[0].nxt;j;j=lis.dat[j].nxt)
		{
			ll pre=((getpow(len,np)-getpow(len-j,np)+np)*sum[j]+np)%np;
			out[pro[i].id]=(out[pro[i].id]+pre+np)%np;
		}
	}
	for(int i=1;i<=m;i++)
	{
		printf("%lld\n",out[i]);
	}
	return 0;
}
2021/5/29 11:06
加载中...