BZOJ4399 : 魔法少女LJJ

将所有权值离散化,建立权值线段树,维护区间内数字个数以及对数的和,用于比较乘积大小。

对于每个连通块维护一棵权值线段树,合并时用线段树合并。

对于操作3和4,暴力删除所有不合法节点,然后一并修改后插入线段树即可。

时间复杂度$O(m\log m)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=400010,M=7000000;
int n,m,i,x,y,op[N][3],b[N],U,f[N],T[N],cnt;
int tot,l[M],r[M],v[M];double s[M],L[N];
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
inline int lower(int x){
  int l=1,r=U,mid,t;
  while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
  return t;
}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
void ins(int&x,int a,int b,int c,int d,double e){
  if(!x)x=++tot;
  v[x]+=d,s[x]+=e;
  if(a==b)return;
  int mid=(a+b)>>1;
  if(c<=mid)ins(l[x],a,mid,c,d,e);else ins(r[x],mid+1,b,c,d,e);
}
inline void up(int x){
  v[x]=v[l[x]]+v[r[x]];
  s[x]=s[l[x]]+s[r[x]];
}
void del(int x,int a,int b,int c,int d){
  if(!v[x])return;
  if(a==b){
    cnt+=v[x],v[x]=0,s[x]=0;
    return;
  }
  int mid=(a+b)>>1;
  if(c<=mid)del(l[x],a,mid,c,d);
  if(d>mid)del(r[x],mid+1,b,c,d);
  up(x);
}
int merge(int x,int y,int a,int b){
  if(!x)return y;
  if(!y)return x;
  if(a==b){
    v[x]+=v[y];
    s[x]+=s[y];
    return x;
  }
  int mid=(a+b)>>1;
  l[x]=merge(l[x],l[y],a,mid);
  r[x]=merge(r[x],r[y],mid+1,b);
  return up(x),x;
}
inline int kth(int x,int k){
  int a=1,b=U,mid;
  while(a<b){
    mid=(a+b)>>1;
    if(v[l[x]]>=k)b=mid,x=l[x];else k-=v[l[x]],a=mid+1,x=r[x];
  }
  return a;
}
int main(){
  read(m);
  for(i=1;i<=m;i++){
    read(op[i][0]),read(op[i][1]);
    if(op[i][0]>1&&op[i][0]<7)read(op[i][2]);
    if(op[i][0]==1)b[++U]=op[i][1];
    if(op[i][0]==3||op[i][0]==4)b[++U]=op[i][2];
  }
  sort(b+1,b+U+1);
  for(i=1;i<=U;i++)L[i]=log(b[i]);
  for(i=1;i<=m;i++){
    x=op[i][1],y=op[i][2];
    if(op[i][0]==1){
      x=lower(x),n++;
      f[n]=n,ins(T[n],1,U,x,1,L[x]);
    }
    if(op[i][0]==2){
      x=F(x),y=F(y);
      if(x==y)continue;
      T[f[x]=y]=merge(T[x],T[y],1,U);
    }
    if(op[i][0]==3){
      x=F(x),y=lower(y),cnt=0;
      if(y>1)del(T[x],1,U,1,y-1);
      if(cnt)ins(T[x],1,U,y,cnt,L[y]*cnt);
    }
    if(op[i][0]==4){
      x=F(x),y=lower(y),cnt=0;
      if(y<U)del(T[x],1,U,y+1,U);
      if(cnt)ins(T[x],1,U,y,cnt,L[y]*cnt);
    }
    if(op[i][0]==5)printf("%d\n",b[kth(T[F(x)],y)]);
    if(op[i][0]==6)puts(s[T[F(x)]]>s[T[F(y)]]?"1":"0");
    if(op[i][0]==7)printf("%d\n",v[T[F(x)]]);
  }
  return 0;
}

  

时间: 2024-08-07 08:46:49

BZOJ4399 : 魔法少女LJJ的相关文章

【BZOJ4399】魔法少女LJJ 线段树合并

[BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味:小猴在枝头悠来荡去,好不自在:各式各样的鲜花争相开放,各种树枝的枝头挂满沉甸甸的野果:鸟儿的歌声婉转动听,小河里飘着落下的花瓣真是人间仙境”SHY觉得LJJ还是太naive,一天,SHY带着自己心爱的图找到LJJ,对LJJ说:“既然你已经见识过动态树

bzoj 4399 魔法少女LJJ

4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=4399 Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味:小猴在枝头悠来荡去,好不自在:各式各样的鲜花争相开放,各种树枝的枝头挂满

AC日记——魔法少女LJJ bzoj 4399

魔法少女LJJ 思路: 动态开点权值线段树+启发式合并: 来,上代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 400005 #define maxm 7000000 int ch[maxm][2],X,dis[maxm],tot,

NBUT 1010 魔法少女(DP)

[1010] 魔法少女 时间限制: 1000 ms 内存限制: 65535 K 问题描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. 因为魔女之夜是悬浮在半空的,所以她必须要爬楼,而那座废墟一共有n层,而且每层高度不同,这造成小炎爬每层的时间也不同.不过当然,小炎会时间魔法,可以瞬间飞过一层或者两层[即不耗时].但每次瞬移的时候她都必须要至少往上再爬一层(在这个当儿补充魔力)才能再次使用瞬移.爬每单位高度需要消耗小炎1秒时间.

【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流

通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软件来制作特效素材的新的摄影风格. 作为最后工程的摄影,也可以受益于3DCG软件 已经放映结束的本人气系列的第3季,[魔法少女☆伊莉雅 2wei Herz! ]中, Asahi Production 的中西康祐摄影导演带领的小组,在[Cell与CG的崭新融合]的概念下,实践了最新摄影工作流. [魔法少女☆伊莉雅

数据结构作业——魔法少女(平衡二叉树)

魔法少女之相亲大会 Description 由于之前的相亲大会的组织者太过糟糕,实验室的大家仍然没有摆脱 single dog 的命运!!所以请了魔法少女小风,来帮忙实验室脱单!于是光棍节这天,美少女小风重新组织一波相亲大会.她先让男生们按着帅气值高低,从左到右站成一排,接下来 n 秒,每一秒释放一次巴啦啦小风能量!小风能量随机出现"JX"时:粗线了一名男生,然后这个男生会根据自己的帅气值,走到队列里相应的位置. 小风能量随机出现"XQ"时:粗线了一名女生,女生会说

nyoj 魔法少女

魔法少女 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. 因为魔女之夜是悬浮在半空的,所以她必须要爬楼,而那座废墟一共有n层,而且每层高度不同,这造成小炎爬每层的时间也不同.不过当然,小炎会时间魔法,可以瞬间飞过一层或者两层[即不耗时].但每次瞬移的时候她都必须要至少往上再爬一层(在这个当儿补充魔力)才能再次使用瞬移.爬每单位高度需要消耗小炎1秒时间. 消灭魔

AYUI第12个作品-英雄联盟-魔法少女的星光水晶2.0-WPF版本

一下 内容基于AYUI6.7制作,主要3个大控件,1个 轮播预览,一个抽奖展示,一个是自己的抽中的历史展示,还有礼品领取,图片变成黑白的滤镜,滚动条网页方式布局 历时4天,制作效果如下: 由于自己爬了LOL所有英雄和所有皮肤图片,所有图片包有100M左右,860多张图片,然后自己写了数据包,xml方式本地存储的.暂时抽奖结果不列入xml中. 体验包下载:下载地址 效果图预览: 预览图可能过大5M,加载有点慢 第二张:

【bzoj4283】魔法少女伊莉雅

似乎是用最短路树随意判一下就好了. #include<bits/stdc++.h> #define maxn 100005 #define maxm 500005 #define INF 0x7f7f7f7f using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='