求 subtack1 范围 hack 数据,对拍了 1w 份无果
查看原帖
求 subtack1 范围 hack 数据,对拍了 1w 份无果
803885
_8008008楼主2025/8/2 18:31
#include<iostream>
#include<algorithm>
#define block_len 1
using namespace std;
const int maxn=100002,mod=998244353;
int n,a[maxn];
pair<int,bool>b[maxn];
bool use[maxn];
int maxx[maxn],maxp[maxn],num[maxn],len;
int l(int x){return block_len*(x-1)+1;}
int r(int x){int y=block_len*x;return y>n?n:y;}
void rebuild_block(int x){
	int maxxx=-1,maxpp,cnt=0;
	for(int i=l(x);i<=r(x);i++){
		if(!use[i])cnt++;
		if(maxxx<a[i]&&!use[i])maxxx=a[i],maxpp=i;
	}
	maxx[x]=maxxx,maxp[x]=maxpp,num[x]=cnt;
}
void init(){
	len=n/block_len+((n%block_len)!=0);
	for(int i=1;i<=len;i++)rebuild_block(i);
}
pair<int,bool>find(){
	int i=1,maxxx=-1,maxpp,block;
	for(;i<=len&&r(i)<=n;i++){
		if(maxxx<maxx[i]){
			maxxx=maxx[i],maxpp=maxp[i],block=i;
		}
	}
	for(int j=l(i);j<=n;j++){
		if(maxxx<a[j])maxxx=maxx[i],maxpp=j,block=i;
	}
	//找出最大值及其坐标和所在区块 
	bool flag=false;
	for(int j=1;j<block;j++)if(num[j]!=0)flag=true;
	for(int j=l(block);j<maxpp;j++){
		if(!use[j])flag=true;
	}
	use[maxpp]=true;
	rebuild_block(block);
	return make_pair(maxpp,flag);
}
int f[maxn];bool g[maxn],fir[maxn];
int may[maxn],tlen[maxn];
int sol(int x){//正在处理第i次 
	if(x==n)return f[x]=1;
	pair<int,bool>res=find();
	g[res.first]=res.second;
	return f[x]=((res.second?2:1)*sol(x+1))%mod;
}
int qpow(int x){//2的次幂 
	if(x==0)return 1; 
	if(x==1)return 2;
	int y=qpow(x/2);
	return ((y*y)%mod)*(x%2?2:1)%mod;
}
struct cmp{
	bool operator()(pair<int,bool>cmp1,pair<int,bool>cmp2){
		return cmp1.first>cmp2.first;
	}
};
int main(){
//	freopen("out.txt","r",stdin);
//	freopen("AC.txt","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	init();sol(1);
//	for(int i=1;i<=n;i++){
//		cout<<g[i]<<' ';
//	}
//	cout<<'\n';
//	for(int i=1;i<=n;i++){
//		cout<<a[i]<<' ';
//	}
//	cout<<'\n';
	for(int i=1;i<=n;i++){
		b[i]=make_pair(a[i],g[i]);
	}
	sort(b+1,b+1+n,cmp());
//	for(int i=1;i<=n;i++){
//		cout<<b[i].first<<' ';
//	}
//	cout<<'\n';
//	for(int i=1;i<=n;i++){
//		cout<<b[i].second<<' ';
//	}
//	cout<<'\n';
	for(int i=1;i<=n;i++){
		fir[i]=true;int j=i;
		while(true){
			if(b[j].first!=b[i].first)break;
			if(j==n+1)break;
			if(b[j].second)may[i]++;
//			cout<<j<<' ';
			tlen[i]++,j++;
		}
//		cout<<b[i].first<<' '<<may[i]<<'\n';
		i=j-1;
	}
	for(int i=n;i>=1;i--){
		if(!fir[i])continue;
		if(i+tlen[i]<=n){
			f[i]-=f[i+tlen[i]]*(qpow(may[i])-may[i]-1);
//			cout<<i<<' '<<i+tlen[i]<<' '<<f[i]<<'\n';
		}
	}
	cout<<f[1];
	return 0;
}
2025/8/2 18:31
加载中...