「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 =& ...
随机推荐
- Mysql数据库语言学习的路线
对于我们数据库的学习,不管是测试人员还是开发人员以及我们的DBA来说重点都是SQL:但是我们的SQL可以分多少类型,学习重点又是在哪里呢,本文仅仅针对测试人员来展开说明: SQL:structure ...
- Huffman编/译码器(能够实现中英文)
数据结构实训的时候写的一些东西,希望对你们有帮助, 如果转载请标明出处 头文件为 #ifndef TREEHEAD_H_INCLUDED #define TREEHEAD_H_INCLUDED #in ...
- Java程序设计基础笔记 • 【第5章 循环结构】
全部章节 >>>> 本章目录 5.1 while循环结构 5.1.1 循环简介 5.1.2 while循环 5.1.3 while循环的使用 5.1.4 while循环的注 ...
- Ranger-Hdfs插件安装
Ranger-Hdfs插件ranger-0.6.0-hdfs-plugin安装到Hdfs的所有NameNode节点, 其他的DataNode节点不需要安装. 1. 登陆hdfs安装的用户,hdfs/z ...
- JZOJ5409. Fantasy && Luogu2048 [NOI2010]超级钢琴
题目大意 给出一个序列和\(L, R\), 求前k大长度在\([L,R]\)之间的连续子序列的和的和. 解题思路 朴素的想法是对于一个左端点\(p\), 它的右区间取值范围是一个连续的区间即\([p+ ...
- CSS基础-7 盒子模型大小
在盒子模型当中,有些元素是影响盒子大小的. 首先border就会影响盒子的大小. 其次padding也会影响盒子的大小. 例子: .one { width:100px; height:100px; b ...
- html基础 表单标签 input系列 以及优化方法
场景:在网页中显示手机用户信息的表单效果. 如:登录页.注册页标签名:input 用法是通过改变type属性值,来展示不同效果 1.1 html 代码 <!--placeholder 提示符又叫 ...
- 利用pyinstaller给工程打包生成python可执行文件
step1.下载pyinstaller: step2.将pyinstaller的路径加入系统环境变量PATH中:(关键) step3.进入工程的根目录下(即可执行文件.py)所在目录下,cmd,输入命 ...
- Apache Ant: If 和 Unless
目录 If And Unless If And Unless 从 Ant 1.9.1 起,可以在所有的任务和嵌套的元素上以特别的命名空间添加 if 和 unless 属性. In order to u ...
- spring cloud --- config 从git 获取文件【 可能是yml或 properties】遇到有相同字段的取值规则
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 昨天做了 spring cloud config 配置中心 获取存在gi ...