萌新求助 /kel
查看原帖
萌新求助 /kel
521276
张凯_巨大楼主2022/1/5 21:01

就我一个小丑wa成了12分。

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
int n,m;
int cnt;
int bl;
int l[100010],r[100010],p[100010],ans[100010];
int vl[100010],v2[100010],v3[100010];
int n2;
int d[100010],id[100010];
bool cmp(int x,int y)
{
	if(l[x]/bl!=l[y]/bl)
	{
		return l[x]/bl<l[y]/bl;
	}
	return ( ((l[x]/bl)&1) ? (r[x]<r[y]) : (r[x]>r[y]) );
}
bool cmp2(int x,int y)
{
	return vl[x]<vl[y];
}
int L,R;
int m2[100010];
int s[100010],s2[100010];
int vm[100010],mv[100010],vn;
int vs[100010];
void update(int x)
{
    if(vm[v2[x]])
    {
        vs[v2[x]]++;
        return;
    }
    s[s2[v2[x]]]-=vl[x];
    s2[v2[x]]++;
    s[s2[v2[x]]]+=vl[x];
}
void downdate(int x)
{
    if(vm[v2[x]])
    {
        vs[v2[x]]--;
        return;
    }
    s[s2[v2[x]]]-=vl[x];
    s2[v2[x]]--;
    s[s2[v2[x]]]+=vl[x];
}
signed main()
{
	cin>>n>>m;
	bl=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin>>vl[i];
		id[i]=i;
	}
	sort(id+1,id+n+1,cmp2);
	for(int i=1;i<=m;i++)
	{
		cin>>l[i]>>r[i]>>p[i];
		d[i]=i;
	}
	sort(d+1,d+m+1,cmp);
	int js=0;
	for(int i=1;i<=n;i++)
	{
		if(vl[id[i]]!=vl[id[i-1]])
		{
		    cnt+=vl[id[i]];
		    if(js>bl)
            {
                vm[n2]=1;
                mv[++vn]=n2;
            }
			n2++;
			v2[id[i]]=n2;
			v3[n2]=vl[id[i]];
			js=1;
		}
		else
		{
			v2[id[i]]=v2[id[i-1]];
			js++;
		}
	}
	if(js>bl)
    {
        vm[js]=1;
        mv[++vn]=n2;
    }
    s[0]=cnt;
	L=1,R=0;
	for(int k=1;k<=m;k++)
	{
		int il=l[d[k]],ir=r[d[k]],ip=p[d[k]];
		m2[0]=1;
		for(int j=1;j<=bl;j++)
		{
			m2[j]=m2[j-1]*2%ip;
		}
		for(int j=2;j*bl<=n;j++)
		{
			m2[j*bl]=m2[j*bl-bl]*m2[bl]%ip;
		}
		while(il<L)
        {
            L--;
            update(L);
        }
        while(R<ir)
        {
            R++;
            update(R);
        }
        while(il>L)
        {
            downdate(L);
            L++;
        }
        while(R>ir)
        {
            downdate(R);
            R--;
        }
        int ll=R-L+1;
        ans[d[k]]=cnt%ip*m2[ll%bl]%ip*m2[ll/bl*bl]%ip;
        for(int i=0;i<=bl;i++)
        {
        	if(ll<i)
        	{
        		break;
			}
            ans[d[k]]=(ans[d[k]]-s[i]%ip*m2[(ll-i)%bl]%ip*m2[(ll-i)/bl*bl]%ip+ip)%ip;
        }
        for(int i=1;i<=vn;i++)
        {
            ans[d[k]]=(ans[d[k]]-m2[(ll-vs[i])%bl]*m2[(ll-vs[i])/bl*bl]%ip*v3[mv[i]]%ip+ip)%ip;
        }
	}
	for(int i=1;i<=m;i++)
	{
		cout<<ans[i]<<endl;
	}
	return 0;
}
2022/1/5 21:01
加载中...