社区讨论

80pts,wa1,3,13,14玄关求条

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

讨论操作

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

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

int t,n,q,qz[100010];
int ans[100010];

struct node{
	int a,b;//b个a; 
}l[100010];
struct ask{
	int cnt,k;
}m[100010];

bool cmp(ask x,ask y){
	return x.k<y.k;
}

signed main( ){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&q);
		qz[0]=LONG_LONG_MAX;
		l[0].a=-1;
		int nn=0;
		for(int i=1;i<=n;i++){
			scanf("%lld%lld",&l[i].a,&l[i].b);
			if(nn!=0) continue;
			if(l[i].a!=l[i-1].a+1){
				nn=i-1;
			}
			qz[i]=min(qz[i-1],l[i].b);
		}
		if(nn!=0) n=nn;
		for(int i=1;i<=q;i++) {
			scanf("%lld",&m[i].k);
			m[i].cnt=i;
		}
		sort(m+1,m+1+q,cmp);
		int solve = 1 , sum1 = 0 , sum2 = 0;
		for(int i=n;i>=1;i--){
			int add=(qz[i]-sum1)*(l[i].a+1);
			while(sum2+add>=m[solve].k&&solve<q+1){
				ans[m[solve].cnt]=(m[solve].k-sum2)/(l[i].a+1)+sum1;
				if((m[solve].k-sum2)%(l[i].a+1)!=0){
					ans[m[solve].cnt]++;
				}
				if(m[solve].k!=n&&ans[m[solve].cnt]==1){
					ans[m[solve].cnt]++;
				}
				solve++;
				if(solve>=q+1)break;
			}
			if(solve>=q+1) break;
			sum2+=add;
			sum1=qz[i];
		//	cout<<sum2<<" "<<sum1<<endl;
		}
		for(int i=1;i<=q;i++) {
			if(ans[i]==0) printf("-1\n");
			else{
				printf("%lld\n",ans[i]);
				ans[i]=0;
			}
		}
	}
	return 0;
}
怀疑是45-50行的if判断有些问题

回复

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

正在加载回复...