BZOJ1901 Dynamic Rankings
                                            
 5722 단어  dynamic
                    
트리를 만들 수 있을 것 같지만, 코드 능력을 키우기 위해 트리를 썼는데,
역시 코드 능력은 부족한데,
나보다 더 못생긴 코드를 쓰는 사람은 드물다는 것을 인정하지 않을 수 없으니, 개선해야 한다.
Code:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct point{
	int fa,lson,rson;
	int data,muti,size;
}node[400010];
char od,te;
const int maxn=40010;
int top=0,minnum=9999999,maxnum=-9999999,n,vv,cnt;
int tree[maxn],l[maxn],r[maxn],a[maxn],lt[maxn],rt[maxn];
int newsplay(int key){
	top++;
	node[top].size=node[top].muti=1;
	node[top].lson=node[top].rson=node[top].fa=0;
	node[top].data=key;
	return top;
}
void zig(int now){
	int tf=node[now].fa,te=node[now].size-node[node[now].lson].size;
	if	((node[node[tf].fa].lson)==tf)	
		node[node[tf].fa].lson=now;
	else	node[node[tf].fa].rson=now;
	node[tf].rson=node[now].lson;
	node[now].lson=tf;
	node[now].fa=node[tf].fa;node[tf].fa=now;
	if  (node[tf].rson)  node[node[tf].rson].fa=tf;
	node[now].size=node[tf].size;
	node[tf].size-=te;
}
void zag(int now){
	int tf=node[now].fa,te=node[now].size-node[node[now].rson].size;
	if	((node[node[tf].fa].lson)==tf)	
		node[node[tf].fa].lson=now;
	else	node[node[tf].fa].rson=now;
	node[tf].lson=node[now].rson;
	node[now].rson=tf;
	node[now].fa=node[tf].fa;node[tf].fa=now;
	if  (node[tf].lson) node[node[tf].lson].fa=tf;
	node[now].size=node[tf].size;
	node[tf].size-=te;
}
void splay(int root,int now){
	if  (root==now || node[now].fa==root) return  ;
	while   (root!=node[now].fa){
		if  (node[node[now].fa].fa==root){
	    	if  (node[node[now].fa].lson==now)   zag(now);else   zig(now);
	    	return  ;
		}
		if  (node[node[node[now].fa].fa].lson==node[now].fa)
		    if  (node[node[now].fa].lson==now){zag(now);zag(now);}
		    else	{zig(now);zag(now);}
		else
			if  (node[node[now].fa].lson==now){zag(now);zig(now);}
	    	else	{zig(now);zig(now);}
	}
}
void insert(int now,int key){
	int x=now;
	while   (1){
		node[x].size++;
		if  (node[x].data==key){
			node[x].muti++;
			splay(now,x);
			return  ;
		}
		if  (node[x].data>key){
			if  (!node[x].lson){
				node[x].lson=newsplay(key);
				node[node[x].lson].fa=x;
				splay(now,node[x].lson);
				return  ;
			}else   x=node[x].lson;
		}
		else
		    if  (!node[x].rson){
				node[x].rson=newsplay(key);
				node[node[x].rson].fa=x;
				splay(now,node[x].rson);
				return  ;
		    }else   x=node[x].rson;
	}
}
void deldata(int now,int key){
	int x=now;
    while   (1){
		node[x].size--;
		if  (node[x].data==key){
			node[x].muti--;
			return  ;
		}
		if  (node[x].data>key)  x=node[x].lson;
		else x=node[x].rson;
	}
}
int count(int now,int key){
	int res=0,x=now;
	while   (x){
		if  (node[x].data==key){
			res+=node[x].size-node[node[x].rson].size;
			splay(now,x);
			return res;
		}
		if  (node[x].data>key)  x=node[x].lson;
		else{
			res+=node[x].size-node[node[x].rson].size;
			x=node[x].rson;
		}
	}
	return res;
}
void build(int now,int lm,int rm){
	tree[now]=newsplay(a[lm]);
	l[now]=lm;r[now]=rm;
	if  (lm==rm){
		lt[now]=rt[now]=0;
		return  ;
	}
	for (int i=lm+1;i<=rm;i++){
		insert(tree[now],a[i]);
	}
	build(now*2,lm,(lm+rm)/2);
	build(now*2+1,(lm+rm)/2+1,rm);
	lt[now]=now*2;rt[now]=now*2+1;
}
void query(int now,int lm,int rm,int key){
	if  (l[now]>rm || r[now]<lm)    return  ;
	if  (l[now]>=lm && r[now]<=rm){
		cnt+=count(tree[now],key);
		return  ;
	}
	if  (lt[now])   query(lt[now],lm,rm,key);
	if  (rt[now])   query(rt[now],lm,rm,key);
	return  ;
}
void change(int now,int tar,int ori,int key){
	if  (l[now]>tar || r[now]<tar)  return  ;
	deldata(tree[now],ori);
	insert(tree[now],key);
	if  (l[now]!=r[now]){
		change(lt[now],tar,ori,key);
		change(rt[now],tar,ori,key);
	}
	return  ;
}
void scan(int &x){
	te=getchar();
	while   (te<'0' || te>'9')  te=getchar();
	x=te-'0';te=getchar();
	while   (te>='0' && te<='9'){
		x=x*10+te-'0';
		te=getchar();
	}
}
int main(){
	scanf("%d%d",&n,&vv);
	for (int i=1;i<=n;i++){
		int cl;scan(cl);a[i]=cl;
		minnum=min(minnum,a[i]);
		maxnum=max(maxnum,a[i]);
	}
	scanf("
");
	build(1,1,n);
	while   (vv--){
		int cl,cr,th;
		od=getchar();
		if  (od=='Q'){
			scan(cl);scan(cr);scan(th);
			int ll=minnum,rr=maxnum;
			while   (ll<rr){
				cnt=0;
				query(1,cl,cr,(ll+rr)/2);
				if  (cnt>=th)   rr=(ll+rr)/2;
				else    ll=(ll+rr)/2+1;
			}
			printf("%d
",ll);
		}
		else{
			scan(cl);scan(cr);
			minnum=min(minnum,cr);
			maxnum=max(maxnum,cr);
			change(1,cl,a[cl],cr);
			a[cl]=cr;
		}
	}
	return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
API의 데이터가 포함된 Nuxt 2 동적 사이트맵일부 데이터 세트/api에서 사이트맵을 동적으로 구축하려는 경우 이것이 적합합니다. nuxt 프로젝트에서 익스프레스 API를 활성화했는지 여부에 관계없이 이 쉬운 3단계 프로세스를 통해 원하는 결과를 얻을 수 있습니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.