萌新求助
查看原帖
萌新求助
138349
银翼的魔术师楼主2021/2/5 19:20

不知道是写错了还是常数丑了,求大佬帮忙看看。 求助

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<utility>
#include<bitset>
#include<cstdio>
#include<string>
#include<time.h>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef unsigned long long ull;
typedef __uint128_t L;
struct FastMod {
    ull b, m;
    FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
    ull reduce(ull a) {
        ull q = (ull)((L(m) * a) >> 64);
        ull r = a - q * b;
        return r >= b ? r - b : r;
    }
};
FastMod F(2);
const int N=1e6+5,M=2e4;
int a[N],w[N],b,h[N],t[N],d,S,T;
long long g[M],e[M],an[N],s[M];
struct query{
	int l,r,f,b;
	long long p;
}q[N];
char bu[1<<24];
inline char get()
{
    if(S==T)
    {
        S=0;
        T=fread(bu,1,1<<24,stdin);
        if(S==T)
            return EOF;
    }
    return bu[S++];
}
int read()
{
	int x=0;
	char c;
	do
		c=get();
	while(c<'0'||'9'<c);
	while('0'<=c&&c<='9')
	{
		x=(x<<3)+(x<<1)+(c^48);
		c=get();
	}
	return x;
}
bool cmp(query x,query y)
{ 
	if(x.f==y.f)
	{
		if(x.f&1)
			return x.r>y.r;
		return x.r<y.r;
	}
	return x.f<y.f;
}
void move(int x,bool v)
{
	if(w[a[x]]>b)
	{
		t[h[a[x]]]=t[a[x]];
		h[t[a[x]]]=h[a[x]];
		if(d==a[x])
			d=t[a[x]];
	}
	else
		s[w[a[x]]]-=a[x];
	if(v)
		w[a[x]]++;
	else
		w[a[x]]--;
	if(w[a[x]]>b)
	{
		t[a[x]]=d;
		h[d]=a[x];
		d=a[x];
	}
	else
		s[w[a[x]]]+=a[x];
}
long long em(int x)
{
	return F.reduce(g[x/b]*e[x%b]);
}
int main()
{
	int n,m,l,r;
	n=read(),m=read();
	for(int i=0;i<n;i++)
		a[i]=read();
	b=2*sqrt((double)n);
	for(int i=1;i<=m;i++)
	{
		q[i].l=read(),q[i].r=read(),q[i].p=read();
		q[i].l--,q[i].r--;
		q[i].f=q[i].l/b;
		q[i].b=i;
	}
	sort(q+1,q+m+1,cmp);
	l=q[1].l,r=q[1].l-1;
	for(int i=1;i<=m;i++)
	{
		while(l>q[i].l)
			move(--l,1);
		while(r>q[i].r)
			move(r--,0);
		while(r<q[i].r)
			move(++r,1);
		while(l<q[i].l)
			move(l++,0);
		e[0]=1;
		for(int j=0;j<b;j++)
		{
			e[j+1]=e[j]<<1;
			if(e[j+1]>q[i].p)
				e[j+1]-=q[i].p;
		}
		g[0]=1;
		if(q[i].p==1)
			an[q[i].b]=0;
		else
		{
			F=FastMod(q[i].p);
			for(int j=0;b*(j+1)<=n;j++)
				g[j+1]=F.reduce(g[j]*e[b]);
			for(int j=1;j<=b;j++)
				an[q[i].b]=F.reduce(an[q[i].b]+s[j]*(q[i].p+em(r-l+1)-em(r-l+1-j)));
			for(int j=d;j;j=t[j])
				an[q[i].b]=F.reduce(an[q[i].b]+j*(q[i].p+em(r-l+1)-em(r-l+1-w[j])));
		}
	}
	for(int i=1;i<=m;i++)
		printf("%d\n",(int)an[i]);
}
2021/2/5 19:20
加载中...