UVa 1642 魔法GCD + 区间问题总结
来源:互联网 发布:手机屏保软件下载 编辑:程序博客网 时间:2024/06/01 23:54
题目和题解请见刘汝佳紫皮书340页。
代码中用了STL中的map。也是现在才知道到map在系统中是以pair的形式存储的,first是键值,second是对应的映射值。
map的遍历仍然是使用类的迭代器。
代码如下:
#include<cstdio>#include<iostream>#include<cstdlib>#include<cmath>#include<cstring>#include<map>#define LL long longusing namespace std;const LL maxn=100000+5;LL n;map<LL,LL> mp;inline void _read(LL &x){ char ch=getchar(); bool mark=false; for(;!isdigit(ch);ch=getchar())if(ch=='-')mark=true; for(x=0;isdigit(ch);ch=getchar())x=x*10+ch-'0'; if(mark)x=-x;}LL gcd(LL x,LL y){return y? gcd(y,x%y): x;}int main(){ LL i,j,T; _read(T);while(T--){LL ans=0,x; _read(n); mp.clear(); for(i=1;i<=n;i++){ _read(x); if(!mp.count(x))mp[x]=i; map<LL,LL>::iterator it; for(it=mp.begin();it!=mp.end();){ LL cur=gcd(x,it->first); ans=max(ans,cur*(i-it->second+1)); if(!mp.count(cur)) mp[cur]=it->second; else mp[cur]=min(mp[cur],it->second); if(cur<it->first)mp.erase(it++); else it++;}}cout<<ans<<endl;} return 0;}以下是对区间问题的一点总结:
方法一: 区间转点
一般是和或者差之类的问题,通过前缀和可以转化为点的问题。
方法二: 确定一边端点
代码中一般用枚举其中一个端点来体现。
这种题目的重点在于转移,总是要维护一个和答案有关的东西(就像本题中的那个map),要考虑如果给定的那个端点移动会造成什么影响。一般会用到线段树之类的数据结构来维护,例如以下两题:
(1) Mex II
(2)Codeforces Round #365 (Div. 2) D (线段树)
方法三:写累了不想写了
0 0
- UVa 1642 魔法GCD + 区间问题总结
- gcd,高效(魔法GCD,uva 1642)
- HDU 2588 GCD && GCD问题总结
- HDU 2588 GCD && GCD问题总结
- 区间相关问题总结
- 区间问题 贪心总结
- UVA 1642(p340)----Magical GCD
- UVA-1642-MagicalGCD[区间最大公约数]
- uva 10148 - Advertisement(区间选点问题)
- UVA - 10148 Advertisement(区间选点问题)
- UVA - 10148 Advertisement 区间取点问题
- UVa 221 Urban Elevations (区间覆盖问题)
- uva 10382 贪心 区间覆盖问题
- UVA 10382 Watering Grass 区间覆盖问题 -
- [UVa 1642]Magical GCD STL map遍历
- UVA 1642 Magical GCD 暴力+簡單數論
- 20141025 T3 区间GCD
- hdu 5726(区间gcd)
- ArryaList和LinkedList性能分析和适用场景
- POJ 2251 Dungeon Master
- Matrix
- JAVA类的访问权限
- Android自定义侧滑菜单简单示例
- UVa 1642 魔法GCD + 区间问题总结
- 平衡二叉树理解
- Log 中dalvikvm 信息解析
- JS 和Jquery 绑定事件
- Metatable元方法讲解
- BIOS MCSDK 2.0 User Guide 示例学习
- Android三角标签View:TriangleLabelView
- 指针数组
- xml转json java 源码