5.21

想起来昨天要说什么了。

原来是期待很久的《庆余年》第二季开播了,在百度热搜上看到了,好像今天已经播到了第三天,挺期待的,毕竟是极少数完整追完的电视剧(

好像明天就要切断电话线,唐氏学校怎么想的?😅😅😅

班上一名同学因为昨晚10点半还在打电话被通报而被D,班主任爆出了“本来我挺不理解学校切断电话线的,现在我理解了”这样的典。

数学问卷爆典,Q:你对数学的看法,D项是“感觉很有挑战性,有一种欲罢不能的感觉,很想征服它”,越看越觉得不对劲。🤔🤔🤔

唉我草怎么写了这么多。

机房目前集齐了在役的所有碾压我的Oier,%%%

不对,HZOI2024和HZOI2023还有人没来呢。

%%%

不是兄弟现在一机房若干佬压迫感太强了我都不敢颓了兄弟。

大根堆

看到 sonnety 才知道原来还可以DP写。感谢 \(\text{K}_8 \text{He}\) 对式子的贡献。\

还是用的线段树合并,值域线段树存方案数。值得注意的是dfs时需要二分找到解(略抽象

好消息,过了


#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=2e5+10;
int n;
namespace Chongyun
{
    inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
    inline void write(int x){char F[20];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0)putchar(F[--cnt]);}
}
using namespace Chongyun;
int x[N],y[N],z[N],ans[N],rt[N];
int v[N],v2[N];
int head[N*2],cnt,tot,num;
struct node
{
    int next,to;
}e[N*2];
struct tree
{
    int l,r,sum;
}t[N*40];
inline void add(int u,int v)
{
    e[++num].to=v;
    e[num].next=head[u];
    head[u]=num;
}
inline int merge(int u,int v,int l,int r)
{
    if(!u) return v;
    if(!v) return u;
    t[u].sum+=t[v].sum;
    int mid=l+r>>1;
    t[u].l=merge(t[u].l,t[v].l,l,mid);
    t[u].r=merge(t[u].r,t[v].r,mid+1,r);
    return u;
}
inline int find(int p,int l,int r,int z)
{   
    if(!p)
        return 0;
    int mid=l+r>>1;
    int ans=t[p].sum;
    if(z<=mid) ans+=find(t[p].l,l,mid,z);
    else ans+=find(t[p].r,mid+1,r,z);
    return ans;
}
inline void update(int &p,int L,int R,int l,int r,int z)
{
    if(!p) p=++tot;
    if(l<=L && r>=R)
    {
        t[p].sum+=z;
        return;
    }
    int mid=(L+R)>>1;
    if(l<=mid) update(t[p].l,L,mid,l,r,z);
    if(r>mid) update(t[p].r,mid+1,R,l,r,z);
}
inline void dfs(int x)
{
    int ans1=0,ans2=0;
    for(re int i=head[x];i;i=e[i].next)
    {
        int p=e[i].to;
        dfs(p);
        rt[x]=merge(rt[x],rt[p],1,cnt);
    }
    ans1=find(rt[x],1,cnt,v[x]-1)+1;
    ans2=find(rt[x],1,cnt,v[x]);
    if(ans1<=ans2) return;
    int l=v[x],r=cnt,pos=v[x];
    while(l<=r)//二分
    {
        int mid=l+r>>1;
        if(find(rt[x],1,cnt,mid)<ans1)
        {
            l=mid+1;
            pos=mid;
        }
        else r=mid-1;
    }
    update(rt[x],1,cnt,v[x],pos,1);
}
int main()
{
    n=read();
    int a,b;
    for(re int i=1;i<=n;++i)
    {
        a=read(),b=read();;
        v[i]=a;
        v2[i]=v[i];
        add(b,i);
    }
    sort(v2+1,v2+1+n);
    cnt=unique(v2+1,v2+1+n)-v2-1;
    for(re int i=1;i<=n;++i)
        v[i]=lower_bound(v2+1,v2+1+cnt,v[i])-v2;
    dfs(1);
    int an=find(rt[1],1,cnt,cnt);
    write(an);
}

今年APIO好像挺抽象。

posted @ 2024-05-21 21:41  HS_xh  阅读(37)  评论(1编辑  收藏  举报
init();