• UESTC #1932 一棵像样的线段树


    Description

    题目中定义(mex(a_1,a_2,...,a_n))(a_1,a_2,...,a_n)中最小的未出现的自然数,给出数列({c_i}),定义$$b_i=mex(b_{i-c_i},...,b_{i-1})$$特殊定义(b_0=1),求问(b_i)

    Solution

    我们定义(p[i])为自然数(i)最靠后的出现位置,并用线段树维护(p[i]),每次求(b_i)则可以转化为在线段树上求最小的一个值小于(i-c_i)的位置在哪里。

    Code

    /*
     Author: LargeDumpling
     Email: LargeDumpling@qq.com
     Edit History:
    	2018-07-24	File created.
    */
    
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int MAXN=1000050;
    int data[MAXN<<2],L[MAXN<<2],R[MAXN<<2];
    int n,c[MAXN],b[MAXN];
    void build(int root,int l,int r)
    {
    	L[root]=l; R[root]=r;
    	data[root]=-1;
    	if(l==r) return;
    	int mid=(l+r)>>1;
    	build(root<<1,l,mid);
    	build(root<<1|1,mid+1,r);
    	data[root]=min(data[root<<1],data[root<<1|1]);
    	return;
    }
    void change(int root,int p,int x)
    {
    	if(L[root]==p&&p==R[root])
    	{
    		data[root]=x;
    		return;
    	}
    	if(p<=R[root<<1]) change(root<<1,p,x);
    	else change(root<<1|1,p,x);
    	data[root]=min(data[root<<1],data[root<<1|1]);
    	return;
    }
    int query(int root,int x)
    {
    	if(L[root]==R[root]) return L[root];
    	if(data[root<<1]<x) return query(root<<1,x);
    	return query(root<<1|1,x);
    }
    void read1n(int &x)
    {
    	char ch;
    	for(ch=getchar();ch<'0'||'9'<ch;ch=getchar());
    	for(x=0;'0'<=ch&&ch<='9';ch=getchar())
    		x=(x<<1)+(x<<3)+ch-'0';
    	return;
    }
    int main()
    {
    	read1n(n);
    	build(1,1,n);
    	change(1,1,0);
    	for(int i=1;i<=n;i++)
    	{
    		read1n(c[i]);
    		b[i]=query(1,i-c[i]);
    		change(1,b[i],i);
    		printf("%d ",b[i]);
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
    

    Similar Problems

    BZOJ 2453

  • 相关阅读:
    线段树(题集
    T3——拆分自然数
    P1309 瑞士轮
    普通母函数简单使用
    双向广度优先搜索
    秦九韶算法
    P1043-数字游戏
    网站在阿里云备案的详细全过程详细步骤
    从git拉取代码后经常出现maven窗口不见
    SpringBoot入门教程之打成war包在tomcat容器中执行
  • 原文地址:https://www.cnblogs.com/LargeDumpling/p/9360004.html
Copyright © 2020-2023  润新知