zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    css--display详解
    关于overflow:hidden的作用
    float 应用
    flex 布局
    CSS+DIV布局中absolute和relative的区别
    线程和进程的区别是什么?
    .NET中读写SQL Server数据库需要用到哪些类?作用是什么?
    C# CookieHelper
    git pull/push代码 每次都要输入账户名和密码的解决方法
    git拉取远程分支到本地
  • 原文地址:https://www.cnblogs.com/LargeDumpling/p/9360004.html
Copyright © 2011-2022 走看看