HDU 4630 No Pain No Game(树状数组)
题目链接
看的别人的题解,离线之后,按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(树状数组)相关推荐
- HDU 4630 No Pain No Game 树状数组+离线操作
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...
- HDU 5792 World is Exploding(树状数组+离散化)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5792 题意: 思路: lmin[i]:表示左边比第i个数小的个数. lmax[i]:表示左边比第i个 ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...
- HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)
HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...
- 【 HDU 1166】 敌兵布阵 树状数组从0到1
如果给你一个数组,让你求某个区间的和,你很自然会想到遍历一遍数组,复杂度是O(n),但是如果有多次询问呢,你也许会想到用前缀数组,通过O(n)的预处理,达到O(1)的查询,但是如果要更新某个元素的值呢 ...
- HDU 5792 World is Exploding (树状数组)
World is Exploding 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...
- hdu 1166 敌兵布阵(树状数组)
题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...
- HDU 1166 敌兵布阵【树状数组】
用树状数组很简单,太晚了,贴下代码睡觉去... 另,研究线段树的时候,发现网上流传着有几种不同的线段树,最正宗的是以单位区间为单位,只能处理线段:另外还有几种叶子结点是点的,这种也可以用来处理点,所以 ...
最新文章
- MySQL 用户与授权管理详解
- 第 13 章 编码风格
- ASP.NET Core SameSite 设置引起 Cookie 在 QQ 浏览器中不起作用
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储
- 视频号扩展链接助手小程序功能模块源码v1.5.0
- Python 3 mysql 简介安装
- flashback query闪回数据
- 【语音去噪】基于matlab先验信噪比的维纳滤波算法语音去噪【含Matlab源码 572期】
- MATLAB之GUI界面介绍与搭建
- vue判断设备是手机端还是pc端
- MAXScript学习笔记(1)
- zipf定律 齐普夫定律
- 电磁波,无线电,Wifi 4G,摩擦生电
- zerglurker的C语言教程010——运算符详解(二)
- AriaNg的Nginx 421错误解决
- 规格说明书-吉林市2日游
- VB.net中金额大写转换
- 打造狼性的呼叫中心外呼团队
- Jsoup组件抓取HTML标签
热门文章
- (Easy) Height Checker LeetCode
- Seagull License Server 9.4 SR3 2781 完美激活(解决不能打印问题)
- Python_Note_08Day_10_03_JQuery
- PhpStorm Swoole 和 CI 代码自动补全
- Ubuntu下 ssh : connect to host localhost port 22:Connection refused
- petshop4.0 具体解释之中的一个(系统架构设计)
- CSS3 @font-face
- 砂.随笔.三十一.息斯敏
- 微软(北京).NET俱乐部 2008雪上激情之旅-续
- 模拟生态系统-自己编写生命