• 20210713考试-2021noip14



    T1 队长快跑

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+5,INF=0x7fffffff;
    int n,a[N],b[N],ans,s[N<<1],top;
    struct xds
    {
    	int l,r,mx,laz;
    }t[N*4];
    void build(int p,int l,int r){
    	t[p].l=l;
    	t[p].r=r;
    	if(l==r)return ;
    	int mid=l+r>>1;
    	build(p<<1,l,mid);
    	build(p<<1|1,mid+1,r);
    	return ;	
    }
    void update(int p){
    	t[p].mx=max(t[p<<1].mx,t[p<<1|1].mx);
    	return ;	
    }
    void pushdown(int p)
    {
    	if(t[p].laz)
    	{
    		t[p*2].mx+=t[p].laz;
    		t[p*2+1].mx+=t[p].laz;
    		t[p*2].laz+=t[p].laz;
    		t[p*2+1].laz+=t[p].laz;
    		update(p);
    		t[p].laz=0;
    	}
    	return;
    }
    void change(int p,int pos,int val)
    {
    	if(t[p].l==pos&&t[p].r==pos)
    	{
    		t[p].mx=max(t[p].mx,val);
    		return;
    	}
    	pushdown(p);
    	int mid=(t[p].l+t[p].r)>>1;
    	if(pos<=mid)
    		change(p<<1,pos,val);
    	else
    		change(p*2+1,pos,val);
    	update(p);
    	return;
    }
    void add(int p,int l,int r)
    {
    	if(t[p].l>=l&&t[p].r<=r)
    	{
    		t[p].mx++;
    		t[p].laz++;
    		return;
    	}
    	pushdown(p);
    	int mid=(t[p].l+t[p].r)>>1;
    	if(l<=mid)
    		add(p<<1,l,r);
    	if(r>mid)
    		add(p*2+1,l,r);
    	update(p);
    }
    int ask(int p,int l)
    {
    	if(l==0)
    		return 0;
    	if(t[p].r<=l)
    		return t[p].mx;
    	if(t[p].laz)
    		pushdown(p);
    	int mid=(t[p].l+t[p].r)>>1;
    	if(l<=mid)
    		return ask(p<<1,l);
    	return 
    		max(t[p<<1].mx,ask(p*2+1,l));
    }
    int find(long long x)
    {
    	int l=1,r=top,mid;
    	while(1)
    	{
    		mid=(l+r)>>1;
    		if(s[mid]>x)
    			r=mid-1;
    		else if(s[mid]<x)
    			l=mid+1;
    		else
    			return mid;
    	}
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&a[i],&b[i]);
    		s[i*2-1]=a[i];s[i*2]=b[i];
    	}
    	sort(s+1,s+1+2*n);
    	for(int i=1;i<2*n;i++)
    	{
    		if(s[i]==s[i+1])
    			s[i]=INF;
    	}
    	sort(s+1,s+1+2*n);
    	top=2*n;
    	for(int i=1;i<=2*n;i++)
    	{
    		if(s[i]==INF)
    		{
    			top=i-1;
    			break;
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		a[i]=find(a[i]);
    		b[i]=find(b[i]);
    	}
    	build(1,1,top);
    	for(int i=n;i>=1;i--)
    	{
    		if(b[i]>=a[i])
    		{
    			int x=ask(1,a[i]-1)+1;
    			change(1,b[i],x);
    		}
    		else
    		{
    			add(1,b[i],a[i]-1);
    			int x=ask(1,b[i]-1)+1;
    			change(1,b[i],x);
    		}
    	}
    	printf("%d
    ",t[1].mx);
    	return 0;
    }

    T2 影魔

    #include<bits/stdc++.h>
    #define lowbit(x)    (x&(-x))
    using namespace std;
    const int N=110000,M=210000;
    int n,m,cnt,val[N],dep[N],c[N],x,y,w;
    vector<pair<int,int> >ask[N];
    vector<int>b[N];
    namespace xds
    {
        struct Seg
        {
            int son[2],dep;
        }t[N*30];
        int ans[N],rot[N],tot;
        void plus(int x,int y)
        {
            for(;x<=n;x+=lowbit(x))
                c[x]+=y;
            return;
        }
        int find(int x)
        {
            int res=0;
            for(;x;x-=lowbit(x))    res+=c[x];
            return res;
        }
        int change(int pos,int l,int r,int dep)
        {
            int p=++tot;
            if(l==r&&l==pos)
            {
                plus(dep,1);
                t[p].dep=dep;
                return p;
            }
            int mid=(l+r)>>1;
            if(pos<=mid)
                t[p].son[0]=change(pos,l,mid,dep);
            else
                t[p].son[1]=change(pos,mid+1,r,dep);
            return p;
        }
        int merge(int p,int q,int l,int r)
        {
            if((!p)||(!q))
                return p+q;
            if(l==r)
            {
                plus(max(t[p].dep,t[q].dep),-1);
                t[p].dep=min(t[p].dep,t[q].dep);
                return p;
            }
            int mid=(l+r)>>1;
            if(t[p].son[0]||t[q].son[0])
                t[p].son[0]=merge(t[p].son[0],t[q].son[0],l,mid);
            if(t[p].son[1]||t[q].son[1])
                t[p].son[1]=merge(t[p].son[1],t[q].son[1],mid+1,r);
            return p;
        }
        void dfs(int u)
        {
            for(int i=0;i<ask[u].size();i++)
            {
                ans[ask[u][i].first]-=find(min(n,dep[u]+ask[u][i].second))-find(dep[u]-1);
            }
            rot[u]=change(val[u],1,n,dep[u]);
            for(int i=0;i<b[u].size();i++)
            {
                int v=b[u][i];
                dep[v]=dep[u]+1;
                dfs(v);
                rot[u]=merge(rot[u],rot[v],1,n); 
            }
            for(int i=0;i<ask[u].size();i++)
            {
                ans[ask[u][i].first]+=find(min(n,dep[u]+ask[u][i].second))-find(dep[u]-1);
            }
            return;
        }
    }
    using namespace xds;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&val[i]);
        }
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&x);
            b[x].push_back(i);
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&w);
            ask[x].push_back(make_pair(i,w));
        }
        dep[1]=1;
        dfs(1);
        for(int i=1;i<=m;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }

    T3 抛硬币

    #include<bits/stdc++.h>
    using namespace std;
    const int N=3100,mod=998244353;
    int l,n,sum[N],las[N],has[27];
    char s[N];
    long long f[N][N];
    int main()
    {
        scanf("%s",s+1);
        n=strlen(s+1);
        scanf("%d",&l);
        for(int i=1;i<=n;i++)
        {
            sum[i]=sum[i-1];
            if(!has[s[i]-'a'])
            {
                sum[i]++;
            }
            las[i]=has[s[i]-'a'];
            has[s[i]-'a']=i;
        }
        for(int i=1;i<=n;i++)
        {
            f[i][1]=sum[i];
        }
        for(int i=2;i<=n;i++)
        {
            for(int len=2;len<=i;len++)
            {
                f[i][len]=((f[i-1][len]+f[i-1][len-1]%mod-f[las[i]-1==-1?0:las[i]-1][len-1])%mod+mod)%mod;
            }
        }
        printf("%lld
    ",f[n][l]);
        
        return 0;
    }
  • 相关阅读:
    邪恶的强制数据转换
    知识普及
    判断是否为一个数字
    parseInt
    webpack学习记录
    数组隐藏属性
    elasticSearch基本使用
    elasticsearch安装和部署
    neo4j索引
    spark yarn 提交作业
  • 原文地址:https://www.cnblogs.com/HKHbest/p/15010468.html
Copyright © 2020-2023  润新知