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好像挺抽象。