划分树模板题目,主席树也可解。
划分树。

 /* 4251 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = 1e5+;
int order[maxn];
int toLeft[][maxn];
int val[][maxn];
int n; void Build(int l, int r, int dep) {
if (l == r) {
toLeft[dep][l] = toLeft[dep][l-] + ;
return ;
} int mid = (l + r) >> ;
int same = mid - l + ; rep(i, l, r+) {
if (val[dep][i] < order[mid])
--same;
} int lpos = l, rpos = mid + ; rep(i, l, r+) {
if (val[dep][i] < order[mid]) {
val[dep+][lpos++] = val[dep][i];
} else if (val[dep][i]==order[mid] && same>) {
val[dep+][lpos++] = val[dep][i];
--same;
} else {
val[dep+][rpos++] = val[dep][i];
}
toLeft[dep][i] = toLeft[dep][l-] + lpos - l;
} Build(l, mid, dep+);
Build(mid+, r, dep+);
} int Query(int l, int r, int k, int L, int R, int dep) {
if (l == r) {
return val[dep][l];
} int mid = (L + R) >> ;
int tmp = toLeft[dep][r] - toLeft[dep][l-]; if (tmp >= k) {
int ll = L + toLeft[dep][l-] - toLeft[dep][L-];
int rr = ll + tmp - ; return Query(ll, rr, k, L, mid, dep+);
} else {
k -= tmp;
int ll = mid+ + l-L - (toLeft[dep][l-] - toLeft[dep][L-]);
int rr = ll + (r-l+-tmp) - ; return Query(ll, rr, k, mid+, R, dep+);
}
} void solve() {
sort(order+, order++n);
Build(, n, ); int q;
int l, r, kth;
int ans; scanf("%d", &q);
while (q--) {
scanf("%d %d", &l, &r);
kth = ((l+r)>>) - l + ;
ans = Query(l, r, kth, , n, );
printf("%d\n", ans);
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t = ; while (scanf("%d", &n)!=EOF) {
rep(i, , n+) {
scanf("%d", &val[][i]);
order[i] = val[][i];
}
printf("Case %d:\n", ++t);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

主席树。

 /* 4251 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
// #define lson l, mid, rt<<1
// #define rson mid+1, r, rt<<1|1 const int maxn = 1e5+;
const int maxm = maxn * ;
int a[maxn], b[maxn];
int T[maxn];
int lson[maxm], rson[maxm], c[maxm];
int n, m, tot; void init() {
m = tot = ;
} int Build(int l, int r) {
int rt = tot++; c[rt] = ;
if (l == r)
return rt; int mid = (l + r) >> ; lson[rt] = Build(l, mid);
rson[rt] = Build(mid+, r);
return rt;
} int Insert(int rt, int p, int delta) {
int nrt = tot++, ret = nrt;
int l = , r = m - , mid; c[nrt] = c[rt] + delta;
while (l < r) {
mid = (l + r) >> ;
if (p <= mid) {
lson[nrt] = tot++;
rson[nrt] = rson[rt];
nrt = lson[nrt];
rt = lson[rt];
r = mid;
} else {
lson[nrt] = lson[rt];
rson[nrt] = tot++;
nrt = rson[nrt];
rt = rson[rt];
l = mid + ;
}
c[nrt] = c[rt] + delta;
} return ret;
} int Query(int lrt, int rrt, int k, int l, int r) {
if (l == r)
return l; int mid = (l + r) >> ;
int tmp = c[lson[rrt]] - c[lson[lrt]]; if (tmp >= k) {
return Query(lson[lrt], lson[rrt], k, l, mid);
} else {
k -= tmp;
return Query(rson[lrt], rson[rrt], k, mid+, r);
}
} void solve() {
init();
sort(b, b+n);
m = unique(b, b+n) - b;
T[] = Build(, m-);
rep(i, , n) {
int id = lower_bound(b, b+m, a[i]) - b;
T[i+] = Insert(T[i], id, );
} int q;
int l, r, kth;
int ans; scanf("%d", &q);
while (q--) {
scanf("%d %d", &l, &r);
kth = ((l+r)>>)-l+;
int id = Query(T[l-], T[r], kth, , m-);
ans = b[id];
printf("%d\n", ans);
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t = ; while (scanf("%d", &n)!=EOF) {
rep(i, , n) {
scanf("%d", &a[i]);
b[i] = a[i];
}
printf("Case %d:\n", ++t);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】4251 The Famous ICPC Team Again的更多相关文章

  1. HDOJ 4251 The Famous ICPC Team Again

    划分树水题..... The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 3276 ...

  2. HDU 4251 The Famous ICPC Team Again(划分树)

    The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. HDU 4251 The Famous ICPC Team Again 主席树

    The Famous ICPC Team Again Problem Description   When Mr. B, Mr. G and Mr. M were preparing for the ...

  4. hdu 4251 The Famous ICPC Team Again划分树入门题

    The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  5. 【HDOJ】1310 Team Rankings

    STL的应用,基本就是模拟题. /* 1410 */ #include <iostream> #include <string> #include <algorithm& ...

  6. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  7. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  8. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  9. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

随机推荐

  1. HttpClient SSL示例(转)

    原文地址: http://www.cnblogs.com/jerry19890622/p/4291053.html package com.jerry.httpclient; import java. ...

  2. ZENCART 打开/关闭日志文件

    优秀的php开源程序很多都只带生成日志文件的功能,这类功能的开发可以帮助到站长在调试网站的时候及时的改正网站存在的错误,但是这类错误日志由来并非网站出现什么严重不可挽救的错误,大部分是一些未定义变量这 ...

  3. 《C和指针》 读书笔记 -- 第14章 预处理器

    1.相邻字符串常量被自动链接为一个字符串:"my""name"="myname" 2.##把位于两边的符号连接成一个符号: #define ...

  4. 计算器(delphi)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. js 使用技巧 - [近几年工作中的经验总结的技巧]

    1.如果 ajax 返回单一的 json 格式,接收方需要这样再格式化一下赋值: var str = eval("(" + msg + ")"); 开发引用: ...

  6. android studio如何开启与禁用版本控制vcs

    1.开启

  7. 在Hadoop分布式文件系统的索引和搜索

    FROM:http://www.drdobbs.com/parallel/indexing-and-searching-on-a-hadoop-distr/226300241?pgno=3 在今天的信 ...

  8. Indri查询命令及Java调用并保存结果

    查询参数 index Indri索引库路径.在参数文件中像/path/to/repository这样指定,在命令行中像-index=/path/to/repository这样指定.该参数可以设置多次来 ...

  9. hdu 4740 The Donkey of Gui Zhou(暴力搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...

  10. JPA2 关于 PagingAndSortingRepository

    And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd): Or --- 等价于 SQL 中的 ...