Jzoj1306 Sum
来源:互联网 发布:国内 阿里云 aws 优势 编辑:程序博客网 时间:2024/05/29 14:23
给出一个数列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\n",ans);}
阅读全文
1 0
- Jzoj1306 Sum
- Sum
- sum
- sum
- Sum
- Sum
- Sum
- sum
- Sum
- sum
- Sum
- sum
- Sum
- sum
- Sum Sum Sum
- HDU5150 Sum Sum Sum
- HDU - 5150 Sum Sum Sum
- hdu 5150 sum sum sum
- java-编码解密
- 在android系统中开发DLNA
- 3dMax第四章:三维物体修改操作
- java--继承(2)
- java脚本
- Jzoj1306 Sum
- hdu 5546 Ancient Go(bfs+模拟)
- Java 静态分派与动态分派
- kafka集群broker节点扩容方案
- HDU 6208
- clipse–>run as –> maven test 出现中文乱码
- Cisco Packet Tracer使用方法和路由器基本配置
- python字符串函数
- Android:控件WebView显示网页