5.16
糖丸了,其实是在为自己闲话创造头图。
喜报,终于找回了原来闲话的感觉(?)
果然还是得自己说一大堆没用的话才好啊,不能只放图(
好可爱啊(
非常好题,使我调到死。
现在没调完,但是其实就是线段树合并,动态开点,并查集,普通线段树区间查询等等的集合,全放一起就完事了,(谨防题目诈骗)
现在是对的code了
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
namespace Watarai_Hinami
{
inline void CLOSE(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void FIRE(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
}
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 Watarai_Hinami;
using namespace Chongyun;
const int N=4e6+10;
const int INF=1e9;
struct TREE
{
bool tag;
int dat,l,r;
double logmul;
}t[N*20];
int fa[N];
int rt[N];
int cnt,tot;
inline int find(int x)
{
return x==fa[x]? x : fa[x]=find(fa[x]);
}
inline void pushdown(int p)
{
if(!t[p].tag) return;
t[t[p].l].dat=t[t[p].r].dat=0,
t[t[p].l].logmul=t[t[p].r].logmul=0;
t[t[p].l].tag=t[t[p].r].tag=1,t[p].tag=0;
}
inline void update(int &p,int x,int a,double v,int l,int r)
{
if(!p) p=++cnt;
t[p].dat+=a,t[p].logmul+=a*v;
if(l==r) return;
pushdown(p);
int mid=l+r>>1;
if(mid>=x) update(t[p].l,x,a,v,l,mid);
else update(t[p].r,x,a,v,mid+1,r);
}
inline void del(int p,int l,int r,int ll,int rr)
{
if(!p) return;
if(l<=ll && r>=rr)
{
t[p].dat=t[p].logmul=0,t[p].tag=1;
return;
}
pushdown(p);
int mid=ll+rr>>1;
if(l<=mid) del(t[p].l,l,r,ll,mid);
if(mid<r) del(t[p].r,l,r,mid+1,rr);
t[p].dat=t[t[p].l].dat+t[t[p].r].dat;
t[p].logmul=t[t[p].l].logmul+t[t[p].r].logmul;
}
inline int merge(int u,int v)
{
if(!u || !v) return u+v;
t[u].dat+=t[v].dat,t[u].logmul+=t[v].logmul;
pushdown(u),pushdown(v);
t[u].l=merge(t[u].l,t[v].l),t[u].r=merge(t[u].r,t[v].r);
return u;
}
inline int q5(int p,int l,int r,int k)
{
if(l==r) return l;
pushdown(p);
int mid=l+r>>1;
if(k<=t[t[p].l].dat) return q5(t[p].l,l,mid,k);
else return q5(t[p].r,mid+1,r,k-t[t[p].l].dat);
}
inline int q7(int p,int l,int r,int b,int k)
{
if(!p) return 0;
if(l<=b && r>=k)
return t[p].dat;
pushdown(p);
int mid=b+k>>1,ans=0;
if(l<=mid) ans+=q7(t[p].l,l,r,b,mid);
if(r>mid) ans+=q7(t[p].r,l,r,mid+1,k);
return ans;
}
int x,a,b,q,k,ans,t1;
signed main()
{
int n=read();
for(int i=1;i<=n;++i)
{
int opt=read();a=read();
if(opt==1)
{
update(rt[++tot],a,1,log(a),1,INF);
fa[tot]=tot;
}
if(opt==2)
{
b=read();
if(find(a)==find(b)) continue;
rt[find(a)]=merge(rt[find(a)],rt[find(b)]);
fa[find(b)]=fa[find(a)];
}
if(opt==3)
{
x=read();
t1=q7(rt[find(a)],1,x,1,INF);
del(rt[find(a)],1,x,1,INF);
update(rt[find(a)],x,t1,log(x),1,INF);
}
if(opt==4)
{
x=read();
t1=q7(rt[find(a)],x,INF,1,INF);
del(rt[find(a)],x,INF,1,INF);
update(rt[find(a)],x,t1,log(x),1,INF);
}
if(opt==5)
{
k=read();
cout<<q5(rt[find(a)],1,INF,k)<<endl;
}
if(opt==6)
{
b=read();
if(t[rt[find(a)]].logmul>t[rt[find(b)]].logmul) puts("1");
else puts("0");
}
if(opt==7) cout<<t[rt[find(a)]].dat<<endl;
}
}
哈哈,大家对数据结构的爱很深厚啊(喜)
怎么【数据删除】又被封了,看来现在没法用百度账号了(
无 \(\text {Latex}\),该罚!
真的不会写Latex了😅😅😅
现在的我真的菜死了🤣🤣🤣
调出来了因为我瞎几把该变量名然后递归的时候寄了😡😡😡