社区讨论

求调C

学术版参与者 8已保存回复 22

讨论操作

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

当前回复
22 条
当前快照
1 份
快照标识符
@mmgdnzjx
此快照首次捕获于
2026/03/07 21:47
3 天前
此快照最后确认于
2026/03/09 23:55
11 小时前
查看原帖
all in F了将近50min,但是并没有调出C错误在哪。思路是ST表,查每个间隙,RE
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,q,a[N+5],f[N+5][101],x,logg[N+5];
int max(int xx,int yy){
	return (xx>yy)?xx:yy;
}int min(int xx,int yy){
	return (xx<yy)?xx:yy;
}
int work(int xx,int yy){
	int k=logg[yy-xx+1];
	return min(f[xx][k],f[yy-(1<<k)+1][k]);
}
signed main(){
	scanf("%d%d",&n,&q);
    logg[0]=-1;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		logg[i]=logg[i>>1]+1;
        f[i][0]=a[i];
	}for(int j=1;j<=logg[n];j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}while(q--){
		int k,last=0,minn=2*1e9;
		scanf("%d",&x);
		for(int i=1;i<=x+1;i++){
			if(i<=x) scanf("%d",&k);
			else k=n+1;
			if(k==last+1){
				last=k;
				continue;
			}
			//cout << k << ' ' << last << endl;
			if(k==last+3){
				minn=min(minn,min(a[k-1],last+1));
			}else minn=min(minn,work(k-1,last+1));
			last=k;
		}cout << minn << endl;
	}
}

回复

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

正在加载回复...