5.22
明天要进行二模。
我也不知道为什么我要加密,那还是加上吧。
想了下还是不加密了,总有人懒得看加密的闲话的,另一些人反而会好奇,真是奇怪呢。
我想把搜狗输入法卸载了。
领导集团问题
昨天问题的翻版了属于是。只不过这是小根堆,需要在二分时该一下边界,最终找结果要改为\(\text{find(rt[1],1,cnt,1)}\)
因为给出双亲节点,所以要双向建边。
其余没有什么改动,爽点在于有关线段树的部分完全不用改,然后就过了。😋😋😋
Code
#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 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 fa)
{
int ans1=0,ans2=0;
for(re int i=head[x];i;i=e[i].next)
{
int p=e[i].to;
if(p==fa) continue;
dfs(p,x);
rt[x]=merge(rt[x],rt[p],1,cnt);
}
ans1=find(rt[x],1,cnt,v[x])+1;
ans2=find(rt[x],1,cnt,v[x]-1);
if(ans1<=ans2) return;
int l=0,r=v[x],pos=v[x];
while(l<=r)//二分
{
int mid=l+r>>1;
if(find(rt[x],1,cnt,mid)<ans1)
{
r=mid-1;
pos=mid;
}
else l=mid+1;
}
update(rt[x],1,cnt,pos,v[x],1);
}
int main()
{
n=read();
int a;
for(re int i=1;i<=n;++i)
v[i]=read(),v2[i]=v[i];
for(re int i=1;i<n;++i)
{
a=read();
add(a,i+1);
add(i+1,a);//双向建边
}
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,0);
int an=find(rt[1],1,cnt,1);
write(an);
}
参考博文 WindZR 线段树合并 大根堆 因为是学长的博客所以直接放了,学长不要怪罪(
最近也没什么抽象事,学校说要掐电话线可是还没掐,但是给每个铺位发了一张可视电话卡的广告,本来官方说法是防止考试没考好学生打电话渲染不良情绪所以断掉,我还觉得可以理解,但是现在突然发了这个,有点怀疑学校的动机,也有可能发广告的不是学校的人,毕竟学校也是会和其他各方合作的吧,比如这个可视电话也是去年才刚安装的,也许有人发现了商机。
深受阴谋论思想毒害的我,怀疑是学校故意为之。这也体现在我的各个方面,比如输入法的错误会被我误以为是为了干扰我打字的速度而设置的,然而可能我就是打错字了之类,不过搜狗输入法确实有些时候不太灵敏,比如我现在打出ybmq
首选是御坂美琴,可是我从没打过这个词让它推送,好吧其实是xrlong跟我说过这个输入法被调教过,很多魔法禁书目录的词都会没推为首选,比如打出mfjs
就会出来魔法禁书目录
。
lxyt 有言“这个世界就是一个巨大的问号”
啊这好像有点偏了,不过但看这句话还是挺奇怪的。
不过阴谋论的定义是指人们对那种经常认定重大事件背后一定有不可告人之阴谋诡计的认知方式的概括,也可以说,阴谋论是一种认知方式,这种认知方式总是认定重大事件背后一定有不可告人的阴谋诡计。其实大概是指把人性的恶想得更多一点,认为没有那么多巧合吧。
唉,说了这么多意义不明的话,大概是有点意识流的感觉,畅所欲言?也不对,其实是想到什么说什么,就像"我不知道为什么突然想哭,莫名其妙的烦躁,突然不想回任何人信息,脑子里隐约出很多事情,每次情绪都来路不明"这样的无意义。或者或者者或者或着或或者或着者或活着活着活着者或着或一样的无意义。
唉,是不是说一句话换一行更占篇幅一点。
那还是这么写吧。
还有 13 分钟就要睡觉了,最近的 whk 学得怎么样呢?乱搞又被 D 了,但是还没被 D,等着被 D 好像又不会被 D 了,谁知道会不会被 D 呢?我已经不害怕被 D 了,被 D 了也没什么好害怕的,谁还没被 D 过呢,而且我也没做什么值得被 D 的,就算做了也不至于被 D 吧。
今晚月色真美,好像还有下半句,不对得先有一句回答,"月亮在哪里呢?","月亮在你心里",哦哦哦我听这种情话听腻了谁有没有更好的情话呢?先不管能不能用上,至少得有点储备。
已经不再是那个什么事都可以用原神启动搪塞过去的时代了,因为我已经不玩原神了。
原神启动。