12.23模拟赛

T1

正解:莫反推导出来的整除分块,证明不会:

然后直接快速幂来算是 O(m·logn) 的,过不了剩下三个点。考虑到模数很小且为质数,用费马小定理预处理幂次然后去算,复杂度 O(10007·logn+m),注意字符串处理 n

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1145140,M=1919810,mod=10007;
ll n,m,num[N];
ll qpow(ll a,ll b){
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
ll ans=0,l=1,r;
int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(0); cout.tie(0);
	char c;
	while((c=getchar())!=' ') n=(n*10+c-'0')%(mod-1);
	cin>>m;
	for(int i=0;i<mod;++i) num[i]=qpow(i,n);
	for( ;l<=m; ){
		//cout<<"QWQ";
		r=m/(m/l);
		ans+=num[m/l%mod]*(r-l+1)%mod;
		ans%=mod;
		l=r+1;
	}
	cout<<ans%mod;
	return 0;
}

T2

贪心假了,还忘记输出小数点了,宝玲。看不懂题解。

T3

正解树套树,wyc用分块切了,强。
麻了我这写得应该是对的啊,为啥一直RE?不管了先放这里,顺便搞到了第 4e4 条评测。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define in inline
const ll N=100010,M=30010;
ll MIN(ll a,ll b){return a<=b?a:b;}
ll sub,n,k,Q,o,las;
ll a[N],v[N],lg[N],val[N];
ll stmax[N][22],stmin[N][22];
ll bel[M],st[M],ed[M],siz[M],nq,ns;
ll query_max(ll l,ll r){
	ll k=lg[r-l+1];
	return max(stmax[l][k],stmax[r-(1<<k)+1][k]);
}
ll query_min(ll l,ll r){
	ll k=lg[r-l+1];
	return min(stmin[l][k],stmin[r-(1<<k)+1][k]);
}
ll c[N];
ll lowbit(ll x){return x&-x;}
void add(ll x){
	while(x<=n){
		++c[x];
		x+=lowbit(x);
	}
}
ll query(ll x){
	ll ans=0;
	while(x){
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}
struct xx{
	ll a,b;
	bool operator <(const xx &lxl)const{
		return b<lxl.b;
	}
}bl[131][911];
ll b[131][911],stl[131][911][12];
void build(ll x){
	ll cnt=0;
	for(int i=st[x];i<=ed[x];++i) bl[x][++cnt]=(xx){val[i],a[i]};
	sort(b[x]+1,b[x]+cnt+1);
	for(int i=1;i<=cnt;++i) b[x][i]=bl[x][i].b;
	for(int i=1;i<=cnt;++i) stl[x][i][0]=bl[x][i].a;
	for(int j=1;j<11;++j)
		for(int i=1;i<=cnt;++i)
			stl[x][i][j]=max(stl[x][i][j-1],stl[x][min(n,i+(1<<(j-1)))][j-1]);
}
ll query_bl(ll x,ll l,ll r){
	ll k=lg[r-l+1];
	return max(stl[x][l][k],stl[x][r-(1<<k)+1][k]);
}
ll query_ans(ll l,ll r,ll x,ll y){
	ll ans=0;
	if(bel[l]==bel[r]){
		for(int i=l;i<=r;++i)
			if(a[i]>=x&&a[i]<=y)
				ans=max(ans,val[i]);
		return ans;
	}
	for(int i=l;i<=ed[bel[l]];++i)
		if(a[i]>=x&&a[i]<=y) ans=max(ans,val[i]);
	for(int i=st[bel[r]];i<=r;++i)
		if(a[i]>=x&&a[i]<=y) ans=max(ans,val[i]);
	for(int i=bel[l]+1;i<bel[r];++i){
		ll vl,vr;
		vl=lower_bound(b[i]+1,b[i]+siz[i]+1,x)-v;
		vr=upper_bound(b[i]+1,b[i]+siz[i]+1,y)-v-1;
		if(vl<=vr) ans=max(ans,query_bl(i,vl,vr));
	}
	return ans;
}
int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(0); cout.tie(0);
	cin>>sub>>n>>k>>Q>>o;
	for(int i=1;i<=n;++i) cin>>a[i],v[i]=a[i];
	ns=900,nq=n/ns+(n%ns!=0);
	for(int i=1;i<=nq;++i){
		st[i]=ns*(i-1)+1,ed[i]=MIN(ns*i,n);
		for(int j=st[i];j<=ed[i];++j)
			bel[j]=i;
		siz[i]=ed[i]-st[i]+1;
	}
	for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
	sort(v+1,v+n+1);
	ll nm=unique(v+1,v+n+1)-v-1;
	for(int i=1;i<=n;++i)
		a[i]=lower_bound(v+1,v+nm+1,a[i])-v;
	for(int i=1;i<=n;++i) stmax[i][0]=stmin[i][0]=a[i];
	for(int j=1;j<20;++j)
		for(int i=1;i<=n;++i)
			stmax[i][j]=max(stmax[i][j-1],stmax[min(n,i+(1<<(j-1)))][j-1]),
			stmin[i][j]=min(stmin[i][j-1],stmin[min(n,i+(1<<(j-1)))][j-1]);
	for(int i=n;i>=1;--i){
		add(a[i]); ll l,r;
		l=lower_bound(v+1,v+nm+1,v[a[i]]-k)-v;
		r=upper_bound(v+1,v+nm+1,v[a[i]]+k)-v-1;
		val[i]=query(r)-query(l-1); //强 
	}
	for(int i=1;i<=nq;++i) build(i);
	while(Q--){
		ll t,x,y,maxn,minn,vl,vr;
		cin>>t>>x>>y;
		if(o==1) t^=las,x^=las,y^=las;
		minn=query_min(x,y),maxn=query_max(x,y);
		vl=lower_bound(v+1,v+nm+1,v[maxn]-k)-v;
		vr=upper_bound(v+1,v+nm+1,v[minn]+k)-v-1;
		if(vl>vr||t>x){cout<<(las=0)<<'\n';continue;}
		las=query_ans(t,x,vl,vr);
		cout<<las<<'\n';
	}
	return 0;
}
posted @   和蜀玩  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示