1/15WA 求调QwQ
查看原帖
1/15WA 求调QwQ
1110182
__Cielo__楼主2024/7/18 18:09

求调QwQ,就WA了一个数据点QwQ

#include <iostream>
#include <algorithm>
#include <cmath>
#define N 100005
#define il inline
#define reg register
#define ll long long
using namespace std;
ll S;
ll a[N];
ll ans[N],cnt[N];
ll dp1[N],dp2[N];
struct node
{
	ll pre,next,s;
}nd[N];
struct question
{
	ll l,r,p,pos;
	il bool operator<(const question a)const
	{
		bool t((l-1)/S+1==(a.l-1)/S+1);
		return t?(r-1)/S+1<(a.r-1)/S+1:(l-1)/S+1<(a.l-1)/S+1;
	}
}q[N];
il void ins1(const ll x, const ll s)
{
	ll n=nd[x].next;
	nd[n].pre=x+1;
	nd[x].next=x+1;
	nd[x+1].s=s;
	nd[x+1].pre=x;
	nd[x+1].next=n;
}
il void ins2(const ll x, const ll s)
{
	ll p=nd[x].pre;
	nd[p].next=x-1;
	nd[x].pre=x-1;
	nd[x-1].s=s;
	nd[x-1].pre=p;
	nd[x-1].next=x;
}
il void rmv(const ll x)
{
	nd[nd[x].pre].next=nd[x].next;
	nd[nd[x].next].pre=nd[x].pre;
	nd[x].next=nd[x].pre=0;
}
il void add(const ll x)
{
	ll c=cnt[x];
	nd[c].s-=x;
	if(nd[c].next!=c+1)ins1(c,x);
	else nd[c+1].s+=x;
	if(!nd[c].s)rmv(c);
	cnt[x]++;
}
il void del(const ll x)
{
	ll c(cnt[x]);
	nd[c].s-=x;
	if(nd[c].pre!=c-1&&c>1)ins2(c,x);
	else nd[c-1].s+=x;
	if(!nd[c].s)rmv(c);
	cnt[x]--;
}
il ll qp(const ll x, const ll p){return 1*dp2[x/S]*dp1[x%S]%p;}
int main()
{
	ll n,m;
	ll l=1,r=0;
	cin>>n>>m;
	S=sqrt(n);
	for (reg ll i=1;i<=n;i++)cin>>a[i];
	for (reg ll i=1;i<=m;i++)
	{
		cin>>q[i].l>>q[i].r>>q[i].p;
		q[i].pos=i;
	}
	sort(q+1,q+m+1);
	for(reg ll i=1;i<=m;i++)
	{
		while(l>q[i].l)add(a[--l]);
		while(r<q[i].r)add(a[++r]);
		while(r>q[i].r)del(a[r--]);
		while(l<q[i].l)del(a[l++]);
		dp1[0]=dp2[0]=1;
		for(reg ll j=1;j<=S;j++)
			dp1[j]=2*dp1[j-1]%q[i].p;
		for(reg ll j=1;j<=S;j++)
			dp2[j]=1*dp2[j-1]*dp1[S]%q[i].p;
		for(reg ll j=nd[0].next;j;j=nd[j].next)
			ans[q[i].pos]=(1*ans[q[i].pos]+1*nd[j].s*(qp(q[i].r-q[i].l+1,q[i].p)-qp(q[i].r-q[i].l+1-j,q[i].p))%q[i].p)%q[i].p;
		ans[q[i].pos]=(ans[q[i].pos]+q[i].p)%q[i].p;
	}
	for(reg ll i=1;i<=m;i++)
		cout<<ans[i]<<endl;
	return 0;
}
2024/7/18 18:09
加载中...