GDOI2013 大山王国的科举考试
【题目大意】给定N个数和T个询问,每个询问为给定一个区间,求下标落在这个区间内的数除以p之后的余数最大值。N <= 1e6, Q <= 5e4, Ai <= 1000, p <= 1000.
【题解】
解法一:

我们考虑分块。

预处理:枚举模数,对于每个块求出答案。O(np)

询问:整块的部分已经预处理出来,剩余的部分暴力做。O(Tn^0.5)

小优化:因为数列中每个数不大于一千,于是就可以预处理取模运算的结果。

这个算法乍一看np好像很大,而且取模是很慢的,好像会超时。

但是在gdoi2013现场测试时这个方法是可以过的,现场数据N<=1e5。

解法二:

预处理:因为读入的数只有1000,我们为每个读入的数开个vector,存储出现这个数的所有位置,显然每个vector中的位置是有序的。

询问:读入l,r,p;

我们从大到小枚举答案i(即为余数),再枚举除以p的商j,则我们可以得到当前的数为j*p+i。

现在我们的问题转化成一个存在性问题:

在区间[l,r]中,j*p+i是否出现过,换句话说,j*p+i出现过的所有位置中,是否存在一个位置在区间[l,r]中。

我们可以在j*p+i的vector中二分找到第一个大于等于l的位置,若这个位置存在且<=r,则答案i是可行的。

此处用lower_bound实现。

这个解法可以通过N<=1e6的数据。

代码:

解法一:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for (int i = a;i <= b;i ++)using namespace std;const int maxn = 1000005;
const int maxp = 1005;
int N,T,size,tot;
int A[maxn],lt[maxp],rt[maxp],f[maxp][maxp];void Initialize()
{scanf("%d%d",&N,&T);fo(i,1,N) scanf("%d",&A[i]);size = (int)sqrt(1.0*N);tot = N / size;fo(i,1,tot){lt[i] = rt[i-1] + 1;rt[i] = rt[i-1] + size;}rt[tot] = N;fo(i,1,tot)fo(j,1,1000)fo(k,lt[i],rt[i])f[i][j] = max(f[i][j],A[k]%j);
}void Work()
{while (T --){int l,r,x;int ans = 0;scanf("%d%d%d",&l,&r,&x);l ++, r ++;fo(i,1,tot){if (lt[i] > r) break;if (l <= lt[i] && rt[i] <= r) ans = max(ans,f[i][x]);else if (l > lt[i] && rt[i] <= r)fo(j,l,rt[i]) ans = max(ans,A[j]%x);else if (rt[i] > r && lt[i] >= l)fo(j,lt[i],r) ans = max(ans,A[j]%x);else if (lt[i] <= l && r <= rt[i])fo(j,l,r) ans = max(ans,A[j]%x);}printf("%d\n",ans);}
}int main()
{Initialize();Work();return 0;
}

解法二:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define fo(i,a,b) for (int i = a;i <= b;i ++)
#define fd(i,a,b) for (int i = a;i >= b;i --)using namespace std;const int maxa = 1005;
int N,T,mx;
vector<int> p[maxa];void Initialize()
{scanf("%d%d",&N,&T);int x;fo(i,1,N) scanf("%d",&x), mx = max(mx,x), p[x].push_back(i);
}int ANS(int l,int r,int x)
{fd(i,x-1,0)fd(j,(mx-i)/x,0)if (p[j*x+i].size() > 0){vector<int>::iterator k = lower_bound(p[j*x+i].begin(),p[j*x+i].end(),l);if (k != p[j*x+i].end() && *k <= r) return i;}
}void Work()
{while (T --){int l,r,x;scanf("%d%d%d",&l,&r,&x);printf("%d\n",ANS(l+1,r+1,x));}
}int main()
{Initialize();Work();return 0;
}

【分块or转化枚举】GDOI2013 大山王国的科举考试相关推荐

  1. 【GDOI2013】大山王国的科举考试

    Description M将军在战神等人的帮助上踏上了大山,成立了一个王国,取名为大山中学集训队.王国中文有规律帝,武有战神,下面还有一群哥字辈,牛字辈的小兵和闪闪发光的明日之星,渐渐地,这些人都成了 ...

  2. 青少年软件编程(202209)(C语言)(枚举递归递推)等级考试(三级)试题及参考答案

    等级标准 掌握算法以及算法性能.算法效率的概念: 掌握基本算法中枚举的概念: 掌握基本算法中递归的概念: 掌握自调用函数的应用,实现基本算法中的递归方法: 掌握基本算法中由递归变递推的方法: 能够使用 ...

  3. 一站式解决使用枚举的各种痛点

    如果变量值仅有有限的可选值,那么用枚举类来定义常量是一个很常规的操作. 但是在业务代码中,我们不希望依赖 ordinary() 进行业务运算,而是自定义数字属性,避免枚举值的增减调序造成影响. @Ge ...

  4. OSS.Common获取枚举字典列表标准库支持

    上篇(.Net Standard扩展支持实例分享)介绍了OSS.Common的标准库支持扩展,也列举了可能遇到问题的解决方案.由于时间有限,同时.net standard暂时还没有提供对Descrip ...

  5. java将实体类转化为json_只有实践才能将知识转化为智慧

    都说学习要把知识学活,不要死学.学习要学会举一反三,活学活用.学习中很多人一直用这句话警醒自己,也使这些人一直徘徊在"死"与"活"之间. 活学活用,需要一个思考 ...

  6. XDUOJ题解合集(待填坑)

    1000 A + B Problem : 没啥好说的 . 1001 又是苹果(模拟): 用数组记录一下索引,交换行列时交换索引即可. 1002 小W的塔防(dp): 记 fi,jf_{i,j}fi,j ...

  7. [BZOJ3337] ORZJRY I --块状链表大毒瘤

    link 题目大意:维护一个序列 支持: 1.单点插入 2.单点删除 3.区间翻转 4.区间旋转 5.区间加 6.区间赋值 7.询问区间和 8.询问区间极差 9.询问区间与给定某个数差值绝对值的最小值 ...

  8. FCTH(Fuzzy Color and Texture Histogram)算法

    FROM: http://blog.csdn.net/leixiaohua1020/article/details/16883143 模糊颜色和纹理直方图(Fuzzy Color and Textur ...

  9. 理科卷math·english·chinese·biology·chemistry·physics

    一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 ...

最新文章

  1. AI大咖山世光:AlphaGo Zero的成功并不能复制到人脸识别!
  2. php 5.4.36 sqlserver,PHP:PHP5.4连接SQLSERVER
  3. mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
  4. python一个月能学成嘛-Python 从入门到精通:一个月就够了!
  5. python3.5安装教程-linux下安装python3.5.3的方式
  6. django学习——通过HttpResponseRedirect 和 reverse实现重定向(转载)
  7. Leaflet中使用Leaflet.AnimatedMarker插件实现要素轨迹移动
  8. 收集6 款 Java 8 自带工具,轻松分析定位 JVM 性能问题!
  9. ubuntu 常用快捷键、常用命令
  10. matlab用泰勒展开解微分方程,mathematica的解微分方程的能力让人大失所望啊
  11. 信阳航空学院计算机,在航校|信阳航空服务学校二期建设震撼公布!
  12. 【工程项目经验】函数编译可见性
  13. 20191022:(leetcode习题)山脉数组的峰顶索引
  14. 计算机编码详解_什么是计算机编码?计算机编码的起源与操作系统是如何解码的。
  15. 看不懂JDK8的流操作?5分钟带你入门(转)
  16. 过拟合和欠拟合_TensorFlow教程-过拟合和欠拟合
  17. Java调用MATLAB作图是的ERROR--MWEException
  18. 怎么才能免费下载CSDN资源
  19. python help帮助文档
  20. pearson 相关系数可视化

热门文章

  1. Docker基础------安装docker,以及一些常用的docker命令,docker网络,自定义docker网络
  2. Android按返回键程序仍在后台运行,并未完全退出和销毁,类似微信QQ等退出方式的实现-- moveTaskToBack
  3. 运用python画虚拟礼物盒(来自远方的礼物)
  4. 电子邮箱格式有哪些,电子邮箱怎么申请注册呢?
  5. golang基于FFmpeg实现视频H264编解码
  6. 前端百题斩【025】——原来跨域也是可以进行分类的
  7. JS中公式计算平年闰年的公式
  8. aspx repeater 用法_详解ASP.NET-----Repeater数据控件的用法总结
  9. MIDI制作的小知识和小经验
  10. linux 磁盘挂载及查看磁盘