社区讨论

权值线段树求调

P1801黑匣子参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo92nq5k
此快照首次捕获于
2023/10/28 04:34
2 年前
此快照最后确认于
2023/10/28 04:34
2 年前
查看原帖
qwq甚至可以说和第五篇题解是一样的
刚才甚至都找茬了,没找出来
求助
CPP
#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
    int x=0;
    bool w=0;
    char c=getchar();
    while(!isdigit(c))  w|=c=='-',c=getchar();
    while(isdigit(c))   x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return w?-x:x;
}
inline void print(int x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar('0'+x%10);
}
#define ls(x) x<<1
#define rs(x) x<<1|1
#define push_up(p) tree[p]=tree[ls(p)]+tree[rs(p)]
const int N=2e5+5;
int u[N],s[N],tree[N<<1];
int n,m,cnt=1;
struct node{
	int v,num;
	bool operator <(const node &x)	const{
		return v<x.v;
	}
}a[N];
inline void Update(int x,int l,int r,int p){
	if(l==x && r==x){
		tree[p]++;
		return ;	
	}
	tree[p]++;
	int mid=l+r>>1;
	if(x<=mid)	Update(x,l,mid,ls(p));
	else	Update(x,mid+1,r,rs(p));
	push_up(p);
}
inline int Query(int k,int l,int r,int p){
	if(l==r)	return l;
	int mid=l+r>>1;
	if(tree[ls(p)]>=k)	return Query(k,l,mid,ls(p));
	else	return Query(k-tree[ls(p)],mid+1,r,rs(p));
}
signed main(){
	m=read(),n=read();
	for(register int i=1;i<=m;++i)	a[i].v=read(),a[i].num=i;
	for(register int i=1;i<=n;++i)	u[i]=read();
	sort(a+1,a+m+1);
	for(register int i=1;i<=m;++i)	s[a[i].num]=i;
	for(register int i=1;i<=m;++i){
		Update(s[i],1,n,1);
		while(i==u[cnt]){
			printlf(a[Query(cnt,1,n,1)].v);
			++cnt;
		}
	}		
    return 0;
}


回复

9 条回复,欢迎继续交流。

正在加载回复...