20210713考试-2021noip14

时间:2021-07-14
本文章向大家介绍20210713考试-2021noip14,主要包括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\n",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\n",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\n",f[n][l]);
    
    return 0;
}

原文地址:https://www.cnblogs.com/HKHbest/p/15010468.html