社区讨论

卡常

P14638[NOIP2025] 序列询问参与者 9已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mlmhw7fc
此快照首次捕获于
2026/02/14 23:52
5 天前
此快照最后确认于
2026/02/18 22:15
14 小时前
查看原帖
铸币题目,卡你吗的常呢。
不是为啥这题也要卡我啊。有高人指点一下代码哪里常数大了吗。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef unsigned long long ul;
const int N=1e5+5,V=1e5,R=16;
const int inf=1e10+15;
struct st1{
	vector<int> f[20],g[20];
	void init(int n,int a[]){
		for(int j=0;j<=R;j++){
			f[j].resize(n+5);
			g[j].resize(n+5);
		}
		for(int i=0;i<=n;i++){
			f[0][i]=g[0][i]=a[i];
		}
		for(int j=1;j<=R;j++){
			for(int i=0;(i+(1<<j)-1)<=n;i++){
				f[j][i]=max(f[j-1][i],f[j-1][i+(1<<(j-1))]);
				g[j][i]=min(g[j-1][i],g[j-1][i+(1<<(j-1))]);
			}
		}
	}
	int que_max(int x,int y){
		if(x>y) return -inf;
		int w=log2(y-x+1);
		return max(f[w][x],f[w][y-(1<<w)+1]);
	}
	int que_min(int x,int y){
		if(x>y) return inf;
		int w=log2(y-x+1);
		return min(g[w][x],g[w][y-(1<<w)+1]);
	}
}t,k[N];
int n,a[N],s[N],q,f[20][N],g[N][20];
int ans[N],res[N],rc[N];
vector<pair<int,int>> rg;
void sol(int x,int l,int r,int res[]){
	if(x==0){
		for(int i=1;i<=n;i++){
			res[i]=a[i];
		}
		return;
	}
	memset(res,-0x3f,sizeof(res[0])*(N-2));
	vector<pair<int,int>> seg;
	int len1=(1<<(x-1));
	for(int i=1;(i+len1-1)<=n;i+=len1){
		int j=i+2*len1-1;
		seg.push_back({i,j});
	}
	int len2=(1<<x);
	for(int i=1;(i+len2-1)<=n;i+=len2){
		int j=i+2*len2-1;
		seg.push_back({i,j});
	}
	for(auto [i,j]:seg){
		int m=(i+j)>>1;
		for(int k=i;k<=j;k++){
			rc[k]=-inf;
		}
		for(int k=i;k<=m;k++){
			if(k!=i) rc[k]=rc[k-1];
			int w=t.que_max(max(m+1,k+l-1),min(j,k+r-1))-s[k-1];
			rc[k]=max(rc[k],w);
		}
		for(int k=j;k>=m+1;k--){
			if(k!=j) rc[k]=rc[k+1];
			int w=s[k]-t.que_min(max(i,k-r+1)-1,min(m,k-l+1)-1);
			rc[k]=max(rc[k],w);	
		}
		for(int k=i;k<=j;k++){
			res[k]=max(res[k],rc[k]);
		}
	}
}
signed main(){
//	freopen("query.in","r",stdin);
// 	freopen("query.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=a[i]+s[i-1];
	}
	for(int i=n+1;i<=V;i++){
		a[i]=-inf;
		s[i]=a[i]+s[i-1];
	}
	t.init(V,s);
	for(int j=0;j<=R;j++){
		if(j==0){
			sol(j,1,1,f[j]);
			rg.push_back({1,1});
		}
		else{
			sol(j,((1<<(j-1))+1),(1<<j),f[j]);
			rg.push_back({((1<<(j-1))+1),(1<<j)});
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=R;j++){
			g[i][j]=f[j][i];
		}
		k[i].init(R,g[i]);
	}
	cin>>q;
	while(q--){
		memset(ans,-0x3f,sizeof(ans));
		int l,r;
		cin>>l>>r;
		int mn=inf,mx=0,tg=0;
		for(int k=0;k<(int)rg.size();k++){
			auto [x,y]=rg[k];
			if(l<=x&&x<=y&&y<=r){
				mn=min(mn,k);
				mx=max(mx,k);
				tg=1;
				continue;
			}
			if(max(l,x)<=min(r,y)){
				sol(k,max(l,x),min(r,y),res);
				for(int i=1;i<=n;i++){
					ans[i]=max(ans[i],res[i]);
				}
			}
		}
		if(tg){
			for(int i=1;i<=n;i++){
				int w=k[i].que_max(mn,mx);
				ans[i]=max(ans[i],w);
			}
		}
		ul sc=0;
		for(int i=1;i<=n;i++){
			sc^=(ul)ans[i]*(ul)i;
		}
	 	cout<<sc<<"\n";
	}
}

回复

12 条回复,欢迎继续交流。

正在加载回复...