题目链接

看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到最后的最大值,插入的时候,往前更新就好了,类似求和。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 int num[50100];
 6 int p[50100];
 7 int n;
 8 struct node
 9 {
10     int l,r,id;
11 } que[50001];
12 bool cmp(node a,node b)
13 {
14     return a.r < b.r;
15 }
16 bool cmp1(node a,node b)
17 {
18     return a.id < b.id;
19 }
20 int pre[50101];
21 int ans[50101];
22 int lowbit(int t)
23 {
24     return t&(-t);
25 }
26 void insert(int t,int d)
27 {
28     while(t)
29     {
30         p[t] = max(p[t],d);
31         t -= lowbit(t);
32     }
33 }
34 int getmax(int t)
35 {
36     int maxz = 0;
37     while(t <= n)
38     {
39         maxz = max(maxz,p[t]);
40         t += lowbit(t);
41     }
42     return maxz;
43 }
44 int main()
45 {
46     int i,j,t,m,tnum;
47     scanf("%d",&t);
48     while(t--)
49     {
50         memset(p,0,sizeof(p));
51         memset(pre,0,sizeof(pre));
52         scanf("%d",&n);
53         for(i = 1; i <= n; i ++)
54             scanf("%d",&num[i]);
55         scanf("%d",&m);
56         for(i = 0; i < m; i ++)
57         {
58             scanf("%d%d",&que[i].l,&que[i].r);
59             que[i].id = i;
60         }
61         sort(que,que+m,cmp);
62         tnum = 0;
63         for(i = 1; i <= n; i ++)
64         {
65             if(tnum == m) break;
66             for(j = 1; j*j <= num[i]; j ++)
67             {
68                 if(num[i]%j == 0)
69                 {
70                     if(pre[j] != 0)
71                         insert(pre[j],j);
72                     pre[j] = i;
73                     if (j * j== num[i]) continue ;
74                     if(pre[num[i]/j] != 0)
75                         insert(pre[num[i]/j],num[i]/j);
76                     pre[num[i]/j] = i;
77                 }
78             }
79             while(tnum < m&&que[tnum].r == i)
80             {
81                 ans[que[tnum].id] = getmax(que[tnum].l);
82                 tnum ++;
83             }
84         }
85         sort(que,que+m,cmp1);
86         for(i = 0;i < m;i ++)
87         {
88             if(que[i].l == que[i].r)
89             printf("0\n");
90             else
91             printf("%d\n",ans[i]);
92         }
93     }
94     return 0;
95 }

转载于:https://www.cnblogs.com/naix-x/p/3229330.html

HDU 4630 No Pain No Game(树状数组)相关推荐

  1. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  2. HDU 5792 World is Exploding(树状数组+离散化)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5792 题意: 思路: lmin[i]:表示左边比第i个数小的个数. lmax[i]:表示左边比第i个 ...

  3. hdu 4911 求逆序对数+树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...

  4. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  5. HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)

    HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...

  6. 【 HDU 1166】 敌兵布阵 树状数组从0到1

    如果给你一个数组,让你求某个区间的和,你很自然会想到遍历一遍数组,复杂度是O(n),但是如果有多次询问呢,你也许会想到用前缀数组,通过O(n)的预处理,达到O(1)的查询,但是如果要更新某个元素的值呢 ...

  7. HDU 5792 World is Exploding (树状数组)

    World is Exploding 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...

  8. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  9. HDU 1166 敌兵布阵【树状数组】

    用树状数组很简单,太晚了,贴下代码睡觉去... 另,研究线段树的时候,发现网上流传着有几种不同的线段树,最正宗的是以单位区间为单位,只能处理线段:另外还有几种叶子结点是点的,这种也可以用来处理点,所以 ...

最新文章

  1. MySQL 用户与授权管理详解
  2. 第 13 章 编码风格
  3. ASP.NET Core SameSite 设置引起 Cookie 在 QQ 浏览器中不起作用
  4. Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
  5. python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储
  6. 视频号扩展链接助手小程序功能模块源码v1.5.0
  7. Python 3 mysql 简介安装
  8. flashback query闪回数据
  9. 【语音去噪】基于matlab先验信噪比的维纳滤波算法语音去噪【含Matlab源码 572期】
  10. MATLAB之GUI界面介绍与搭建
  11. vue判断设备是手机端还是pc端
  12. MAXScript学习笔记(1)
  13. zipf定律 齐普夫定律
  14. 电磁波,无线电,Wifi 4G,摩擦生电
  15. zerglurker的C语言教程010——运算符详解(二)
  16. AriaNg的Nginx 421错误解决
  17. 规格说明书-吉林市2日游
  18. VB.net中金额大写转换
  19. 打造狼性的呼叫中心外呼团队
  20. Jsoup组件抓取HTML标签

热门文章

  1. (Easy) Height Checker LeetCode
  2. Seagull License Server 9.4 SR3 2781 完美激活(解决不能打印问题)
  3. Python_Note_08Day_10_03_JQuery
  4. PhpStorm Swoole 和 CI 代码自动补全
  5. Ubuntu下 ssh : connect to host localhost port 22:Connection refused
  6. petshop4.0 具体解释之中的一个(系统架构设计)
  7. CSS3 @font-face
  8. 砂.随笔.三十一.息斯敏
  9. 微软(北京).NET俱乐部 2008雪上激情之旅-续
  10. 模拟生态系统-自己编写生命