How D
  • 板块学术版
  • 楼主xmy201315
  • 当前回复7
  • 已保存回复9
  • 发布时间2024/12/14 21:40
  • 上次更新2024/12/15 08:21:10
查看原帖
How D
1259915
xmy201315楼主2024/12/14 21:40
#include <bits/stdc++.h>
using namespace std;
#define N 200010
#define sz(s) s.size()
#define db double
#define mod 1000000007
#define P 998244353
#define ll long long
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define per(i,l,r) for(ll i=l;i>=r;i--)
#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define in insert
//pair<ll,ll> PII;
//map<int,int> f;
//vector<int>edges[N];
//set<int>c;
int x;
int huiwen(int x){int b[100],l=0,t=x;while(t!=0){b[++l]=t%10;t/=10;}for(int i=1,j=l;i<=j;i++,j--)if(b[i]!=b[j])return 0;return 1;}
int prime(int x){for(int i=2;i*i<=x;i++)if(x%i==0)return 0;return 1;} 
inline int gcd(int a,int b){if(a<b)gcd(b,a);if(!b)return a; return gcd(b,a%b);} 
inline int lcm(int a,int b){return a*b/gcd(a,b);}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void pri(int x){
    if(x==1)putchar(' ');
    if(x==2)putchar('\n');
}
inline void put(int x){
	if(x==1)puts("Yes");
	if(x==2)puts("No");
	if(x==3)puts("YES");
	if(x==4)puts("NO");
	if(x==5)puts("yes");
	if(x==6)puts("no");
}
inline void write(int x,int w,int e){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10,w,e);
    putchar(x%10+'0');
    if(x==e){
        if(w==1)putchar(' ');
        if(w==2)putchar('\n');
    }
    return;
}
//int f(){
//}
//time: O( )
 //memory: ()kb
int n=read();long long s=read(),f[N],u,o[N];
int a[N];
int main(){
	rep(i,1,n)a[i]=read(),u+=a[i],o[i]=o[i-1]+a[i];
	for(int i=n,j=1;i;i--,j++)f[j]=f[j-1]+a[i];
//	for(int i=1;i<=n;i++)
//		cout<<f[i]<<' ';
//	puts("");
	sort(o+1,o+n+1);sort(f+1,f+n+1); 
	rep(i,1,n)
		if(s==1LL*a[i]){
			put(1);
			return 0;
		}
	rep(i,0,n){
		if((s-f[i])%u==0){put(1);return 0;}
		else {
			ll k=s-f[i];
			k%=u;
			int L=0,R=n+2;
			while(L+1<R){
				int M=(L+R)/2;
				if(o[M]<k)L=M;
				else R=M;
			}
			if(R<=n+1&&o[R]==k){
				put(1);
				return 0;
			}
		}
	}
	put(2);
}

求助,代码对了一半

2024/12/14 21:40
加载中...