【题目背景】

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

【问题描述】

  给定一个长度为 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即可。

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

【代码】

 #include <bits/stdc++.h>
#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);
} return ;
}

P.S. 转载自LSlzf

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

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

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

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

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

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

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

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

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

  5. NOIP模拟赛(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. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  9. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

随机推荐

  1. LOJ #6402. yww 与校门外的树 多项式求逆

    蛮神的一道题. code: #include <cmath> #include <cstring> #include <algorithm> #include &l ...

  2. C++-蓝桥杯-小计算器[进制转化][模拟]

    #include <cstdio> #include <string> #include <cstring> #include <iostream> u ...

  3. codechef Chef and The Colored Grid

    难度 \(hard\) 题意 \(3\times n\)的方格,前两行已分别填入\(n-\)排列,要求求第三行填入\(n-\)排列,使得每行每列数不重复的方案数(数据保证前两行合法)\(n\le 10 ...

  4. python三器

    1.1 装饰器 1.装饰器的作用 1. 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 2. 装饰器必须准寻得原则: 1)不能修改被装饰函数的源代码 2)不能修改被装饰函数的调用方式 ...

  5. PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) (找最值)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  6. nginx 配置 强制访问https

    使用nginx的301状态码 server { listen ;     if ($scheme = 'http') {    return 301 https://$server_name$requ ...

  7. STL版本

    STL - Standard Template Library , 是C++标准里面规定的模板库接口规范,但它只是接口规范,没有规定具体怎么实现. STL是C++标准的一部分,所以每个C++编译器都会 ...

  8. PHPStorm使用XDebug调试

    (一)php安装xdebug扩展,PHPStorm+XDebug单步调试 (二)PHPStorm配置XDebug (三)PHPStorm使用XDebug调试 (四)PhpStorm+Xdebug配置单 ...

  9. pytest之assert断言

    assert pytest允许您使用标准Python断言来验证Python测试中的期望和值.例如,你可以写下 # content of test_assert1.py def f(): return ...

  10. GNU Screen使用

    基本使用 SSH时可以方便地resume工作 # open new screen session screen # restore screen -r  Steps Using GNU Screen ...