当前位置:网站首页>Weight line segment tree + line segment tree split/merge + CF1659D
Weight line segment tree + line segment tree split/merge + CF1659D
2022-07-30 04:34:00 【Follow a certain R in the distance】
如果一个01数组A进行n次排序,第i次sort前i个,can be formed in the processn个序列,Add the correspondences of these sequences to form a new sequenceC.
现在给定C,Find the original sequence that meets the requirementsA
The context of the topic is rather special,There is a more ingenious construction method,Each location was analyzed1Contribution to before and after.
重要的一点是:如果这个位置是0,但是对应的cThe array has a value at this position,Then a conclusion should be drawn,next positionC[i]-1All positions are1.
#include <iostream>
#define endl '\n'
using namespace std;
const int N=2e5+100;
int a[N],b[N];
int main()
{
int t;
for(cin>>t;t;t--)
{
int n,p=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=0;
}
for(int i=1;i<=n;i++)
{
if(p<i)
{
if(a[i])
b[i]=1;
else
b[i]=0;
}
if(b[i]==1)
{
for(++p;p<=a[i];++p)
b[p]=1;
b[p]=0;
}
else
{
for(++p;p<=a[i]+i-1;++p)
b[p]=1;
b[p]=0;
}
}
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
}
return 0;
}
The understanding of the split operation is really not very thorough,Still need to ponder,Other aspects are common operations such as:动态开点,nA line segment tree or something,There are also some operations on the weight segment tree.
#include <bits/stdc++.h>
#define int long long
#define ls lson[rt]
#define rs rson[rt]
#define mid ((l+r)>>1)
#define endl '\n'
#define fastio cout.tie(0);cin.tie(0);ios::sync_with_stdio(0)
using namespace std;
const int N = 2e5+100;
int gra[N<<5],tree[N<<5],lson[N<<5],rson[N<<5],cnt,tot,root[N<<5],a[N],seq=1,n,m;
int new_node()
{
return cnt?gra[cnt--]:++tot;
}
void del_node(int p)
{
gra[++cnt]=p;
tree[p]=0;lson[p]=0;rson[p]=0;
return ;
}
void fix(int &rt,int l,int r,int num,int x)
{
if(!rt)
rt=new_node();
tree[rt]+=x;
if(l==r)
return ;
if(num<=mid)
fix(ls,l,mid,num,x);
else
fix(rs,mid+1,r,num,x);
}
int query_num(int rt,int l,int r,int nl,int nr)
{
if(l>nr||r<nl)
return 0;
if(nl<=l&&r<=nr)
return tree[rt];
return query_num(ls,l,mid,nl,nr)+query_num(rs,mid+1,r,nl,nr);
}
int query_kth(int rt,int l,int r,int num)
{
if(l==r)
return l;
if(tree[ls]>=num)
return query_kth(ls,l,mid,num);
else
return query_kth(rs,mid+1,r,num-tree[ls]);
}
int merge(int x,int y)
{
if(!x||!y)
return x+y;
tree[x]+=tree[y];
lson[x]=merge(lson[x],lson[y]);
rson[x]=merge(rson[x],rson[y]);
del_node(y);
return x;
}
void split(int x,int &y,int k)
{
if(x==0)
return;
y=new_node();
int v=tree[lson[x]];
if(k>v)
split(rson[x],rson[y],k-v);
else
swap(rson[x],rson[y]);
if(k<v)
split(lson[x],lson[y],k);
tree[y]=tree[x]-k;
tree[x]=k;
return ;
}
signed main()
{
//fastio;
cin>>n>>m;
for(int i=1,temp;i<=n;i++)
{
cin>>temp;
fix(root[1],1,n,i,temp);
}
for(int i=1,op,p,k,x,q,y,t;i<=m;i++)
{
cin>>op;
if(op==0)
{
cin>>p>>x>>y;
int k1=query_num(root[p],1,n,1,y);
int k2=query_num(root[p],1,n,x,y);
int temp=0;
split(root[p],root[++seq],k1-k2);
split(root[seq],temp,k2);
root[p]=merge(root[p],temp);
}
if(op==1)
{
cin>>p>>t;
root[p]=merge(root[p],root[t]);
}
if(op==2)
{
cin>>p>>x>>q;
fix(root[p],1,n,q,x);
}
if(op==3)
{
cin>>p>>x>>y;
cout<<query_num(root[p],1,n,x,y)<<endl;
}
if(op==4)
{
cin>>p>>k;
if(tree[root[p]]<k)
{
cout<<-1<<endl;
continue;
}
cout<<query_kth(root[p],1,n,k)<<endl;
}
}
return 0;
}
/* 5 12 0 0 0 0 0 2 1 1 1 2 1 1 2 2 1 1 3 3 1 1 3 4 1 2 2 1 1 4 2 1 1 5 0 1 2 4 2 2 1 4 3 2 2 4 1 1 2 4 1 3 */
权值线段树,What I understand is resettable segment trees.An unordered array is given,An ordered segment tree is constructed after several insertion operations,Each node represents how many values this interval has,The leaf nodes represent the number of occurrences of each value.
常见的操作有:
离散化,动态开点,查询区间第k小/大,The number of query intervals,增加/删除x个点/数.
#include<bits/stdc++.h>
#define ls lson[rt]
#define rs rson[rt]
#define mid ((l+r)>>1)
using namespace std;
const int N = 1e7+100;
int m;
int lson[N<<2],rson[N<<2],tree[N<<2],cnt,root;
void up(int rt)
{
tree[rt]=tree[ls]+tree[rs];
}
void fix(int &rt,int l,int r,int p,int v)
{
if(!rt)
{
rt=++cnt;
}
if(l==r)
{
tree[rt]+=v;
return ;
}
if(p<=mid)
fix(ls,l,mid,p,v);
if(p>mid)
fix(rs,mid+1,r,p,v);
up(rt);
}
int query_num(int rt,int l,int r,int pl,int pr)
{
int ans=0;
if(pl<=l&&r<=pr)
return tree[rt];
if(pl<=mid)
ans+=query_num(ls,l,mid,pl,pr);
if(pr>mid)
ans+=query_num(rs,mid+1,r,pl,pr);
return ans;
}
int query_kth(int rt,int l,int r,int k)
{
if(l==r)
return l;
int s=tree[ls];
if(k<=s)
return query_kth(ls,l,mid,k);
else
return query_kth(rs,mid+1,r,k-s);
}
map<int,int> ma;
int main()
{
scanf("%d",&m);
while(m--)
{
int opt,x;scanf("%d%d",&opt,&x);
if(opt==1)
{
fix(root,1,N*2,x+N,1);//The absolute value given in the title is less than or equal to1e7So here we need to move the negative value field to the positive number
ma[x]++;
}
if(opt==2)
{
fix(root,1,N*2,x+N,-1);
ma[x]--;
if(ma[x]==0)
ma.erase(x);
}
if(opt==3)
{
printf("%d\n",query_num(root,1,N*2,1,x+N-1)+1);
}
if(opt==4)
{
printf("%d\n",query_kth(root,1,N*2,x)-N);
}
if(opt==5)
printf("%d\n",(--ma.lower_bound(x))->first);
if(opt==6)
printf("%d\n",(ma.upper_bound(x))->first);
}
return 0;
}
边栏推荐
- 【软件工程之美 - 专栏笔记】31 | 软件测试要为产品质量负责吗?
- DAY17, CSRF vulnerability
- 2.5快速排序
- SSM框架简单介绍
- Go 学习笔记(84)— Go 项目目录结构
- [Awards every week] The "Edge Containers" track of the Cloud Native Programming Challenge invites you to fight!
- JQ source code analysis (environment)
- 基于OpenCV实现的图像拼接(配准)案例
- sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
- 图像视角矫正之透视变换矩阵(单应矩阵)/findHomography 与 getPerspectiveTransformd的区别
猜你喜欢
![[Linear table] - Detailed explanation of three practice questions of LeetCode](/img/71/91ba0cc16fe062c1ac9e77e1cc8aa2.png)
[Linear table] - Detailed explanation of three practice questions of LeetCode

GCC Rust获批将被纳入主线代码库,或将于GCC 13中与大家见面

图像视角矫正之透视变换矩阵(单应矩阵)/findHomography 与 getPerspectiveTransformd的区别

KubeMeet 报名 | 「边缘原生」线上技术沙龙完整议程公布!

DAY17、CSRF 漏洞

How to use labelme

A brief introduction to the SSM framework

在麒麟V10操作系统上安装MySQL数据库

深圳见!云原生加速应用构建专场:来看云原生 FinOps、SRE、高性能计算场景最佳实践

Shell脚本基本编辑规范及变量
随机推荐
Android Studio 实现登录注册-源代码 (连接MySql数据库)
MySQL 操作语句大全(详细)
共建共享数字世界的根:阿里云打造全面的云原生开源生态
[MRCTF2020]Hello_misc
《构建之法》笔记---第十章 典型用户和场景
Android Studio implements login registration - source code (connecting to MySql database)
KubeMeet Registration | The complete agenda of the "Edge Native" Online Technology Salon has been announced!
山西省第二届网络安全技能大赛(企业组)部分赛题WP(十)
代码开源设计实现思路
Unity beginner 5 cameras follow, border control and simple particle control (2 d)
Go书籍大全-从初级到高级以及Web开发
[C language] Program environment and preprocessing
如何与墨西哥大众VW Mexico建立EDI连接
My first experience of Go+ language——Blessing message system, so that she can also feel your blessings
成为一个合格的网安,你知道这些吗?
Based on all volunteers - H and D1 XR806 rare plant monitoring device
网页元素解析a标签
Shell脚本基本编辑规范及变量
【C语言】程序环境和预处理
Golang eight-legged text finishing (continuous handling)