其他分享
首页 > 其他分享> > 2021CCPC网络赛重赛1005 Monopoly题解

2021CCPC网络赛重赛1005 Monopoly题解

作者:互联网

2021CCPC网络赛重赛1005 Monopoly题解

题意

多组数据,每组数据一个长度为n的数组a,m个询问。记数组a的前缀和为sum,对每个询问x,找到最小的长度len,使得x=sum[len%n]+sum[n]*(len/n)


分析


小细节


代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int mx=100005;
int t,n,m,cnt;
struct node{
	ll sm,id;
	int ip;
}po[mx];
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
inline bool cmp(node a,node b){
	if(a.id==b.id){
		if(a.sm==b.sm) return a.ip<b.ip;
		return a.sm<b.sm;
	}
	return a.id<b.id;
}
int main()
{
//	freopen("1005.in","r",stdin);
//	freopen("a.out","w",stdout);
	t=read();
	for(int op=1;op<=t;++op){
		n=read();m=read();
		ll sm=0,p,rp;
		bool flag=false;
		po[0].sm=0;po[0].ip=0;
		for(int i=1;i<n;++i){
			sm+=read();po[i].sm=sm;
			po[i].ip=i;
		}
		sm+=read();
		if(sm<0){
			flag=true;sm=-sm;
			for(int i=0;i<n;++i) po[i].sm=-po[i].sm;
		}
		for(int i=0;i<n;++i) po[i].id=sm!=0?(po[i].sm%sm+sm)%sm:0;
		sort(po,po+n,cmp);cnt=0;
		for(int i=1;i<n;++i) if(po[i].id!=po[i].id||po[i].sm!=po[i-1].sm) po[++cnt]=po[i];
		if(sm==0){
			for(int i=1;i<=m;++i){
				p=read();
				int l=0,r=cnt,mid;
				while(l<r){
					mid=(l+r)>>1;
					if(po[mid].sm<p) l=mid+1;
					else r=mid;
				}
				if(po[l].sm!=p) printf("-1\n");
				else printf("%d\n",po[l].ip);
			}
		}
		else
		for(int i=1;i<=m;++i){
			p=read();if(flag) p=-p;
			rp=(p%sm+sm)%sm;
			int l=0,r=cnt,mid;
			while(l<r){
				mid=(l+r+1)>>1;
				if(po[mid].id<rp) l=mid;
				else if(po[mid].id>rp) r=mid-1;
				else if(po[mid].sm>p) r=mid-1;
				else l=mid;
			}
			if(po[l].id!=rp) printf("-1\n");
			else if(sm>0&&po[l].sm>p) printf("-1\n");
			else if(sm<0&&po[l].sm<p) printf("-1\n");
			else printf("%lld\n",po[l].ip+n*(p-po[l].sm)/sm);
		}
		
	}
	return 0;
}

标签:len%,Monopoly,题解,sum,赛重赛,mid,len,sm,po
来源: https://blog.csdn.net/vermouth_1412/article/details/120691163