话说真的没有人用分块吗?
查看原帖
话说真的没有人用分块吗?
379779
指挥的智慧楼主2023/10/6 23:56

分块100,不加强一下数据吗?

#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int xx=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){
		xx=xx*10+ch-'0';
		ch=getchar();
	}
	return xx;
}
int n,m,w[1000006]; 
int d,s,t;
int block=1,len;
int l[1003],r[1003],mn[1003],js[1003];
int pos[1000006];
inline int min(const int &a,const int &b){
	return a<b?a:b;
}
int main(){
	memset(mn,0x3f,sizeof(mn));
	n=rd(),m=rd();
	for(int i=1;i<=n;i++)w[i]=rd();
	block=len=sqrt(n);
	for(int i=1;i<=len;i++){
		l[i]=r[i-1]+1;r[i]=l[i]+len-1;
		for(int j=l[i];j<=r[i];j++){
			pos[j]=i;mn[i]=min(mn[i],w[j]);
		}
	}
	if(r[block]<n){
		++block;
		l[block]=r[block-1]+1;
		r[block]=n;
		for(int j=l[block];j<=n;j++){
			pos[j]=block;
			mn[block]=min(mn[block],w[j]);
		}
	}
	//for(int i=1;i<=block;i++)printf("%d %d\n",l[i],r[i]);
	for(int i=1;i<=m;i++){
		d=rd(),s=rd(),t=rd();
		if(pos[s]>=pos[t]-1){
			for(int j=s;j<=t;j++){
				w[j]-=d;
				if(w[j]-js[pos[j]]<0){
					printf("-1\n%d",i);
					return 0;
				}
				mn[pos[j]]=min(mn[pos[j]],w[j]);
			}
		}
		else{
			for(int j=s;j<=r[pos[s]];j++){
				w[j]-=d;
				if(w[j]-js[pos[j]]<0){
					printf("-1\n%d",i);
					return 0;
				}
				mn[pos[j]]=min(mn[pos[j]],w[j]);
			}
			for(int j=l[pos[t]];j<=t;j++){
				w[j]-=d;
				if(w[j]-js[pos[j]]<0){
					printf("-1\n%d",i);
					return 0;
				}
				mn[pos[j]]=min(mn[pos[j]],w[j]);
			}
			for(int j=pos[s]+1;j<=pos[t]-1;j++){
				js[j]+=d;
				if(js[j]>mn[j]){
					printf("-1\n%d",i);
					return 0;
				}
			}
		}
	}
	printf("0");
	return 0;
}
//80(无)  100(O2)
2023/10/6 23:56
加载中...