【POJ2104】K-th Number

本文详细介绍了主席树的概念及其在解决离散化问题中的应用,包括基本思想、离散化新写法和查询操作的实现。通过实例代码,展示了如何使用主席树高效地处理数据范围内的查询任务。

思路

  之前知道这道题是用<del>时代的眼泪</del>划分树写的TAT好复杂我看不懂

  然后主席就来拯救大家啦~\(≧▽≦)/~

  学了这么久还不会主席树QAQ今天才学的,又T又W的搞得我要死。。

  然后学到了离散化的新写法,不需要用Map。。

  基本思想就是针对[1,L]的每一个L开一个线段树,记录下[1,L]中每一个数出现的次数。

  然后L+1可以利用L的绝大部分点,不同的点重新开就好了。

  查询很好查,就跟Splay一样。

  

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
const double eps=1e-10;
///==============struct declaration==============
struct Node{
   Node *lc,*rc;
   int sum;
   Node (){lc=rc=NULL;sum=0;}
};
///==============var declaration=================
const int MAXN=100010;
Node Poor[MAXN*30];int top=0;
//#define new(Node) (&Poor[++top])
int n,m,tot=0,k,v;
int A[MAXN],Sorted[MAXN];
int Id[MAXN];
map <int,int> Mp;
Node *Seg_Tree[MAXN],*null;
///==============function declaration============
void Add_Seg(Node *&L,Node *&R,int l,int r);
void Query(Node *&prev,Node *&o,int Rank,int l,int r);
void update(Node *&o,int l,int r);
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
   freopen("input.txt","r",stdin);
   freopen("output.txt","w",stdout);
#endif 
   scanf("%d%d",&n,&m);
   for(int i=1;i<=n;i++){
      scanf("%d",A+i);
      Sorted[i]=A[i];
   }
   null=new(Node);
   null->sum=0,null->lc=null,null->rc=null;
   sort(Sorted+1,Sorted+1+n);
   tot=unique(Sorted,Sorted+1+n)-Sorted-1;
   Seg_Tree[0]=new(Node);
   for(int i=1;i<=n;i++){
      Seg_Tree[i]=new(Node);   
      k=A[i];v=1;
      Add_Seg(Seg_Tree[i-1],Seg_Tree[i],1,tot);
   }
   while (m--){
      int L,R,K;scanf("%d%d%d",&L,&R,&K);
      Query(Seg_Tree[L-1],Seg_Tree[R],K,1,tot);
   }
   return 0;
}
///================fuction code====================
void Add_Seg(Node *&prev,Node *&o,int l,int r){
   int m=(l+r)>>1;
   if (prev==NULL) prev=null;
   if (o==NULL) o=new(Node);
   if (l==r)
      o->sum=v+prev->sum;
   else{
      if (Sorted[m]>=k){
         o->rc=prev->rc;
         o->lc=new(Node);
         Add_Seg(prev->lc,o->lc,l,m);
      }  
      else{
         o->lc=prev->lc;
         o->rc=new(Node);
         Add_Seg(prev->rc,o->rc,m+1,r);
      }
      update(o,l,r);
   }
}
void update(Node *&o,int l,int r){
   o->sum=0;
   if (o->lc!=NULL)  o->sum+=o->lc->sum;
   if (o->rc!=NULL)  o->sum+=o->rc->sum;
}
void Query(Node *&L,Node *&R,int Rank,int l,int r){
   if (L==NULL) L=null;
   if (R==NULL) R=null;
   int Lsum=0,m=(l+r)>>1;
   if (l==r){
      printf("%d\n",Sorted[l]);
      return ;
   }
   if (R->lc!=NULL)  Lsum+=R->lc->sum;
   if (L->lc!=NULL)  Lsum-=L->lc->sum;
   if (Lsum>=Rank)
      Query(L->lc,R->lc,Rank,l,m);
   else
      Query(L->rc,R->rc,Rank-Lsum,m+1,r);
}
POJ2104

 

转载于:https://www.cnblogs.com/Houjikan/p/4347689.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值