BZOJ 3542 [Poi2014]Couriers ——可持久化线段树

news/2024/7/4 3:46:47

【题目分析】

    查找区间内出现次数大于一半的数字。

    直接用主席树,线段树上维护区间大小,由于要求出现次数大于一半,每到一个节点可以分治下去。

    时间复杂度(N+Q)logN

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
 
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
 
using namespace std;
 
#define maxn 500005
#define mlog 30
#define inf (0x3f3f3f3f)
 
int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
 
int rt[maxn],ls[maxn*mlog],rs[maxn*mlog],siz[maxn*mlog],idx=0;
 
int n,m,x,a[maxn];
 
int ins(int o,int l,int r,int x)
{
    int k=++idx; siz[k]=siz[o]+1; int mid=(l+r)/2;
    if (l==r) return k;
    if (x<=mid) rs[k]=rs[o],ls[k]=ins(ls[o],l,mid,x);
    else ls[k]=ls[o],rs[k]=ins(rs[o],mid+1,r,x);
    return k;
}
 
int query(int o1,int o2,int l,int r,int tim)
{
//  printf("%d %d\n",l,r);
    if (l==r)
    {
        if (siz[o2]-siz[o1]>tim) return l;
        else return 0;
    }
    if (siz[ls[o2]]-siz[ls[o1]]>siz[rs[o2]]-siz[rs[o1]])
        return query(ls[o1],ls[o2],l,(l+r)/2,tim);
    else return query(rs[o1],rs[o2],(l+r)/2+1,r,tim);
}
 
int main()
{
    n=read();m=read();
    for (int i=1;i<=n;++i) a[i]=x=read(),rt[i]=ins(rt[i-1],1,n,x);
//  for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n");
    for (int i=1;i<=m;++i)
    {
        int l=read(),r=read();
//      printf("ask for %d to %d\n",l,r);
        if (l==r)
        {
//          printf("l == r\n");
            printf("%d\n",a[r]);
        }
        else printf("%d\n",query(rt[l-1],rt[r],1,n,(r-l+1)/2));
    }
}

  

转载于:https://www.cnblogs.com/SfailSth/p/6195085.html


http://www.niftyadmin.cn/n/2436251.html

相关文章

Linux系统从指定目录下的所有文件中查找某个关键字

2019独角兽企业重金招聘Python工程师标准>>> 命令 find test/ -name *.* | xargs grep "hello" 该命令主要应用于仅记住了某个文件中的部分内容&#xff0c;但已不记得该文件的具体名字&#xff0c;或者所在路径&#xff0c;那么可以使用此命令根据 记住的…

JAVA NIO简单实现Socket Server

为什么80%的码农都做不了架构师&#xff1f;>>> 使用JAVA NIO简单实现Socket Server package com.flyer.cn.javaIO;import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio…

LeetCode-448. Find All Numbers Disappeared in an Array C#

Given an array of integers where 1 ≤ a[i] ≤ n (n size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this array. Could you do it without extra space and in O(n) runtime? You…

MyBatisPlus 入门学习笔记(版本:3.4.3)

文章目录学习辅助资料MyBatisPlus概述1. MyBatisPlus是什么2. 特性快速开始1. 创建数据库 mybatis_plus2. 导入相关依赖3. 数据源配置3. 快速开始3.1 User实体类编写3.2 mapper编写3.3 启动类设置3.4 测试配置日志Mapper层自带的的CRUD方法1. Insert插入操作1.1 产生奇妙ID的原…

利用反射机制获取属性的值遇到的坑

类&#xff1a; public Class Test { public string name; public string value; } Test tnew Test(); t.name"abc"; t.value"123"; string str(string)t.GetType().GetProperty("name").GetValue(t,null); 找了3个小时&#xff0c;都找不出问题…

IDEA常用快捷键和Live Templates for Mac

1. IDEA常用快捷键 CmdShiftEnter&#xff1a;将输入的if&#xff0c;for&#xff0c;函数等等补上{}或者&#xff1b;使代码语句完整ShiftEnter&#xff1a;在当前行的下方开始新行OptEnter: 正则表达式验证CmdOptEnter&#xff1a;在当前行的上方插入新行OptEnter: 代码快速…

Qt 查找功能

版权声明该文章原创于Qter开源社区&#xff08;www.qter.org&#xff09;&#xff0c;作者yafeilinux&#xff0c;转载请注明出处&#xff01;导语这一篇我们来加上查找菜单的功能。因为要涉及Qt Creator的很多实用功能&#xff0c;所以单独用一篇文章来介绍。以前都用设计器设…

Git入门笔记

文章目录0. Git原理简述1. 设置用户签名 git config2. 初始化本地库 git init3. 查看本地库状态 git status4. 本地文件添加到暂存区 git add5. 暂存区的文件提交到本地库 git commit6. 查看历史版本 git reflog7. 修改文件后提交到本地库8. 版本穿梭9. Git分支9.1 查看分支9.2…