zoukankan      html  css  js  c++  java
  • Jzoj1306 Sum

     给出一个数列a1,a2,。。。,an和K,P。   设Si,j = ai + ai+1::: + aj   Answer = min{Si,j mod P|Si,j mod P>=K},其中i<=j,{Si,j mod P|Si,j mod P>=K}非空。


    先预处理出取模后的前缀和s,那么问题变成min(s[j]-s[i]%P)且s[j]-s[i]%P>=k

    把s序列反过来作,对于每个数s[i],维护一个set存有s[i]+1~s[n],让后分两种情况讨论

    1.s[j]>=s[i],这种情况可以在set中寻找比s[i]+k大的最小的数

    2.s[j]<s[i],这种情况可以在set中寻找比s[i]+k-p大的最小的数,并且判断这个数是否<s[i]

    最后统计answer

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<set>
    using namespace std;
    int n,k,p,s[100010],ans=1<<29;
    set<int> w;
    int main(){
    	scanf("%d%d%d",&n,&k,&p);
    	for(int i=1;i<=n;++i){
    		scanf("%d",s+i);
    		(s[i]+=s[i-1])%=p;
    	}
    	w.insert(s[n]);
    	set<int>::iterator it;
    	for(int i=--n;i;--i){
    		it=w.lower_bound(s[i]+k);
    		if(it!=w.end()) ans=min(ans,*it-s[i]);
    		it=w.lower_bound(k-p+s[i]);
    		if(it!=w.end() && *it<s[i]) ans=min(ans,p+*it-s[i]);
    		w.insert(s[i]);
    	}
    	printf("%d
    ",ans);
    }


  • 相关阅读:
    python threading 锁的应用
    python线程threading处理任务并发一
    *,arg,*args,**kwargs的使用
    web services 接口调用
    jsonp与ajax
    无缝滚动详解
    手机端使用rem适配
    css3写的实用表单美化
    经典仿淘宝商城菜单多条件查询
    css3 flex写的移动端界面
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774427.html
Copyright © 2011-2022 走看看