【题目背景】

  小奇总是在数学课上思考奇怪的问题。

【问题描述】

  给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + a[r']) mod P 的最小值。 其中 l <= l' <= r' <= r。

  即模意义下的区间子串和最小值。

【输入格式】

  第一行包含两个正整数 n 和 m,表示数列的长度和询问的个数。

  第二行为 n 个整数,为 a[1]..a[n]。

  接下来 m 行,每行三个数 l,r 和 P,代表一次询问。

【输出格式】

  对于每次询问,输出一行一个整数表示要求的结果

【样例输入】

  4 2

  8 15 9 9

  1 3 10

  1 4 17

【样例输出】

  2

  1

【数据范围】

  对于 20%的数据 n<=100,m<=100,p<=200

  对于 40%的数据 n<=200,m<=1000,p<=500

  对于 70%的数据 n<=100000,m<=10000,p<=200

  对于 100%的数据 n<=500000,m<=10000,p<=500,1<=a[i]<=10^9

【解析】

  这道题第一眼看过去好像没什么思路。从部分分入手吧。

  20分:直接暴力枚举每一个区间里的点,然后求最小值即可。

  40分:可以使用前缀和优化,然后就可以很快地求一个区间里的和。

  70分:假如数据是绝对随机,那么如果一个区间的长度大于p,该区间中一定可以组合出所有区间和%p的余数。其中一定会有余数为0的情况,输出0即可。经过实测,这种方法可以拿90分。

  100分:将前缀和改为区间前缀和,那么设i为当前枚举到的点,那么区间[ l , i ]的余数sum[i]=(sum[i-1]+a[i])%p。记vis[i]表示余数为i的情况在前面是否出现过。对于每一个sum[i],我们都枚举比他小的余数(从sum[i]到0,用j表示),如果vis[j]=1,表示有这种情况。假设余数为j的位置为p,那么由模运算的性质可得:区间[ p , i ]的余数为sum[i]-j。(为什么大于sum[i]的不需要?因为这不可能是更优的解)然后,用sum[i]-j去更新答案。由于余数是从大到小枚举的,且j越大sum[i]-j越小,即该区间余数越小,如果当前能够被更新,后面的就不会再对答案造成影响了,直接break即可。最后把vis[sum[i]]设为1。注意,如果当前答案已经为0了,就直接输出(不会再更优了)。另外,不要每次都去清空前缀和数组,只需要把sum[l-1]设为0即可。

【备注】

  这道题的正解其实是平衡树,但我并不会这个东西......

【代码】

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 500002
using namespace std;
int n,m,a[N],l,r,p,i,j,k;
long long sum[N];
bool e[];
long long read()
{
char c=getchar();
long long w=;
while(c<''||c>'') c=getchar();
while(c<=''&&c>=''){
w=w*+c-'';
c=getchar();
}
return w;
}
long long min(long long a,long long b)
{
if(a<b) return a;
return b;
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
n=read();
m=read();
for(i=;i<=n;i++) a[i]=read();
while(m--){
l=read();
r=read();
p=read();
if(r-l+>p){
cout<<""<<endl;
continue;
}
for(i=;i<=p;i++) e[i]=;
e[]=;
sum[l-]=;
long long ans=<<;
for(i=l;i<=r;i++){
sum[i]=(sum[i-]+a[i])%p;
for(j=sum[i];j>=;j--){
if(e[j]){
ans=min(ans,sum[i]-j);
break;
}
}
if(ans==) break;
e[sum[i]]=;
}
printf("%lld\n",ans);
}
fclose(stdin);
fclose(stdout);
return ;
}

NOIP模拟赛(by hzwer) T2 小奇的序列的更多相关文章

  1. 2.17NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  2. NOIP模拟赛(by hzwer) T3 小奇回地球

    [题目背景] 开学了,小奇在回地球的路上,遇到了一个棘手的问题. [问题描述] 简单来说,它要从标号为 1 的星球到标号为 n 的星球,某一些星球之间有航线. 由于超时空隧道的存在,从一个星球到另一个 ...

  3. NOIP模拟赛(by hzwer) T1 小奇挖矿

    [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...

  4. 2.17NOIP模拟赛(by hzwer) T3 小奇回地球

    [题目背景] 开学了,小奇在回地球的路上,遇到了一个棘手的问题. [问题描述] 简单来说,它要从标号为 1 的星球到标号为 n 的星球,某一些星球之间有航线. 由于超时空隧道的存在,从一个星球到另一个 ...

  5. 2.17NOIP模拟赛(by hzwer) T1 小奇挖矿

    [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...

  6. NOIP模拟赛 经营与开发 小奇挖矿

    [题目描述] 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发 ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 2015-9-13 NOIP模拟赛 by hzwer

    好老的题了,但是还是很有做头的. 总结 不吸氧看来确实是没法用stl的啊(set常数太大了,开O2也没过) SPFA没认真学,觉得有堆优化Dijkstra就天下无敌了,今天负边权教我做人 于是苦逼的只 ...

  9. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

随机推荐

  1. 【算法与数据结构】二叉堆和优先队列 Priority Queue

    优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...

  2. HTML CSS JS 特殊字符(转义)表

    HTML有许多特殊的字符,您对此有多少了解?平时在WEB制作中,您又有用到多少?或者说你在平时使用之时,是否也会碰到,有许多特殊字符要如何打印出来?比如说“笑脸”,比如说“版权号”.要是你用时忘记了这 ...

  3. mysql源码包安装

    一.准备编译环境 # yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake # wget ht ...

  4. 【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID

    [Linux开发]如何查看Linux kernel的内置模块驱动列表和进程ID 标签:[Linux开发] 命令: cat /lib/modules/$(uname -r)/modules.builti ...

  5. [知乎]自己真是Know Nothing 历史上有哪些细思恐极的事件?

    作者:敖让链接:https://www.zhihu.com/question/38374479/answer/652432284来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  6. Luogu P4562 [JXOI2018]游戏

    题目 我们用埃氏筛从\(l,r\)筛一遍,每次把没有被筛掉的数的倍数筛掉. 易知最后剩下来的数(这个集合记为\(S\))的个数就是我们需要选的数,设有\(s\)个,令\(n=r-l+1\). 记\(f ...

  7. 搜索专题: HDU1242 Rescue

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. CSUST 8.4 早训

    ## Problem A A - Memory and Crow CodeForces - 712A 题意: 分析可得bi=ai+ai+1 题解: 分析可得bi=ai+ai+1 C++版本一 #inc ...

  9. html5酷炫效果链接收集

    HTML5 3D图片相册图片轮播动画   http://www.html5tricks.com/demo/html5-3d-gallery-animation/index.html 36种漂亮的CSS ...

  10. link标签中rel属性的作用

    Link标签有两个作用:1. 定义文档与外部资源的关系:2. 是链接样式表.link标签是用于当前文档引用外部文档的 这个标签的rel属性用于设置对象和链接目标间的关系,说白了就是指明你链进来的对象是 ...