糖丸了,其实是在为自己闲话创造头图。
喜报,终于找回了原来闲话的感觉(?)
果然还是得自己说一大堆没用的话才好啊,不能只放图(
好可爱啊(
非常好题,使我调到死。
现在没调完,但是其实就是线段树合并,动态开点,并查集,普通线段树区间查询等等的集合,全放一起就完事了,(谨防题目诈骗)
先放个错的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+5;
struct TREE
{
bool tag;
int dat,l,r;
double logmul;
}t[N*20];
int fa[N];
int rt[N];
int cnt;
inline int find_fa(int x)
{
return x==fa[x]? x : fa[x]=find_fa(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,l,mid,v,a);
else update(t[p].r,x,mid+1,r,v,a);
}
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,r);
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;
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;
char cc;
signed main()
{
int n=read();
for(int i=1;i<=n;++i)
{
int opt=read();a=read();
if(opt==1)
{
update(rt[++cnt],a,1,log(a),1,INF);
fa[cnt]=cnt;
}
if(opt==2)
{
b=read();
if(find_fa(a)==find_fa(b)) continue;
rt[find_fa(a)]=merge(rt[find_fa(a)],rt[find_fa(b)]);
fa[find_fa(b)]=fa[find_fa(a)];
}
if(opt==3)
{
x=read();
int t1=q7(rt[find_fa(a)],1,x,1,INF);
del(rt[find_fa(a)],1,x,1,INF);
update(rt[find_fa(a)],x,t1,log(x),1,INF);
}
if(opt==4)
{
x=read();
int t1=q7(rt[find_fa(a)],x,INF,1,INF);
del(rt[find_fa(a)],x,INF,1,INF);
update(rt[find_fa(a)],x,t1,log(x),1,INF);
}
if(opt==5)
{
k=read();
cout<<q5(rt[find_fa(a)],1,INF,k)<<endl;
}
if(opt==6)
{
b=read();
if(t[rt[find_fa(a)]].logmul>t[rt[find_fa(b)]].logmul) puts("1");
else puts("0");
}
if(opt==7) cout<<t[rt[find_fa(a)]].dat<<endl;
}
}
谁能教教哪错了
标签:return,int,mid,dat,logmul,5.16,inline From: https://www.cnblogs.com/HSxh/p/18196702