HDOJ 3486 Interviewe ST RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=3486题意:n个人,有顺序,每个人有自己的能力值。你要从中选m个,分成每段长度[n/m]的小段,如果不能整除,多余的最后那段舍弃。每个小段取能力值最大的那个人。所取的人的能力值之和要大于k,问最少的m是多少。

分析:考虑种种做法,均不可行,然后绕回rmq上。n有20w,虽然st可以o(nlogn)预处理o(1)查询,但是如果枚举m,那么每次查询是m次,最坏可是o(n^2)的复杂度。只好无奈看题解了,结果正解就是这个。。然后加一点点优化就能过。。或者二分,不过二分是错误的,不满足单调性。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6
 7 int n, k, tot, maxi;
 8 int d[200100][20];
 9 void init()
10 {
11     for (int j = 1; (1 << j) < n; j++){
12         int t = (1 << j) - 1;
13         for (int i = 0; i+t < n; i++){
14             d[i][j] = max(d[i][j-1], d[i+(1<<(j-1))][j-1]);
15         }
16     }
17 }
18 inline int rmq(int a, int b)
19 {
20     int l = int(log(double(b-a+1))/log(2.0));
21     return max(d[a][l], d[b+1-(1<<l)][l]);
22 }
23 /*
24 int cal(int len)        //这样写就错了,比如n=3, m=2,本来应该取2段,这个会取3段,导致答案偏小
25 {
26     int sum = 0;
27     for (int i = 0; i+len-1 < n; i += len){
28         int j = i+len-1;
29         sum += rmq(i, j);
30         if (sum > k) break;
31     }
32     return sum;
33 }
34 */
35 int main()
36 {
37     while(scanf("%d %d", &n, &k) && n >= 0 && k >= 0)
38     {
39         tot = maxi = 0;
40         for (int i = 0; i < n; i++){
41             scanf("%d", &d[i][0]);
42             tot += d[i][0];
43             maxi = max(maxi, d[i][0]);
44         }
45         if (tot <= k){
46             puts("-1");
47             continue;
48         }
49         init();
50         int ans = n;
51         for (int i = max(1, k/maxi); i < n; i++){
52             //int tmp = cal(n/i);
53             int len = n/i;
54             int tmp = 0;
55             for (int j = 1; j <= i; j++){
56                 tmp += rmq((j-1)*len, j*len-1);
57                 if (tmp > k) break;
58             }
59             if (tmp > k){
60                 ans = i;
61                 break;
62             }
63         }
64         printf("%d\n", ans);
65     }
66     return 0;
67 }

HDOJ 3486 Interviewe ST RMQ

时间: 2024-10-11 20:47:00

HDOJ 3486 Interviewe ST RMQ的相关文章

LCA最近公共祖先 ST+RMQ在线算法

对于这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O(n); 先介绍在线算法: 1) dfs: 对于图所示的树,我们从根节点1开始dfs,按照先序访问(不算完全的先序),那么它访问顺序就是1 -> 2 -> 4 -> 2 -> 5 -> 7 -> 5 -> 8 -> 5 -> 2 -> 1 -> 3 -> 1 然后用数组first存第一次访问到该点时的时间(也就是访问顺序里面

POJ 2823 Sliding Window ST RMQ

Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards b

HDU5726 GCD(ST&amp;RMQ)

题目链接 GCD 先ST倍增预处理,f[i][j]表示从i开始(包含第i个数)的连续2^j个数的最大公约数. 这样就可以在O(1)内询问得到a[l]到a[r]之间的所有数的最大公约数的值. 然后对于每个数a[i],以这个数为开头的所有子序列的最大公约数的不同值不会超过30个. 而且不同的值是满足单调递减的. 那么就可以二分查找然后把对应值的个数塞进map. 时间复杂度O(Nlog(N)) 1 #include <bits/stdc++.h> 2 3 using namespace std; 4

【HDOJ图论题集】【转】

1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How Many Tables 基础并查集★ 4 1272 小希的迷宫 基础并查集★ 5 1325&&poj1308 Is It A Tree? 基础并查集★ 6 1856 More is better 基础并查集★ 7 1102 Constructing Roads 基础最小生成树★ 8 1232

CSU-2221 假装是区间众数(ST表模版题)

题目链接 题目 Description 给定一个非递减数列Ai,你只需要支持一个操作:求一段区间内出现最多的数字的出现次数. Input 第一行两个整数N,Q 接下来一行有N个整数,表示这个序列. 接下来Q行每行一个操作:A B,询问A到B之间出现最多的数字. 1<=N,Q<=100000.-100000<=Ai<=100000 Output 每组数据若干行,每行对应一个询问的答案. Sample Input 10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?