POJ--2985(树状数组 / Treap +并查集)

2015-03-16 19:52:57

思路:一道比较裸的插入不断插入数值、删除数值 + 查询第k大的题目。

  (1)对于合并操作,可以采用并查集来维护,并维护一个num值来表示group总数。

  (2)对于查询第k大的操作

    (i)可以用树状数组维护+二分查找来不断逼近第k大

    (ii)可以利用树状数组本身c[]数组的特性来倍增逼近第k大

    (iii)用treap来查询第k大

    (iv)当然还可以用线段树.....

方法1:树状数组+二分

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 const int MAXN = 300010;
27 
28 int N,M,num;
29 int fa[MAXN],sz[MAXN];
30 
31 struct BIT{
32     int c[MAXN];
33     int Lowbit(int x){
34         return x & (-x);
35     }
36     void clear(){
37         MEM(c,0);
38     }
39     void Update(int x,int d){
40         while(x <= N){
41             c[x] += d;
42             x += Lowbit(x);
43         }
44     }
45     int Getsum(int x){
46         int res = 0;
47         while(x){
48             res += c[x];
49             x -= Lowbit(x);
50         }
51         return res;
52     }
53 }bt;
54 
55 int Find(int x){
56     return fa[x] == x ? x : fa[x] = Find(fa[x]);
57 }
58 
59 int main(){
60     int a,b,c,k;
61     scanf("%d%d",&N,&M);
62     bt.Update(1,N);
63     REP(i,N) fa[i] = i,sz[i] = 1;
64     num = N;
65     REP(i,M){
66         scanf("%d",&c);
67         if(c == 0){
68             scanf("%d%d",&a,&b);
69             int x = Find(a);
70             int y = Find(b);
71             if(x == y) continue;
72             bt.Update(sz[x],-1);
73             bt.Update(sz[y],-1);
74             fa[x] = y;
75             sz[y] += sz[x];
76             bt.Update(sz[y],1);
77             num--;
78         }
79         else{
80             scanf("%d",&k);
81             k = num + 1 - k;
82             int l = 1,r = N;
83             while(l <= r){
84                 int mid = (l + r) / 2; //getmid(l,r);
85                 if(bt.Getsum(mid) >= k) r = mid - 1;
86                 else l = mid + 1;
87             }
88             printf("%d\n",l);
89         }
90     }
91     return 0;
92 }
View Code

 

方法2:树状数组

  这个方法很奇妙,用到了c[]数组本身的倍增特性,哎,果然要善于发现数据结构的潜力才行~

  首先,我们知道 c [a] 保存的是 arr[a-lowbit(a)+1] + arr[a-lowbit(a)+2] + .... + arr[a] 这个和。

  假设最终第k大的group大小为ans,那么c[ans] >= k,将ans二进制拆分为2^p1 + 2^p2 + ... + 2^pm

  那么,c[ans] = c[2^p1] + c[2^p2] + ... + c[2^pm],那么我们只要倒序枚举2的幂来找出p1~pm的值就行。

  【 如:for(int i = MAX_LOG; i >= 0; --i) , 2的幂为(1 << i) 】 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 const int MAXN = 200010;
27 const int MAX_LOG = log(MAXN) / log(2);
28 
29 int N,M,num;
30 int fa[MAXN],sz[MAXN];
31 
32 struct BIT{
33     int c[MAXN];
34     void clear(){ MEM(c,0); }
35     int Lowbit(int x){ return x & (-x); }
36     void Update(int x,int d){
37         while(x <= N){
38             c[x] += d;
39             x += Lowbit(x);
40         }
41     }
42     int Getsum(int x){
43         int res = 0;
44         while(x){
45             res += c[x];
46             x -= Lowbit(x);
47         }
48         return res;
49     }
50 }bt;
51 
52 int Find(int x){ return fa[x] == x ? x : fa[x] = Find(fa[x]); }
53 void Union(int a,int b){
54     int x = Find(a),y = Find(b);
55     if(x != y){
56         bt.Update(sz[x],-1);
57         bt.Update(sz[y],-1);
58         fa[x] = y;
59         sz[y] += sz[x];
60         bt.Update(sz[y],1);
61         num--;
62     }
63 }
64 
65 int Find_kth(int k){
66     int res = 0,cnt = 0;
67     for(int i = MAX_LOG; i >= 0; --i){
68         res += (1 << i);
69         if(res > N || cnt + bt.c[res] >= k) res -= (1 << i);
70         else cnt += bt.c[res];
71     }
72     return res + 1;
73 }
74 
75 int main(){
76     int a,b,c,k;
77     while(scanf("%d%d",&N,&M) != EOF){
78         bt.clear();
79         bt.Update(1,N);
80         num = N;
81         REP(i,N) fa[i] = i,sz[i] = 1;
82         while(M--){
83             scanf("%d",&c);
84             if(c == 0){
85                 scanf("%d%d",&a,&b);
86                 Union(a,b);
87             }
88             else{
89                 scanf("%d",&k);
90                 k = num + 1 - k;
91                 printf("%d\n",Find_kth(k));
92             }
93         }
94     }
95     return 0;
96 }
View Code

 

方法3:Treap

  这题是treap的启蒙题。

  用treap来维护group大小的值,并且记录相同的值的个数,还要记录下以每个节点为根的子树的节点总数,然后就是在二叉搜索树上面找第k大了。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <vector>
  6 #include <map>
  7 #include <set>
  8 #include <stack>
  9 #include <queue>
 10 #include <string>
 11 #include <iostream>
 12 #include <algorithm>
 13 using namespace std;
 14 
 15 #define MEM(a,b) memset(a,b,sizeof(a))
 16 #define REP(i,n) for(int i=1;i<=(n);++i)
 17 #define REV(i,n) for(int i=(n);i>=1;--i)
 18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
 19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
 20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
 21 #define MP(a,b) make_pair(a,b)
 22 
 23 typedef long long ll;
 24 typedef pair<int,int> pii;
 25 const int INF = (1 << 30) - 1;
 26 const int MAXN = 200010;
 27 
 28 int N,M,num;
 29 int fa[MAXN],sz[MAXN];
 30 
 31 struct Treap{
 32     int root,tcnt;
 33     int key[MAXN],pro[MAXN],cnt[MAXN],sz[MAXN],son[MAXN][2];
 34     void clear(){
 35         root = 0;
 36         tcnt = 0;
 37         pro[0] = INF;
 38         sz[0] = 0;
 39     }
 40     void Update(int x){
 41         sz[x] = cnt[x] + sz[son[x][0]] + sz[son[x][1]];
 42     }
 43     void Rotate(int &x,int t){
 44         int y = son[x][t];
 45         son[x][t] = son[y][1 - t];
 46         son[y][1 - t] = x;
 47         Update(x);
 48         Update(y);
 49         x = y;
 50     }
 51     void _Insert(int &x,int k){
 52         if(x){
 53             if(key[x] == k) ++cnt[x];
 54             else{
 55                 int t = k > key[x];
 56                 _Insert(son[x][t],k);
 57                 if(pro[son[x][t]] < pro[x]) Rotate(x,t);
 58             }
 59         }
 60         else{
 61             x = ++tcnt;
 62             key[x] = k;
 63             cnt[x] = 1;
 64             pro[x] = rand(); //随机化优先级
 65             son[x][0] = son[x][1] = 0;
 66         }
 67         Update(x);
 68     }
 69     void _Erase(int &x,int k){
 70         if(key[x] == k){
 71             if(cnt[x] > 1) cnt[x]--;
 72             else{
 73                 if(son[x][0] == 0 && son[x][1] == 0){
 74                     x = 0;
 75                     return;
 76                 }
 77                 int t = pro[son[x][0]] > pro[son[x][1]];
 78                 //没有左儿子t = 1 , 没有右儿子t = 0
 79                 Rotate(x,t);
 80                 _Erase(x,k);
 81             }
 82         }
 83         else    _Erase(son[x][k > key[x]],k);
 84         Update(x);
 85     }
 86     int _Get_kth(int &x,int k){
 87         if(k <= sz[son[x][0]])
 88             return _Get_kth(son[x][0],k);
 89         k -= sz[son[x][0]] + cnt[x];
 90         if(k <= 0) return key[x];
 91         return _Get_kth(son[x][1],k);
 92     }
 93     void Insert(int k){
 94         _Insert(root,k);
 95     }
 96     void Erase(int k){
 97         _Erase(root,k);
 98     }
 99     int Get_kth(int k){
100         return _Get_kth(root,k);
101     }
102 }tp;
103 
104 int Find(int x){
105     return fa[x] == x ? x : fa[x] = Find(fa[x]);
106 }
107 
108 void Union(int a,int b){
109     int x = Find(a),y = Find(b);
110     if(x != y){
111         tp.Erase(sz[x]);
112         tp.Erase(sz[y]);
113         fa[x] = y;
114         sz[y] += sz[x];
115         tp.Insert(sz[y]);
116         num--;
117     }
118 }
119 
120 int main(){
121     int a,b,c,k;
122     scanf("%d%d",&N,&M);    
123     tp.clear();
124     REP(i,N) fa[i] = i,sz[i] = 1,tp.Insert(1);
125     num = N;
126     while(M--){
127         scanf("%d",&c);
128         if(c == 0){
129             scanf("%d%d",&a,&b);
130             Union(a,b);
131         }
132         else{
133             scanf("%d",&k);
134             k = num + 1 - k;
135             printf("%d\n",tp.Get_kth(k));
136         }
137     }
138     return 0;
139 }
View Code

 

转载于:https://www.cnblogs.com/naturepengchen/articles/4342909.html

使用bandersnatch搭建pypi 本地镜像源(20211026) 需求背景:公司内网不能联网,同时开发工作需要各种python的模块,因此需要搭建一个pypi的本地镜像源。 参考网上的方法,总结了大致有下面几种方式搭建pypi本地源: devpi: 企业内网利用devpi搭建pypi私服 - 简书 pip2pi: https://yangfannie.com/1439.html pypiserver: https://zhongneng.github.io/2019/02/16/creat-pip/ bandersnatch:基于bandersnatch搭... 阅读详情

相关推荐

从零开始用Plaxis 2D设计深基坑支护结构:含地锚与桩墙实战教程

本文提供了一份基于Plaxis 2D的深基坑支护结构设计实战教程。教程以钻孔灌注桩排桩结合预应力锚索的典型支护体系为例,详细阐述了从地质模型建立、材料参数定义(重点介绍硬化土模型)、施工阶段模拟(含开挖、锚索施加预应力和地下水渗流固结耦合分析)到结果解读与设计优化的全流程。旨在帮助岩土工程师掌握数值模拟核心,实现从经验设计到量化分析的跨越。

kotlin6android的博客 504

poj 2985 树状数组+并查集(第k大组数)

题意:一开始有n个数,有两种操作,0 a b表示将a所在组和b所在组合并,1 a表示查询当前的第k大组数有多少个。 思路:合并集合很简单用并查集即可。查询的方法是:用树状数组记录数集中某个数出现次数,即tree[i]表示含有i个数的组有多少个。查找的时候二分即可。 #include #include #include #include #include #include using

dearmango 534

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7707

POJ-2985(树状数组 + 并查集 + 二分)

题目:http://poj.org/problem?id=2985 这题考察了两个点呢,组合并用到了并查集,求第K大的数用到了树状数组,刚开始WA了几次,发现是在组合并之后仅仅update(*, -1)了一次,因为是删除了两个组增加了一个组,应该是update(*, -1)两次,不细心啊。。。 #include #include #include using namespace

还有多远 604

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

论文阅读:SuperGaussians: Enhancing Gaussian Splatting Using Primitives with Spatially Varying Colors

Gaussian Splattings 在基于高斯显式表示的多视图重建中展示出了令人印象深刻的结果。然而,当前的高斯基元只有单视图依赖的颜色和不透明度来表示场景的外观和几何形状,导致了一种非紧凑的表示。在本文中,我们引入了一种名为“超高斯(SuperGaussians)”的新方法,它在单个高斯基元中利用空间变化的颜色和不透明度来提高其表示能力。我们实现了双线性插值、移动核,甚至是小型神经网络作为空间变化函数。

m0_48319749的博客 1508

树状数组求第k大值

以POJ 2985为例,具体的写在程序里。思路都是基于二分的思想。 下面是(LogN)^2的方法 /* 题意:某人养了很多猫,他会把一些猫合并成一组,并且会询问第k大组有几只猫 算法:处理集合用并查集,动态更新第K值用树状数组,具体的看注释 2011-07-21 19:59 */ #include #define MAXN 300000 int a[MAXN

z309241990的专栏 4762

遥感大模型核心技术之自监督预训练技术研究(2025年9月版)

本文系统探讨了自监督预训练技术在遥感大模型构建中的核心作用。随着遥感数据进入"大数据"时代,传统监督学习面临"数据丰富、标签贫乏"的瓶颈,而自监督预训练通过设计代理任务从无标签数据中学习特征表示,成为驱动大模型发展的关键引擎。文章分析了遥感领域对自监督预训练的三大独特挑战:多源异构性、地理空间约束和时空动态性,并提出了针对性解决方案:掩码自编码(MAE)技术及其演进、地理对比学习与多模态融合、位置感知预训练与多任务学习。

panshengwu的博客 842

POJ2985 (线段树+并查集)

题目链接:http://poj.org/problem?id=2985 题意:输入n(猫的数量)和m(操作的总数),求分组以及合并操作后,第K大的组的规模大小 解题思路:并查集+线段树 Source Code /*以分组的规模作为划分线段的标准 有n只猫则可能存在的分组中规模最大的为n,规模最小的为1 tree[k]表示规模为tree[k].left---tree[

Below_Crusder的博客 856

强化学习——day16 动态规划算法

动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略

想太多的学习日志 1550

用 OP-TEE 给 AI 模型“上锁”:密文存储、TEE 解密放行、推理后销毁(实战可落地)

本文提出一种基于OP-TEE的AI模型保护方案,通过两级密钥体系确保模型静态存储为密文,运行时仅在TEE内解密。方案采用KEK+DEK架构,DEK永不出TEE,支持分块解密与可验证擦除。该方案能有效防御静态分析、应用层逆向等威胁,但需承认其物理级攻击的局限性。文章详细描述了端到端架构、文件格式设计及TA实现要点,包括密钥管理、分块解密策略和销毁机制,为设备侧AI部署提供了工程可行的安全解决方案。

Interview_TC的博客 289

POJ-2985-The k-th Largest Group

第一次用树状数组求第k大值,其实思想就是统计比现在小的个数,然后用二分进行查找, 感觉比划分树简单多了 代码: #include #include #include using namespace std; const int maxn=200010; int n,m,t[maxn],p[maxn],num[maxn]; int find(int x) { if(p[x]==-1)

z309241990的专栏 879

Git救援:如何从误操作中恢复未提交的更改

摘要:本文探讨了误操作git reset --hard导致未提交更改丢失后的恢复方法。首先分析git reflog的局限性,随后介绍利用IDE本地历史记录(如IntelliJ IDEA和VS Code)进行文件恢复的具体步骤。最后建议使用文件系统恢复工具(如Linux的extundelete或Windows的Recuva)作为备选方案。文章强调定期提交的重要性,同时提供了意外发生时可行的恢复策略,帮助开发者尽可能挽回丢失的工作内容。(149字)

2501_90323865的博客 129

POJ 2985 The k-th Largest Group 第k大数 Treap / 树状数组 + 并查集

题目链接题意有 nn 只猫,mm 次操作(n,m≤2e5n,m\leq 2e5): 0 i j0\ i\ j:将第 ii 只猫所在组与第 jj 只猫所在组合并; 1 k1\ k:询问第 kk 大的组中有多少只猫。法一:Treap参考资料董的博客 数据结构之Treap clj的treap ——wbysr POJ 2985 Treap平衡树(求第k大的元素) ——潇洒走一回LW注意点

kkkkahlua的博客 351

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ 2985 Treap平衡树(求第k大的元素)

这题也可以用树状数组做,而且树状数组姿势更加优美,代码更加少,不过这个Treap树就是求第K大元素的专家……所以速度比较快! 这个也是从那本红书上拿的模板……自己找了资料百度了好久,才理解这个Treap基本的知识,要是自己写真的得写到什么时候啊!!! 然后输入的时候是写n-k+1反着找的,就是这里又浪费了好多时间debug,唉…… #include #include #include

liwei的专栏 2568

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted: 2875 Description Newman likes playing with cats. He possesses lots o...

weixin_34226706的博客 112

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

poj 2985 The k-th Largest Group 求第K大数 Treap, Binary Index Tree, Segment Tree

题目链接:点击打开链接 题意:有两种操作,合并集合,查询第K大集合的元素个数。(总操作次数为2*10^5) Treap模板(静态数组) #include #include #include #include #include const int maxNode = 500000 + 100; const int inf = 0x3f3f3f3f; struct Tr

天亮说晚安 2388

刷题记录

  poj3311(状压dp+floyd)   poj1915(bfs)   poj3278(bfs)   poj1990(树状数组)   poj2352(树状数组)   poj1703(带敌人集合的并查集)   poj1995(快速幂_《算法竞赛进阶指南》推荐)   bzoj1034(贪心+排序)   bzoj3224(Treap)   bzoj1503(Treap)   b...

weixin_30900589的博客 82

POJ2985_The k-th Largest Group(树状数组)

转自:https://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html 题意: 首先给你N只老鼠,M个操作;最开始一只老鼠一个组; 输入0,输入两个数i,j;使得i老鼠与j老鼠的组合并; 输入1,输入一个数K,求第K大的组有多少只老鼠。 思路: 第K大就是第n-k+1小,用树状数组求第K小。 觉得:https://www.cnblogs....

CY05627的博客 393

POJ 2985 The k-th Largest Group (树状数组学习)

初识树状数组,确实是一种优美的数据结构,夹杂着很强的数学模型在里面。 http://poj.org/summerschool/1_interval_tree.pdf这里已经说明的非常清楚。 http://dongxicheng.org/structure/binary_indexed_tree/这篇文章说的也是差不多的。 重要的是去思考,为什么树形数组能够行的通,看了下面不难理...

weixin_30270889的博客 161

poj_2985 The k-th Largest Group 树状数组求第K大

前面说了树状数组的三个用途, 在

e的专栏 748

(POJ-2985)The k-th Largest Group(并查集+树状数组)

题目链接:2985 -- The k-th Largest Group 大致题意:就是一开始给你n个集合,每个集合里面有一个元素,然后有m次操作,每次操作有两种可能,一种是查询当前所有集合中第k大的集合的大小,也就是所有集合内部的元素个数第k大的集合的元素个数,另一种是合并某两个集合,合并后的集合将变为原来两个集合的大小之和,只有进行询问操作时会给出输出。 分析:看到合并集合我们不难想到用并查集来解决,除此之外我们还需要用一个数组cnt来维护每个集合的大小,当然这都是一些较为基础的想法,在这里再提醒

AC__dream的博客 386

POJ 2985 【并查集+树状数组第K大】

POJ 2985 【并查集+树状数组第K大】 题目链接 题意:给你猫的编号1-n,m次操作,0操作可以把两只猫放到一组,1操作询问猫的当前第K大组的容量是多少。 **思路:**首先0操作可以利用并查集的合并操作,用一个size数组纪录组的容量,每次合并的时候就更新size,那么查询第K大用什么来记录呢?主席树?不不不,今天要说的是树状数组,树状数组求第K大??? 其实就是个板子,利用树状数组前缀和...

qq_43653111的博客 343

poj2985 The k-th Largest Group 【树状数组求第K大】

链接:http://poj.org/problem?id=2985 题意:给你n,m,代表有n个集合,开始每个集合大小为1,接下来m个操作,每个操作先输入c,c==0则将x,y集合合并,c==0,输出第k大。 分析:集合和并可以用并查集,然后求第k大直接用树状数组。 代码: #include #include #include #include #include #include #inc

Fb_by 885

poj2985

树状数组求第k大值 思路有一点想ST表 将求第k大变为求第(tot-k+1)小的数,tr[i]统计小于等于i的数的总数 每次不断逼近,若当前[ans,ans+(1<<i)]在范围内,则加上,否则直接到下一次循环 过程中的一个地方要注意(详见代码注释) #include<cstdio> #include<cctype> using na...

196

poj 2985

第k小的数字 树状数组 View Code 1 #include<iostream> 2 #include<cstdio> 3 #define maxn 200005 4 using namespace std; 5 int c[maxn],p[maxn],a[maxn]; 6 int N,M,C; 7 void add(int x,int num) 8 { 9...

weixin_34072159的博客 178
上一篇: Bestcoder #32
下一篇: POJ--1442(Treap)
dingdi3021
博客等级 码龄11年 1粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值