社区讨论

60 分求助

P14507缺零分治 mexdnc参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi0vdun2
此快照首次捕获于
2025/11/16 06:40
4 个月前
此快照最后确认于
2025/11/17 09:13
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define mp(a,b) make_pair(a,b)
using namespace std;

/*
刚刚我错过的大雨 握不住的盛夏 
飘过的云是你吗 一圈又一圈 
我多想是路过 你的风
忍不住 落回你眼中 

凭什么绕不开 翻不过的盛夏 
有些远方 让风代替我们抵达 
没勇气说完的那句话 
希望有人听过它  
*/

inline int read(){
	int a=0,b=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')	b=-1;
		c=getchar();
	}
	while(isdigit(c)){
		a=(a<<1)+(a<<3)+(c-'0');
		c=getchar();
	}
	return a*b;
} 
inline void write(int x){
	if(x<0)	putchar('-'),x=-x;
	if(x>=10)	write(x/10);
	putchar(x%10+48); 
}
inline void write1(int x){
	write(x),putchar(' ');
}
inline void write2(int x){
	write(x),putchar('\n');
}

const int N=114514;
struct node{
	int id;
	int sum;
	friend bool operator <(node a,node b){
		return a.sum<b.sum;
	}
}query[N];
int include13[N]; 

int a[N],b[N],b1[N],b2[N],b3[N],b4[N]; 

int n,q;

int cnt=0;

int T;
void solve(){
//	cout<<'!'<<T<<endl;
	n=read(),q=read();
	a[0]=-1;	//又一强大做法! 
	b[0]=1e18; 
	for(int i=1;i<=n;i++){
		a[i]=read(),b[i]=read();
		if(a[i]==a[i-1]+1){
			b[i]=min(b[i],b[i-1]);
		}
		else	b[i]=0;	//因为有很多都是无效的  
	}
//	if(T==3){
//		for(int i=1;i<=n;i++){
//			cout<<'*'<<a[i]<<' '<<b[i]<<endl;
//		}
//		cout<<endl;
//	}
//	cout<<"谭总的世界-031"<<endl;
//	for(int i=1;i<=n;i++){
//		cout<<b[i]<<' ';
//	} 
//	cout<<endl;
	int min_=0;
	for(int i=n;i>=1;i--){
		b1[i]=b[i]-b[i+1];	//代表目前的情况!!!!!  
		b2[i]=b1[i]*(a[i]+1);	//代表现在的这里的值 
		b3[i]=b3[i+1]+b2[i];	//后缀和  
		b4[i]=b4[i+1]+b1[i];
		if(b[i]!=0){
			min_=a[i]+1;	//有解的最小值  
		}
	}
	int max_=0;
	for(int i=1;i<=n;i++){
		if(b1[i]!=0){
			max_=a[i]+1;
		}
	}
//	cout<<'$'<<min_<<endl;
//	cout<<'^'<<b3[1]<<endl;
//	cout<<"谭总的世界-042"<<endl;
//	for(int i=1;i<=n;i++){
//		cout<<b1[i]<<' ';
//	}
//	cout<<endl;
	for(int i=1;i<=q;i++){
		query[i].sum=read(),query[i].id=i;
		cnt++;
//		if(cnt==253865){
//			cout<<'$'<<query[i].sum<<endl;
//			for(int j=1;j<=n;j++){
//				cout<<'!'<<a[j]<<' '<<b[j]<<endl;
//			}
////			cout<<'#'<<T<<endl;
//		}
	} 
	stable_sort(query+1,query+q+1);
//	cout<<'&'<<min_<<endl;
//	cout<<"谭总的世界-009"<<endl;
	int idx=n+1;
	for(int i=1;i<=q;i++){
//		cout<<"谭总的世界-053"<<endl;
		if(query[i].sum<min_){
			include13[query[i].id]=-1;
//			cout<<"谭总的世界-033"<<endl;
			continue;
		}
//		cout<<'&'<<query[i].sum<<' '<<b3[1]<<endl; 
		if(query[i].sum>b3[1]){
			include13[query[i].id]=-1;
//			cout<<"谭总的世界-037"<<endl;
			continue;
		}
//		cout<<"谭总的世界-002"<<endl;
		while(1){
			if(idx==1)	break;
			if(b3[idx-1]<=query[i].sum)	idx--;
			else	break;
		}
//		cout<<'#'<<query[i].id<<' '<<query[i].sum<<' '<<idx<<endl;
		int x=query[i].sum-b3[idx];	//x 代表剩余未被分的部分  
		int y=0;
		if(idx!=1)	y=(x/(a[idx-1]+1))+(x%(a[idx-1]+1)!=0);
		include13[query[i].id]=max(y+b4[idx],1ll);
//		cout<<'#'<<idx<<endl;
		if(include13[query[i].id]==1){
			if(query[i].sum!=max_)	include13[query[i].id]=2;
		}
	}
//	cout<<"谭总的世界-046"<<endl;
	for(int i=1;i<=q;i++){
		write2(include13[i]); 
	} 
	return;
}
#undef int
int main(){
//	freopen("mexdnc.in","r",stdin);
//	freopen("mexdnc.out","w",stdout);
	T=read();
	while(T--)	solve();
//	putchar('\n');
	return 0;
} //一定要挽回罗琪钧的遗憾啊,一定会挽回罗琪钧的遗憾的! 

回复

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

正在加载回复...