bzoj3524这是我主席树的第一题

什么是主席树呢,就是n棵线段树,每棵线段树记录前缀每个数值(显然想到里离散化)出现次数

由于第i棵树相对于第i-1棵树只有logS个点不同(S为数值的种类数)

所以总的空间复杂度为O(nlogS),非常好理解;

由于每棵线段树的形态都是一样的,所以这些线段树是可以做减法的,

这是一个非常有用的性质,也很好的解决了区间的性质

然后解决这道题,这题问区间出现次数超过(r-l+1)/2的数,显然直接顺着主席树搜就可以了logS的复杂度

bzoj2223基本同样的题目,注意样例n后面多了个ai的范围

 type node=record
       l,r,s:longint;
     end; var tree:array[..] of node;
    sum,head,a,b,rank,sa:array[..] of longint;
    x,y,i,n,m,t,len,p:longint; procedure swap(var a,b:longint);
  var c:longint;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure sort(l,r: longint);
  var i,j,x: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) shr ];
    repeat
      while a[i]<x do inc(i);
      while x<a[j] do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; procedure update(x:longint);
  begin
    tree[x].s:=tree[tree[x].l].s+tree[tree[x].r].s;
  end; function build(l,r:longint):longint;
  var m,q:longint;
  begin
    inc(t);
    q:=t;
    if l=r then exit(t)
    else begin
      m:=(l+r) shr ;
      tree[q].l:=build(l,m);
      tree[q].r:=build(m+,r);
    end;
    exit(q);
  end; function pre(w,l,r:longint):longint;
  var m,q:longint;
  begin
    inc(t);
    q:=t;
    if l=r then
      tree[t].s:=sum[l]
    else begin
      m:=(l+r) shr ;
      if rank[i]<=m then
      begin
        tree[q].l:=pre(tree[w].l,l,m);
        tree[q].r:=tree[w].r;
      end
      else begin
        tree[q].l:=tree[w].l;
        tree[q].r:=pre(tree[w].r,m+,r);
      end;
      update(q);
    end;
    exit(q);
  end; function ask(x,y,l,r:longint):longint;
  var m,a,b:longint;
  begin
    if l=r then
    begin
      if tree[y].s-tree[x].s>len then
        exit(sa[l])
      else exit();
    end
    else begin
      m:=(l+r) shr ;
      if tree[y].s-tree[x].s<=len then exit();
      a:=tree[x].l;
      b:=tree[y].l;
      if tree[b].s-tree[a].s>len then exit(ask(a,b,l,m));
      a:=tree[x].r;
      b:=tree[y].r;
      if tree[b].s-tree[a].s>len then exit(ask(a,b,m+,r));
      exit();
    end;
  end; begin
  readln(n,m);
  for i:= to n do
  begin
    read(a[i]);
    b[i]:=i;
  end;
  sort(,n);
  p:=;
  rank[b[]]:=;
  sa[]:=a[];
  for i:= to n do
  begin
    if a[i]<>a[i-] then
    begin
      inc(p);
      sa[p]:=a[i];
    end;
    rank[b[i]]:=p;
  end;
  t:=;
  head[]:=build(,p);
  for i:= to n do
  begin
    inc(sum[rank[i]]);
    head[i]:=pre(head[i-],,p);
  end;
  for i:= to m do
  begin
    readln(x,y);
    len:=(y-x+) shr ;
    writeln(ask(head[x-],head[y],,p));
  end;
end.

bzoj3524 bzoj2223的更多相关文章

  1. [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树

    题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...

  2. [BZOJ2223][BZOJ3524][Poi2014]Couriers 主席树

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2436  Solved: 960[Submit][St ...

  3. 【BZOJ3524/2223】[Poi2014]Couriers 主席树

    [BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...

  4. bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI

    题目链接1 题目链接2 主席树模板题 两题有细节不同 #include<algorithm> #include<iostream> #include<cstdlib> ...

  5. 2018.09.30 bzoj2223: [Coci 2009]PATULJCI(主席树)

    传送门 主席树经典题目. 直接利用主席树差分的思想判断区间中数的个数是否合法然后决定左走右走就行了. 实际上跟bzoj3524是同一道题. 代码: #include<bits/stdc++.h& ...

  6. BZOJ3524 & LOJ2432:[POI2014]代理商Couriers——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i] ...

  7. 【bzoj3524】[Poi2014]Couriers 主席树

    题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...

  8. 【BZOJ3524】Couriers(主席树)

    题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...

  9. [bzoj3524/2223][Poi2014]Couriers_主席树

    Couriers bzoj-3524 Poi-2014 题目大意:给定n个数的序列,询问区间内是否存在一个在区间内至少出现了(区间长度>>1)次的数.如果有,输出该数,反之输出0. 注释: ...

随机推荐

  1. eclipse Ctrl+1 没反应

    今天上午写代码,突然发现Ctrl+1没反应了,顿时无语.昨天还好好的,今天就不行了…… 无奈,只好在网上查了查,据说快捷键冲突的原因比较大. 于是我将Ctrl+1换成了Alt+1.在eclipse中测 ...

  2. 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法

    要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...

  3. Excel表数据导入数据库表中

    ***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...

  4. iOS开发——文本高度

    1.简单的计算文本高度 // 要计算的文本内容 NSString *testString = @"刘成利,软件工程专业毕业,iOS开发者,目前工作于北京,在证券金融领域从事iOS App开发 ...

  5. swift-01-简述swift与OC区别

    swift语言 Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1].在设计Swift时.就有意和Objective-C共存,Objective-C是A ...

  6. 安装aptana插件报Error opening the editor. java.lang.NullPointerException

    Aptana的官方网站下载eclipse的插件:  http://update.aptana.com/update/studio/3.2/ ,可以在线安装也可以下载插件后再安装,我是以在线的形式安装的 ...

  7. sql server 数据库正在使用该文件的解决办法

    今天在帮朋友还原数据库时遇到了一个问题.朋友用的是sql server 2008数据库,本身有一个数据库,他在修改程序的时候,想修改数据库的内容.但是又不想在原数据库中修改.想备份还原出一个数据库然后 ...

  8. 对C#泛型中的new()约束思考

    对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的:<public class Tester<T> where T:new() {  ...

  9. Windows加密视频播放器使用教程

    1.   下载文件 http://pan.baidu.com/s/1c2aESQs 2.    操作流程 温馨提示 播放时,请务必保证播放设备联网(原因:用户名权限验证需要网络,播放后10秒即可关闭网 ...

  10. CentOS6.4 安装aria2多线程下载工具

    aria2是一个Linux下的多线程下载工具,支持HTTP/HTTPS.FTP.BitTorrent.Metalink协议. 平时在linux上下载http上的东西常用如wget.curl命令,但是他 ...