社区讨论
权值线段树求调
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 条回复,欢迎继续交流。
正在加载回复...