请求卡常
查看原帖
请求卡常
372238
lct201714楼主2024/11/3 21:21

94pts 难以通过

#include<bits/stdc++.h>
#define rint register int
#define ll long long
#define For(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=1e5+5;
template <class T>
inline void read(T &res){
	char c;bool f=0;
	while(!isdigit(c=getchar())) if(c=='-') f=1;
	res=(c^48);
	while(isdigit(c=getchar())) res=(res<<1)+(res<<3)+(c^48);
	if(f) res=~res+1;
}
template <class T>
inline void Print(T x){
    if(x<0) putchar('-'), x=-x;
    if(x>9) Print(x/10);
    putchar(x%10+48);
}
int n,m,B,a[N],b[N];
struct Query{
	int id,l,r; ll p;
	bool operator < (const Query &tmp) const { return l/B==tmp.l/B?r<tmp.r:l/B<tmp.l/B;} 
}q[N];
struct Node{
	int pre,nxt;
}nod[N];
int tot=0;
void insert(int x){
	nod[tot].nxt=x;
	nod[x].pre=tot;
	tot=x;
}
void erase(int x){
	if(x!=tot){
		nod[nod[x].pre].nxt=nod[x].nxt;
		nod[nod[x].nxt].pre=nod[x].pre;
	}
	else{
		nod[nod[x].pre].nxt=0;
		tot=nod[x].pre;
	} 
	nod[x]=(Node){0,0};
}
int cnt[N];
ll sum[N],ans[N];
inline void add(int x){ 
	if(cnt[x]){ 
		sum[cnt[x]]-=x;
		if(!sum[cnt[x]]) erase(cnt[x]);
	}
	cnt[x]++;
	if(!sum[cnt[x]]) insert(cnt[x]);
	sum[cnt[x]]+=x;
}
inline void del(int x){ 
	sum[cnt[x]]-=x;
	if(!sum[cnt[x]]) erase(cnt[x]);
	cnt[x]--;
	if(cnt[x]){ 
		if(!sum[cnt[x]]) insert(cnt[x]);
		sum[cnt[x]]+=x;
	}
} 
int Size;
ll pow1[N],pow2[N];
ll calc(ll x,ll mod){return (pow1[x%Size]*pow2[x/Size])%mod;} 
void solve(){
	int l=1,r=0;
	sort(q+1,q+m+1);
	For(i,1,m){ 
		const Query &que=q[i];
		const ll mod=q[i].p;
		while(l>que.l) add(a[--l]);
		while(r<que.r) add(a[++r]);
		while(l<que.l) del(a[l++]);
		while(r>que.r) del(a[r--]);
		int t=r-l+1; 
		
		pow1[0]=pow2[0]=1;
		for(int i=1;i<=Size;i++) pow1[i]=pow1[i-1]*2%mod;
		for(int i=1;i<=Size;i++) pow2[i]=pow2[i-1]*pow1[Size]%mod;
		
		for(int j=nod[0].nxt;j;j=nod[j].nxt){ 
			ll a1=calc(t,mod), a2=calc(t-j,mod);
			ans[que.id]=(ans[que.id]+sum[j]*(a1-a2+mod)%mod)%mod;
		}
//		ans[que.id]=(ans[que.id]%mod+mod)%mod;
	}
}
signed main(){
	read(n),read(m); 
	B=Size=320; 
	For(i,1,n) read(a[i]);
	For(i,1,m){ 
		int l,r;ll p; read(l),read(r),read(p);
		q[i]=(Query){i,l,r,p};
	}
	solve();
	For(i,1,m) Print(ans[i]),putchar('\n');
	return 0;
} 

#9总是挂 记录

2024/11/3 21:21
加载中...