【分块or转化枚举】GDOI2013 大山王国的科举考试
我们考虑分块。
预处理:枚举模数,对于每个块求出答案。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 大山王国的科举考试相关推荐
- 【GDOI2013】大山王国的科举考试
Description M将军在战神等人的帮助上踏上了大山,成立了一个王国,取名为大山中学集训队.王国中文有规律帝,武有战神,下面还有一群哥字辈,牛字辈的小兵和闪闪发光的明日之星,渐渐地,这些人都成了 ...
- 青少年软件编程(202209)(C语言)(枚举递归递推)等级考试(三级)试题及参考答案
等级标准 掌握算法以及算法性能.算法效率的概念: 掌握基本算法中枚举的概念: 掌握基本算法中递归的概念: 掌握自调用函数的应用,实现基本算法中的递归方法: 掌握基本算法中由递归变递推的方法: 能够使用 ...
- 一站式解决使用枚举的各种痛点
如果变量值仅有有限的可选值,那么用枚举类来定义常量是一个很常规的操作. 但是在业务代码中,我们不希望依赖 ordinary() 进行业务运算,而是自定义数字属性,避免枚举值的增减调序造成影响. @Ge ...
- OSS.Common获取枚举字典列表标准库支持
上篇(.Net Standard扩展支持实例分享)介绍了OSS.Common的标准库支持扩展,也列举了可能遇到问题的解决方案.由于时间有限,同时.net standard暂时还没有提供对Descrip ...
- java将实体类转化为json_只有实践才能将知识转化为智慧
都说学习要把知识学活,不要死学.学习要学会举一反三,活学活用.学习中很多人一直用这句话警醒自己,也使这些人一直徘徊在"死"与"活"之间. 活学活用,需要一个思考 ...
- XDUOJ题解合集(待填坑)
1000 A + B Problem : 没啥好说的 . 1001 又是苹果(模拟): 用数组记录一下索引,交换行列时交换索引即可. 1002 小W的塔防(dp): 记 fi,jf_{i,j}fi,j ...
- [BZOJ3337] ORZJRY I --块状链表大毒瘤
link 题目大意:维护一个序列 支持: 1.单点插入 2.单点删除 3.区间翻转 4.区间旋转 5.区间加 6.区间赋值 7.询问区间和 8.询问区间极差 9.询问区间与给定某个数差值绝对值的最小值 ...
- FCTH(Fuzzy Color and Texture Histogram)算法
FROM: http://blog.csdn.net/leixiaohua1020/article/details/16883143 模糊颜色和纹理直方图(Fuzzy Color and Textur ...
- 理科卷math·english·chinese·biology·chemistry·physics
一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 ...
最新文章
- AI大咖山世光:AlphaGo Zero的成功并不能复制到人脸识别!
- php 5.4.36 sqlserver,PHP:PHP5.4连接SQLSERVER
- mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
- python一个月能学成嘛-Python 从入门到精通:一个月就够了!
- python3.5安装教程-linux下安装python3.5.3的方式
- django学习——通过HttpResponseRedirect 和 reverse实现重定向(转载)
- Leaflet中使用Leaflet.AnimatedMarker插件实现要素轨迹移动
- 收集6 款 Java 8 自带工具,轻松分析定位 JVM 性能问题!
- ubuntu 常用快捷键、常用命令
- matlab用泰勒展开解微分方程,mathematica的解微分方程的能力让人大失所望啊
- 信阳航空学院计算机,在航校|信阳航空服务学校二期建设震撼公布!
- 【工程项目经验】函数编译可见性
- 20191022:(leetcode习题)山脉数组的峰顶索引
- 计算机编码详解_什么是计算机编码?计算机编码的起源与操作系统是如何解码的。
- 看不懂JDK8的流操作?5分钟带你入门(转)
- 过拟合和欠拟合_TensorFlow教程-过拟合和欠拟合
- Java调用MATLAB作图是的ERROR--MWEException
- 怎么才能免费下载CSDN资源
- python help帮助文档
- pearson 相关系数可视化
热门文章
- Docker基础------安装docker,以及一些常用的docker命令,docker网络,自定义docker网络
- Android按返回键程序仍在后台运行,并未完全退出和销毁,类似微信QQ等退出方式的实现-- moveTaskToBack
- 运用python画虚拟礼物盒(来自远方的礼物)
- 电子邮箱格式有哪些,电子邮箱怎么申请注册呢?
- golang基于FFmpeg实现视频H264编解码
- 前端百题斩【025】——原来跨域也是可以进行分类的
- JS中公式计算平年闰年的公式
- aspx repeater 用法_详解ASP.NET-----Repeater数据控件的用法总结
- MIDI制作的小知识和小经验
- linux 磁盘挂载及查看磁盘