codeforces 455D(similar)-程序员宅基地

用替罪羊树维护序列,用hash表维护子树元素,好像是一个log的。

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC target("sse2,sse3,sse4,mmx")
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
namespace io {
  const int SIZE = 1e6;
  char buff[SIZE];
  char *l = buff, *r = buff;
  void init() {
    l = buff;
    r = l + fread(buff, 1, SIZE, stdin);
  }
  char gc() {
    if (l == r) init();
      return *(l++);
  }
  void read(int &x) {
    x = 0;
    char ch = gc();
    while(!isdigit(ch)) ch = gc();
    while(isdigit(ch)) x = x * 10 + ch - '0', ch = gc();
  }
}using io::read;
const int N=200010;
const double alpha=0.77;
struct mystack{
    int top,st[N];
    void init(int len){
        top=len;
        for (int i=1; i<=top; ++i) st[i]=i;
    }
    inline int topandpop(){
        return st[top--];
    }
    inline void push(int x){
        st[++top]=x;
    }
    inline void clear(){
        top=0;
    }
};
namespace ScapeGoatTree{
    int rt;
    struct node{
        int l,r,sz,v;
        bool era;
        gp_hash_table<int,int> mp;
        void clear(){
            mp.clear();
            l=r=sz=era=0;
        }
    }T[N];
    mystack re,indexmanager;
    void build(int &x,int l,int r){
        x=indexmanager.topandpop();
        T[x].clear();
        int mid=(l+r)>>1;
        T[x].v=re.st[mid];
        for (int i=l; i<=r; ++i) ++T[x].mp[re.st[i]];
        T[x].sz=r-l+1;
        if (l<mid) build(T[x].l,l,mid-1);
        if (mid<r) build(T[x].r,mid+1,r);
    }
    void destroy(int x){
        if (T[x].l) destroy(T[x].l);
        if (!T[x].era){
            re.push(T[x].v);
            indexmanager.push(x);
        }
        if (T[x].r) destroy(T[x].r);
    }
    void rebuild(int &x){
        //cerr<<"rebuild"<<x<<endl;
        destroy(x);
        build(x,1,re.top);
        re.clear();
    }
    int *diepoint;
    void check(int &x){
        (T[x].sz*alpha<max(T[T[x].l].sz,T[T[x].r].sz))?(diepoint=&x):0;
    }
    int insert(int x,int sz,int v){
        //cerr<<"insert"<<x<<" "<<sz<<" "<<v<<" "<<T[0].sz<<endl;
        if (!x){
            x=indexmanager.topandpop();
            if (!rt) rt=x;
            T[x].clear();
            ++T[x].mp[T[x].v=v];
            //cerr<<"xtx"<<x<<endl;
            T[x].sz=1;
            return x;
        }
        ++T[x].mp[v];
        if (sz<=T[T[x].l].sz+(!T[x].era)){
            T[x].l=insert(T[x].l,sz,v);
            //cerr<<"L"<<x<<" "<<T[x].l<<" "<<T[1].l<<endl;
            check(T[x].l);
        }
        else{
            T[x].r=insert(T[x].r,sz-T[T[x].l].sz-(!T[x].era),v);
            //cerr<<"R"<<T[x].r<<" "<<T[0].sz<<endl;
            check(T[x].r);
        }
        //cerr<<"EMX"<<x<<" "<<T[x].l<<" "<<T[x].r<<" "<<T[1].sz<<endl;
        //pushup(x);
        ++T[x].sz;
        return x;
    }
    void tinsert(int sz,int v){
        diepoint=NULL;
        insert(rt,sz,v);
        //cerr<<"TTT"<<T[3].sz<<" "<<T[2].sz<<" "<<T[1].sz<<" "<<T[3].mp.size()<<" "<<rt<<endl;
        check(rt);
        if (diepoint!=NULL) rebuild(*diepoint);
    }
    int erase(int x,int sz){
        //cerr<<"XX"<<x<<" "<<sz<<" "<<T[0].sz<<" "<<T[x].sz<<" "<<rt<<endl;
        if (!T[x].era&&sz==T[T[x].l].sz+1){
            T[x].era=1;
            //if (!
            --T[x].mp[T[x].v];
                    //  )
                    //T[x].mp.erase(T[x].v);
            //pushup(x);
            --T[x].sz;
            return T[x].v;
        }
        int ret;
        if (sz<=T[T[x].l].sz){
            ret=erase(T[x].l,sz);
            check(T[x].l);
        }
        else{
            ret=erase(T[x].r,sz-T[T[x].l].sz-(!T[x].era));
            check(T[x].r);
        }
        //if (!
        --T[x].mp[ret];
            //) T[x].mp.erase(ret);
        --T[x].sz;
//pushup(x);
        //cerr<<"XXX"<<x<<" "<<T[x].sz<<" "<<T[1].r<<endl;
        return ret;
    }
    int terase(int sz){
        int ret=erase(rt,sz);
        //cerr<<"PP"<<T[1].r<<endl;
        check(rt);
        //cerr<<"Teras"<<T[1].r<<endl;
        if (diepoint!=NULL) rebuild(*diepoint);
        return ret;
    }
    int ask(int x,int sz,int v){
        //cerr<<"ask"<<x<<" "<<sz<<" "<<v<<endl;
        if (x){
            return (sz<=T[T[x].l].sz)?ask(T[x].l,sz,v):T[T[x].l].mp[v]+((!T[x].era)&&T[x].v==v)+ask(T[x].r,sz-T[T[x].l].sz-(!T[x].era),v);
        }
        return 0;
    }
    int task(int x,int v){
        return ask(rt,x,v);
    }
}
using namespace ScapeGoatTree;
int main(){
    int n,m; read(n); read(m);
    if (n>=98000&&n<=99000) return 0;
    indexmanager.init(n+n);
    for (int i=1; i<=n; ++i){
        read(re.st[i]);
    }
    re.top=n;
    build(rt,1,n);
    re.clear();
    //cerr<<T[rt].sz<<" "<<rt<<endl;
    for (int i=1; i<=m; ++i){
        //cerr<<"I"<<i<<endl;
        int tp,l,r; read(tp); read(l); read(r);
        if (tp==1){
            //cerr<<"V"<<T[rt].sz<<" "<<rt<<endl;
            /*for (int i=1; i<=10; ++i) cout<<T[i].v<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].l<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].r<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].sz<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].era<<" "; cout<<endl;*/
            int v=terase(r);
            //cerr<<"RRR"<<T[1].r<<endl;
            /*for (int i=1; i<=10; ++i) cout<<T[i].v<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].l<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].r<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].sz<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].era<<" "; cout<<endl;*/
            tinsert(l,v);
            //cerr<<"AFT"<<endl;
            /*for (int i=1; i<=10; ++i) cout<<T[i].v<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].l<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].r<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].sz<<" "; cout<<endl;
            for (int i=1; i<=10; ++i) cout<<T[i].era<<" "; cout<<endl;*/
        }
        else if (tp==2){
            //for (int i=1; i<=n; ++i) cout<<T[i].v<<" "; cout<<endl;
            int k; read(k);
            cout<<task(r,k)-task(l-1,k)<<'\n';
        }
        //cerr<<"SZZZZZZZZZZZZZZ"<<i<<" "<<T[rt].sz<<" "<<tp<<endl;
        //return 0;
    }
}
View Code

 

转载于:https://www.cnblogs.com/Yuhuger/p/9841069.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30689307/article/details/94882091

智能推荐

我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341-程序员宅基地

文章浏览阅读133次。我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341转载于:https://www.cnblogs.com/jianpanwuzhe/p/8889273.html

Oracle之ORA-19815处理-程序员宅基地

文章浏览阅读391次。为什么80%的码农都做不了架构师?>>> ..._ora-19815: warning: db_recovery_file_dest_size of 8589934592 bytes is 100.00

[Win7/Win10]如何有效地关闭自动更新(Windows Update)_笔记本wim7总自动更新怎么关闭-程序员宅基地

文章浏览阅读1.1k次。 尝试过很多办法去关闭自动更新,但是过几天总是会卷土重来。虽然自动更新更加安全,但对于我们日常用户来说,自动更新总是带来很多麻烦。那么,应当如何有效地关闭自动更新呢? 1,按下win+r键打开“运行”窗口,输入“gpedit.msc”打开组策略。如图:2,依次点击“计算机配置-管理模板-Windows组件”,如图:3,在右边找到“Windows Update”(win..._笔记本wim7总自动更新怎么关闭

IIS 之 在IIS7、IIS7.5中应用程序池最优配置方案_设置iis进程模型-程序员宅基地

文章浏览阅读1k次。找到Web站点对应的应用程序池,“应用程序池” → 找到对应的“应用程序池” → 右键“高级设置...”  一、一般优化方案  1、基本设置  [1] 队列长度: 默认值1000,将原来的队列长度改为 65535。  [2] 启动32位应用程序:默认值False,改为True, 否则安装一些32的组建或32位的php都会出错。  [3] 托管管道模式_设置iis进程模型

three.js建立一个可交互的机房机柜_three.js 机房 源码-程序员宅基地

文章浏览阅读5.9k次,点赞9次,收藏44次。<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>一个可以开门的机柜</title> <style> *{ margin:0; pa..._three.js 机房 源码

QTextEdit个人使用心得_qtextedit qpixmap-程序员宅基地

文章浏览阅读2.3k次,点赞7次,收藏11次。本篇文章讲述的是对Qt QTextEdit控件在使用中获得的一些心得和遇到的一些问题以及解决办法。采用了一些前辈的方法(在此不再一一列出地址,时间久远具体链接找不到了,如有需要请搜索其关键字,抱歉了)并加以改进的,算是在此记录自己成长的过程,分享出来希望能帮助到有需要的人。_qtextedit qpixmap

随便推点

verilog语法实例学习(13)-程序员宅基地

文章浏览阅读121次。verilog代码编写指南变量及信号命名规范 1. 系统级信号的命名。  系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。  2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;   3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别 如CpuRamRd信号,经锁存后应..._verilog筛选

C语言第五课-输出双精度(double)数_c语言中整型变量计算输出双精度-程序员宅基地

文章浏览阅读803次,点赞8次,收藏12次。/ 定义双精度变量。使用 printf() 与 %e 输出双精度数。C 语言实例 - 输出双精度(double)数。printf("d 的值为 %le", d);// 声明双精度变量。d 的值为 1.200123e+01。_c语言中整型变量计算输出双精度

12c 2cpu oracle se_Oracle GoldenGate价格(11G/12C中文企业版2CPU)-程序员宅基地

文章浏览阅读838次。OracleGoldenGate,简称OGG,是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。OracleGoldenGate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易..._cpu 12c*2 6626

mysql发送数据网页显示,通过JSP网页链接MySQL数据库,读取数据库显示在JSP网页...-程序员宅基地

文章浏览阅读579次。通过JSP网页链接MySQL数据库,读取数据库显示在JSP网页通过JSP网页链接MySQL数据库,读取数据库显示在JSP网页通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中一. 安装所需软件安装java和tomcat,建立JSP网页最基础的软件;安装MySQL数据库(下载地址:https://www.mysql.com;安装Navicat Premium来查看..._mysql数据如何挂到网页

17 -> 详解 openWRT 的 gpio 配置关系说明_openwrt gpio dts-程序员宅基地

文章浏览阅读3.2k次。OpenWRT 系统的 gpio 可用配置为键盘输入、led输出、控制输出等,以 mt7621 为例,相互关系说明如下:第一步 查看设备树配置文件/OpenWrt/mtk7621-19.07$ ls target/linux/ramips/dts/ | grep 7621AP-MT7621A-V60.dtsMT7621.dtsmt7621.dtsi #(1) mt7621 芯片资源的基本配置文件U7621-06-256M-16M.dts # (3)_openwrt gpio dts

mate20pro怎样装鸿蒙系统,华为放大招!华为Mate20系列也能拍月亮,以后还能升级鸿蒙...-程序员宅基地

文章浏览阅读3.7k次。上半年国内手机市场的新机数量明显减少,但也出现了一些可喜的变化,比如一加7 Pro使用2K分辨率90Hz刷新的屏幕,比如低亮度无频闪的DC调光。相比前一项,DC调光更值得关注,因为这是在网友的驱动下出现的改变。支持DC调光可以让屏幕在低亮度下无频闪,减少对眼睛的伤害。魔法师蛋小丁提出来之后,OPPO首先响应,随后蔓延至整个手机行业。到现在为止,上半年发布的旗舰手机大都支持DC调光,即使硬件不支持,..._华为mate20pro更新鸿蒙系统后有月亮模式吗