zoukankan      html  css  js  c++  java
  • [CF911G] Mass Change Queries

    线段树合并裸题

    #include <bits/stdc++.h>
    const int N=2e5+5;
    
    int tot,rt[101],ans[N];
    struct Node {int ls,rs;} t[N*200];
    
    void insert(int&x,int l,int r,int p) {
    	if(!x) x=++tot; 
    	if(l==r) return;
    	int mid=(l+r)>>1;
    	if(p<=mid) insert(t[x].ls,l,mid,p);
    	else insert(t[x].rs,mid+1,r,p);
    }
    void merge(int&x,int&y,int l,int r) {
    	if(!x) return;
    	if(!y) {y=x; x=0; return;}
    	if(l==r) return;
    	int mid=(l+r)>>1;
    	merge(t[x].ls,t[y].ls,l,mid);
    	merge(t[x].rs,t[y].rs,mid+1,r);
    	x=0;
    }
    void move(int&x,int&y,int l,int r,int L,int R) {
    	if(!x) return;
    	if(L<=l&&r<=R) return merge(x,y,l,r);
    	if(!y) y=++tot;
    	int mid=(l+r)>>1;
    	if(L<=mid) move(t[x].ls,t[y].ls,l,mid,L,R);
    	if(mid<R) move(t[x].rs,t[y].rs,mid+1,r,L,R);
    }
    void release(int x,int l,int r,int T) {
    	if(!x) return;
    	if(l==r) {ans[l]=T; return;}
    	int mid=(l+r)>>1;
    	release(t[x].ls,l,mid,T);
    	release(t[x].rs,mid+1,r,T);
    }
    
    int main() {
    	int n,Q;
    	scanf("%d",&n);
    	for(int x,i=1; i<=n; ++i) {
    		scanf("%d",&x);
    		insert(rt[x],1,n,i);
    	}
    	scanf("%d",&Q);
    	for(int l,r,x,y; Q--; ) {
    		scanf("%d%d%d%d",&l,&r,&x,&y);
    		if(x!=y) // 注意被卡
    			move(rt[x],rt[y],1,n,l,r);
    	}
    	for(int i=1; i<=100; ++i) release(rt[i],1,n,i);
    	for(int i=1; i<=n; ++i) printf("%d ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    [HNOI2006]超级英雄
    [CTSC1999]家园
    火星探险问题
    [HNOI2008]GT考试
    [USACO14DEC]后卫马克Guard Mark
    [NOI2018]归程
    [USACO15DEC]最大流Max Flow
    [NOIPlus]斗地主
    [LUOGU] P3128 [USACO15DEC]最大流Max Flow
    [BZOJ] 1878: [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/nosta/p/11043501.html
Copyright © 2011-2022 走看看