zoukankan      html  css  js  c++  java
  • 【洛谷4587】 [FJOI2016]神秘数(主席树)

    传送门

    BZOJ
    然而是权限题
    洛谷

    Solution

    发现题目给出的一些规律,emm,如果我们新凑出来的一个数,那么后面一个数一定是(sum+1)
    于是就可以主席树随便维护了!

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    inline int gi(){int x;scanf("%d",&x);return x;}
    const int N=100010;
    int rt[N],tot;
    int n,a[N];
    struct node
    {
    	int ls,rs,val;
    }t[N*200];
    void modify(int&x,int l,int r,int pos)
    {
    	t[++tot]=t[x];
    	x=tot;
    	t[x].val+=pos;
    	if(l==r)return;
    	int mid=(l+r)>>1;
    	if(pos<=mid)modify(t[x].ls,l,mid,pos);
    	else modify(t[x].rs,mid+1,r,pos);
    }
    int query(int x,int y,int l,int r,int pos)
    {
    	if(l==r)return t[y].val-t[x].val;
    	int mid=(l+r)>>1;
    	if(pos<=mid)return query(t[x].ls,t[y].ls,l,mid,pos);
    	else return query(t[x].rs,t[y].rs,mid+1,r,pos)+t[t[y].ls].val-t[t[x].ls].val;
    }
    int main()
    {
    	n=gi();
    	for(int i=1;i<=n;i++)a[i]=gi();
    	for(int i=1;i<=n;i++)
    	{
    		rt[i]=rt[i-1];
    		modify(rt[i],1,1e9,a[i]);
    	}
    	int m=gi();
    	while(m--)
    	{
    		int l=gi(),r=gi(),ans=0;
    		while(ans<1e9)
    		{
    			int sum=query(rt[l-1],rt[r],1,1e9,ans+1);
    			if(sum==ans)break;
    			ans=sum;
    		}
    		printf("%d
    ",ans+1);
    	}
    	return 0;
    }
    
  • 相关阅读:
    总结:多校1
    简易数论练习
    2017 多校1
    简易数论函数变换学习
    petrozavodsk1
    Permutacja
    图片上传阿里云oss 数据存入redis List
    tp5实现月统计数据
    es6 新特性
    es6 新特性总结
  • 原文地址:https://www.cnblogs.com/mleautomaton/p/10570915.html
Copyright © 2011-2022 走看看