第一问是没有修改的线段树,第二问暴力预处理,因为gcd的结果不会很多

在预处理阶段需要把每个区间的gcd相等的数量储存起来(用map容器),在一个序列例如:12467,枚举左区间L直到n此处时间为O(n),l=1时寻找右区间随着r的增大gcd单调不增,在某个区域内gcd相等想到用二分查找时间是O(logn),再加上线段树查找用到时间O(logn),总时间是O(n*logn*longn)会超时,所以需要更优。

解决办法:左区间固定时利用线段树找到gcd减小的区间,从l到gcd减小的区间gcd相等。

#include<map>
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const int N = 4e5 + 10;
int T, n, m, g[N], a[N], l, r, q, cas = 0;
map<int, LL> M;
int gcd(int x, int y) { return x%y ? gcd(y, x%y) : y; }
void build(int x, int l, int r)
{
if (l == r) scanf("%d", &g[x]), a[l] = g[x];
else
{
int mid = l + r >> 1;
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
g[x] = gcd(g[x << 1], g[x << 1 | 1]);
}
} int get(int x, int l, int r, int ll, int rr)
{
if (ll <= l&&r <= rr) return g[x];
int mid = l + r >> 1;
int x1 = 0, x2 = 0;
if (ll <= mid) x1 = get(x << 1, l, mid, ll, rr);
if (rr > mid) x2 = get(x << 1 | 1, mid + 1, r, ll, rr);
return gcd(min(x1, x2), max(x1, x2));
} bool find(int x, int l, int r, int ll, int rr, int u, int &v)
{
if (ll <= l && r <= rr)
{
if (gcd(v, g[x]) < u)
{
if (l == r)
{
q = l; return true;
}
else
{
int mid = l + r >> 1;
if (find(x<<1, l, mid, ll, rr, u, v)) return true;
if (find(x<<1|1, mid + 1, r, ll, rr, u, v)) return true;
}
}
else { v = gcd(v, g[x]); return false; }
}
else
{
int mid = l + r >> 1;
if (ll <= mid&&find(x<<1, l, mid, ll, rr, u, v)) return true;
if (rr > mid&& find(x<<1|1, mid + 1, r, ll, rr, u, v)) return true;
return false;
}
} int main()
{
scanf("%d", &T);
while (T--)
{
M.clear();
scanf("%d", &n);
build(1, 1, n);
for (int i = 1, j, k; i <= n; i++)
{
int kk = get(1, 1, n, i, n);
for (k = i, j = a[i]; k <= n;)
{
if (kk == j) { M[j] += n - k + 1; break; }
int gg = a[i];
find(1, 1, n, i, n, j, gg);
M[j] += q - k;
k = q; j = gcd(a[q], j);
}
}
scanf("%d", &m);
printf("Case #%d:\n", ++cas);
while (m--)
{
scanf("%d%d", &l, &r);
int x = get(1, 1, n, l, r);
printf("%d %lld\n", x, M[x]);
}
}
return 0;
}

  

多校hdu5726 线段树+预处理的更多相关文章

  1. HDU 4960 Handling the past 2014 多校9 线段树

    首先确定的基本思想是按时间离散化后来建线段树,对于每个操作插入到相应的时间点上 但是难就难在那个pop操作,我之前对pop操作的处理是找到离他最近的那个点删掉,但是这样对于后面的peak操作,如果时间 ...

  2. HDU 4893 2014多校三 线段树

    给定一个初始都为0的序列,有三种操作,前两种比较正常,一个是对某个位置的数add k,另一个是query区间和.然后比较麻烦的是第三个操作,把某个区间里面的每个值改成离它最近的Fibonacci数,如 ...

  3. HDU 4902 Nice boat 多校4 线段树

    给定n个数 第一个操作和普通,区间覆盖性的,把l-r区间的所有值改成固定的val 第二个操作是重点,输入l r x 把l-r区间的所有大于x的数,变成gcd(a[i],x) a[i]即指满足条件的序列 ...

  4. HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护

    给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...

  5. BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)

    先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了. 用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码 CODE #i ...

  6. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  7. hdu(预处理+线段树)

    给n个数,m个询问, 问任意区间内与其它数互质的数有多少个 比如3个数1 2 4,询问[1,3] 那么答案是1 千万要记住,这样的题目,如果你不转变下,使劲往线段树想(虽然转变之后,也说要用到线段树, ...

  8. [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)

    5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 318  Solved: 105[Submit][Stat ...

  9. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

随机推荐

  1. TFS2013安装与使用图文教程

    from:http://www.jb51.net/softjc/214560.html TFS2013安装与使用图文教程 一.安装和配置过程介绍 要安装TFS2013当然要先进行下载了,可以在下面的地 ...

  2. Unicode与UTF-8互转(c语言和lua语言)

    1. 基础 1.1 ASCII码 我们知道, 在计算机内部, 全部的信息终于都表示为一个二进制的字符串. 每个二进制 位(bit)有0和1两种状态, 因此八个二进制位就能够组合出 256种状态, 这被 ...

  3. http://localhost:8080请求用户名和密码。信息为:“XDB” 解决办法

    windows查看端口占用情况 cmd下 netstat -ano 查看端口和对应的服务 为2520 Oracle的服务 源博客: http://blog.163.com/jxguo_05/blog/ ...

  4. ios如何在当前工程中添加编辑新建的FramesWork

    本文转载至 http://www.apkbus.com/android-131519-1-1.html,感谢原文作者的分享.     naniboy 该用户从未签到   可能很多大牛都见过FaceBo ...

  5. CodeMirror:基于JavaScript的代码编辑器

    官方网站定义: http://codemirror.net/ CodeMirror is a versatile text editor implemented in JavaScript for t ...

  6. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  7. Exponentiation(高精度大数)

    Exponentiation Description Problems involving the computation of exact values of very large magnitud ...

  8. php cmd 不能利用$_COOKIE 的处理 通过文件来暂存字符串

    路径 <?php define('CMDPATH', 'wD:\cmd\\'); echo CMDPATH; die(); broswer 路径无问题 w 读 用 <?php $wfile ...

  9. vue增删改查

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. cache与buffer的区别

    Cache vs Buffer 高速缓存和缓冲区 缓存区cache和缓冲区buffer都是临时存储区,但它们在许多方面有所不同.缓冲区buffer主要存在于RAM中,作为CPU暂时存储数据的区域,例如 ...