「Ynoi2018」未来日记
「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」未来日记的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「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 =& ...
随机推荐
- Java基础(八)——IO流1_字节流、字符流
一.概述 1.介绍 I/O是 Input/Output 的缩写,IO流用来处理设备之间的数据传输,如读/写文件,网络通讯等.Java对数据的操作是通过流的方式进行.java.io 包下提供了各种&qu ...
- 深度探索 OpenStack Neutron:BGP(1) 【转载】
3.4 BGP 原文地址:http://mp.weixin.qq.com/s?src=3×tamp=1500043305&ver=1&signature=XwiIVV ...
- Robust Pre-Training by Adversarial Contrastive Learning
目录 概 主要内容 代码 Jiang Z., Chen T., Chen T. & Wang Z. Robust Pre-Training by Adversarial Contrastive ...
- 解决Java保存到数据库中文乱码问题,加useUnicode=true&characterEncoding=UTF-8
Java保存到数据库中文乱码, 解决方法如下: 我们在连接MySQL数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8,但是问什 ...
- CAD快速入门--绝望
从入门到放弃 咱是革命一块砖,哪里需要哪里搬.(需求来自领导,让我一个敲代码的画CAD图纸,可以想象我在一个什么样的公司,在为什么样的老板赚钱,不多说了下面开始学习). CAD绘图功能优化与基本操作 ...
- Azure Terraform(九)GitHub Actions 实现 Infra 资源的自动化部署
思路浅析 使用 Terraform Code 部署 Azure 基础设施资源是特别受欢迎的,我曾经有写文章分享过利用 Azure DevOps 自动部署 Terraform Code 所描述的 Azu ...
- Python_列表比较大小
比较原理 从第一个元素顺序开始比较,如果相等,则继续,返回第一个不相等元素得比较结果.如果所有元素比较均相等,则长的列表大,一样长则两列表相等. 示例 a = [5, 6, 3] b = [5, 4, ...
- vue3 父菜单渲染出来了,但是子菜单渲染不出来的原因
子菜单始终渲染不出来,控制台出现警告如下: 在查看框架源码时,发现在渲染时应用了递归.在这个博客找到答案,原因是升级的vue的版本没有升级@vue/compiler-sfc的版本,这两个版本应该保持一 ...
- 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据
初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...
- [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push('/')没有效果
问题描述: 1. 如图所示的项目结构目录, axios.js 文件负责拦截全局请求和回复,我在拦截回复的代码中写了:如果服务器回复了一个401错误,则执行Router.push('/'),但是该方法失 ...