hdu 4630 No Pain No Game】的更多相关文章

id=45786" style="color:blue; text-decoration:none">HDU - 4630 id=45786" style="color:blue; text-decoration:none">No Pain No Game Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Sta…
http://acm.hdu.edu.cn/showproblem.php?pid=4630 离散化+树状数组 将数组 *a  从后向前遍历 遍历到 a[x] 的时候 再枚举a[x]的约数 假如 约数 k last[k] 对应到 上一个k出现的位置  那么可被公约数 k 更新的区间是   last[k] --- 最后 把所有a[x]的约数都处理完之后  从 x 到任意 y(y>=x)形成的段的 最优解都可求 代码: #include<iostream> #include<cstdi…
No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1465    Accepted Submission(s): 631 Problem Description Life is a game,and you lose it,so you suicide.But you can not kill yoursel…
No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17    Accepted Submission(s): 5 Problem Description Life is a game,and you lose it,so you suicide.But you can not kill yourself be…
No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1769    Accepted Submission(s): 748 Problem Description Life is a game,and you lose it,so you suicide. But you can not kill yours…
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数.那么每次查询[L,R]之间两数gcd的最大值即为查询[L,R]中值最大的线段,离线所有的查询数据,然后按右端点坐标从小到大排序,依次往右加入即可. 这里学到了树状数组维护最大值的写法. 代码: #include <iostream> #include <cstdio> #include…
题目链接 看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到最后的最大值,插入的时候,往前更新就好了,类似求和. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ]; ]; int n; struct node { int…
思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; ; struct node { int l, r; int idx; }; node Qry[MAXN]; //查询 int C[MAXN]; //树状数组 int vis[MAXN]; // i 的倍数上一次出现的位置 int num[MAXN]…
题目链接 求出一个区间内任意两个数的gcd的最大值. 先将询问读进来然后按r值排序. 将每一个数因数分解, 对每一个因子x, 如果pre[x]!=-1, 那么就更新update(pre[x], x, 1, n, 1), 当前的坐标i和某一个询问的r相同时进行查询. 具体看代码.注意l和r相同时答案是0. 初始的时候将maxx数组都弄成1. 谜之WA了n次才发现是数组开小了. #include <iostream> #include <vector> #include <cst…
题目大意:给你一个无序的1~n的排列a,每次询问[l,r]之间任取两个数得到的最大gcd是多少 先对所有询问离线,然后把问题挂在区间的左端点上(右端点也行) 在预处理完质数,再处理一个next数组,表示 i 的任意一个质因子,这样我们分解质因数的时间降低到而不是 因为能对答案产生贡献的都是成对出现的两个数 所以每次记录一个last[i],表示数 i 上一次出现的位置 当遍历到第 i 个数时,分解出它的所有质因数,然后搜出它所有的因子,因子个数大约不会超过,均摊下来就更少了 那么,a[i] 的某个…