「Ynoi2018」未来日记

区间x->y,kth值...

不管了,先序列分块...

查询

第k值,假定知道每个数的权值,对值域分块。

对于整块,维护前\(i\)个块当中,值域在\(j\)块里以及值为\(j\)的数的个数,可以方便的询问。

对于边角,直接记值域在\(j\)块里以及值为\(j\)的数的个数,显然\(o(\sqrt n)\)。

那么接下来只要先按值域块扫,确定第k值在哪个值域块内,然后块内扫一遍,复杂度\(o(\sqrt n)\)。

修改

对于边角,大力重构,暴力修改 前\(i\)个块当中,值域在\(j\)块里以及值为\(j\)的数的个数。

对于整块,可以维护一个并查集,每个点指向相同权值的位置,用top数组记录每种权值的并查集顶端位置。然后x->y就很轻松了对吧...从左到右逐块累加,修改 前\(i\)块 值域在\(j\)块里以及值为\(j\)的数的个数。

总体复杂度\(o((n+m) \sqrt n)\)。

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
bool cur1;
char buf[10000000],*p1=buf,*p2=buf;
#define Getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,10000000,stdin),p1==p2)?EOF:*p1++
void in(int &r) {
static char c;
r=0;
while(c=Getchar(),c<48);
do r=(r<<1)+(r<<3)+(c^48);
while(c=Getchar(),c>47);
}
const int mn=100005;
const int BLK1=290;
const int BLK2=320;
int n,K,K1,val[mn],F[BLK2][BLK1],T[mn][BLK1];
//F[i][j] 值域i块,在前j块里的数个数
//T[i][j] 值i,在前j块里的数个数
int fa[mn];
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int last[mn],top[BLK1][mn];
#define get_val(x) val[find(x)]
int rebuild(int id,int l1,int r1,int x,int y){
int l=K*id,r=min(K*id+K-1,n),ct=0;
int *tp=top[id];
rep(q,l,r)val[q]=get_val(q),tp[val[q]]=0;
rep(q,l,r){
if(q>=l1&&q<=r1&&val[q]==x)val[q]=y,++ct;
fa[q]=(!last[val[q]]?(tp[val[q]]=q+1,last[val[q]]=q+1):last[val[q]])-1;
}
rep(q,l,r)last[val[q]]=0;
return ct;
}
void cg(int id,int v,int v1,int num){
int *F1=F[v/K1],*F2=F[v1/K1],*T1=T[v],*T2=T[v1];
rep(q,id,n/K){
F1[q]-=num,F2[q]+=num,T1[q]-=num,T2[q]+=num;
}
}
void change(int l,int r,int fr,int to){
if(fr==to)return;
int l_id=l/K,r_id=r/K;
if(l_id==r_id){
int ct=rebuild(l_id,l,r,fr,to);
cg(l_id,fr,to,ct);
}else{
int *td,*F1=F[fr/K1],*F2=F[to/K1],*T1=T[fr],*T2=T[to],num=0;
int ct=rebuild(l_id,l,l_id*K+K-1,fr,to); rep(q,l_id,r_id-1){
F1[q]-=ct,F2[q]+=ct,T1[q]-=ct,T2[q]+=ct;
} ct+=rebuild(r_id,r_id*K,r,fr,to); int ld=T1[l_id+1]-T1[l_id];
rep(q,l_id+1,r_id-1){
num+=ld;
ld=T1[q+1]-T1[q];
F1[q]-=num,F2[q]+=num,T1[q]-=num,T2[q]+=num; td=top[q];
if(td[fr]){
if(td[to])fa[td[fr]-1]=td[to]-1;
else val[td[fr]-1]=to,td[to]=td[fr];
td[fr]=0;
}
}
num+=ct;
rep(q,r_id,n/K){
F1[q]-=num,F2[q]+=num,T1[q]-=num,T2[q]+=num;
}
}
}
int X[BLK2],Y[mn];
int ask(int l,int r,int k){
int l_id=l/K,r_id=r/K;
int ans=0;
if(l_id==r_id){ rep(q,l,r){
int v=get_val(q);
++X[v/K1],++Y[v];
} for(int q=0;;++q){
if(X[q]>=k){
rep(w,q*K1,q*K1+K1-1){
if(Y[w]>=k){
ans=w;
break;
}
k-=Y[w];
}
break;
}
k-=X[q];
} rep(q,l,r){
int v=get_val(q);
--X[v/K1],--Y[v];
}
}else{
rep(q,l,l_id*K+K-1){
int v=get_val(q);
++X[v/K1],++Y[v];
}
rep(q,r_id*K,r){
int v=get_val(q);
++X[v/K1],++Y[v];
} for(int q=0;;++q){
int v=F[q][r_id-1]-F[q][l_id]+X[q];
if(v>=k){
rep(w,q*K1,q*K1+K1-1){
if(T[w][r_id-1]-T[w][l_id]+Y[w]>=k){
ans=w;
break;
}
k-=T[w][r_id-1]-T[w][l_id]+Y[w];
}
break;
}
k-=v;
} rep(q,l,l_id*K+K-1){
int v=get_val(q);
--X[v/K1],--Y[v];
}
rep(q,r_id*K,r){
int v=get_val(q);
--X[v/K1],--Y[v];
}
}
return ans;
}
void init(){
rep(q,0,n)fa[q]=q;
rep(q,0,n/K){
int *tp=top[q];
rep(w,q*K,min(n,q*K+K-1)){
fa[w]=(!last[val[w]]?(tp[val[w]]=w+1,last[val[w]]=w+1):last[val[w]])-1;
}
rep(w,q*K,min(n,q*K+K-1))last[val[w]]=0,++F[val[w]/K1][q],++T[val[w]][q];
if(q){
rep(w,0,100000/K1)F[w][q]+=F[w][q-1];
rep(w,0,100000)T[w][q]+=T[w][q-1];
}
}
}
bool cur2;
int main(){
// cerr<<(&cur2-&cur1)/1024.0/1024<<endl;
in(n);
K=sqrt(n)*1.1+1,K1=320;
--n;
int m,ty,a,b,x,y;
in(m);
rep(q,0,n)in(val[q]);
init();
while(m--){
in(ty),in(a),in(b),in(x);
if(ty==1)in(y),change(a-1,b-1,x,y);
else printf("%d\n",ask(a-1,b-1,x));
}
return 0;
}

「Ynoi2018」未来日记的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. 小试国产开源HTAP分布式NewSQL数据库TiDB-v5.3.0

    概述 定义 TiDB官网 https://pingcap.com/zh/ 最新版本为5.3.0 TiDB GitHub源码 https://github.com/pingcap/tidb TiDB是由 ...

  2. Towards Evaluating the Robustness of Neural Networks

    目录 概 主要内容 基本的概念 目标函数 如何选择c 如何应对Box约束 attack attack attack Nicholas Carlini, David Wagner, Towards Ev ...

  3. 【ElasticSearch】异常 Request cannot be executed; I/O reactor status: STOPPED

    Caused by: java.lang.RuntimeException: Request cannot be executed; I/O reactor status: STOPPED at or ...

  4. Oracle的dbf文件迁移

    1.背景说明 在Oracle数据库中插入了1.5亿条数据, 并且创建了主键索引, 又插入了1.5亿条数据到另外一张表, 导致数据库表空间暴涨到28G, 由于根目录下只有50G的空间, 数据库文件所在磁 ...

  5. DRF框架在嵌套关系下实现嵌套对象字段的过滤

    当需要对关联对象的字段进行选择性显示时,在所对应的serializer类中声明引用的字段. 例如: class TrackSerializer(serializers.ModelSerializer) ...

  6. django中写入数据时给密码加密

    方法一.在自定义的form表单中重写save方法: 方法二.使用信号量来实现 1. 在应用的模块下新建signal.py文件 2.编写回调函数,内容如下: 3. 在应用的app.py文件中的ready ...

  7. linux 下安装minconda3

    一.关于bashrc目录,此文件是隐藏的,如果要打开此文件需要用: vim /root/.bashrc 二.linux下关于防火墙的命令 1.查看防火墙状态 firewall-cmd --state ...

  8. vs2017 winform 组件 -- 总结

    1.ComboBox  [下拉框] (1) 添加选项 this.[控件名].Items.Add("内容") (2)设置下拉框 自动完成 模式 和 数据源 this.[控件名].Au ...

  9. Go语言系列之标准库fmt

    fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输入内容两大部分. 向外输出 标准库fmt提供了以下几种输出相关函数. Print Print系列函数会将内容 ...

  10. WinMain是如何被调用的

    WinMain函数 WinMain函数原型 Win32应用程序的入口函数为WinMain,函数原型在WinBase.h文件中: int WINAPI WinMain (     _In_ HINSTA ...