首页 > 其他分享 >bzoj4399: 魔法少女LJJ

bzoj4399: 魔法少女LJJ

时间:2024-05-10 16:00:49浏览次数:19  
标签:rt LJJ int sum 魔法 tree bzoj4399 gjd data

先上头图:

诈骗题认真读题 c<=7 

只需要考虑前七个操作

一.动态开点即可

二.线段树合并

三.四.对于这两个操作,可以先统计出有多少个数小于/大于x,然后删除所有小于/大于x的数,并在x位置加上这些数

五.下放标记查询即可

六.每个数最大为1e9,直接乘肯定会炸,所以可以用double存它们的对数之积,log(nm)=log(n)+log(m)的性质可以很好地处理

七.直接查询即可

这题的思路还是非常简单的,主要在码出来

%%%%%%

调了两天半的代码:

#include <bits/stdc++.h>
#define ls tree[gjd].lson
#define rs tree[gjd].rson
using namespace std;
const int N=400010,inf=1e9;
int x,a,b,k,m,ch,tot,cnt;
int fa[N],rt[N];
struct stu{
	int lson,rson,data;//data 存块数量 
	double sum;//求和 
	bool lazy;//标记 
}tree[50*N];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}

void pushup(int gjd){
	tree[gjd].data=tree[ls].data+tree[rs].data;
	tree[gjd].sum=tree[ls].sum+tree[rs].sum;
}
void pushdown(int gjd){
	tree[ls].lazy=tree[rs].lazy=1;
	tree[ls].data=tree[rs].data=0;
	tree[ls].sum=tree[rs].sum=0;
	tree[gjd].lazy=0;
}

void insert(int &gjd,int l,int r,int now,int data,double sum){
	if(!gjd) gjd=++cnt;
	tree[gjd].sum+=sum;
	tree[gjd].data+=data;
	if(l==r) return;
	if(tree[gjd].lazy) pushdown(gjd);
	int mid=(l+r)>>1;
	if(now<=mid) insert(ls,l,mid,now,data,sum);
	else insert(rs,mid+1,r,now,data,sum);
}

int update(int gjd,int l,int r,int x,int y){
	if(x>y||!gjd) return 0;
    if(l==x&&r==y){
        int p=tree[gjd].data;
        tree[gjd].data=0;
		tree[gjd].sum=0;
		tree[gjd].lazy=1;
        return p;
    }
    if(tree[gjd].lazy) pushdown(gjd);
    int mid=(l+r)>>1,ans;
    if(y<=mid) ans=update(ls,l,mid,x,y);
    else if(x>mid) ans=update(rs,mid+1,r,x,y);
    else ans=update(ls,l,mid,x,mid)+update(rs,mid+1,r,mid+1,y);
    pushup(gjd);
    return ans;
}

int queryk(int gjd,int l,int r,int k){
	if(l==r) return l;
	if(tree[gjd].lazy) pushdown(gjd);
	int mid=(l+r)>>1;
	if(k<=tree[ls].data) return queryk(ls,l,mid,k);
	else return queryk(rs,mid+1,r,k-tree[ls].data);
}

int merge(int p,int q,int l,int r){
	if(!p) return q;
	if(!q) return p;
	tree[p].data+=tree[q].data;
	tree[p].sum+=tree[q].sum;
	if(l<r){
		if(tree[p].lazy) pushdown(p);
		if(tree[q].lazy) pushdown(q);
		int mid=(l+r)>>1;
		tree[p].lson=merge(tree[p].lson,tree[q].lson,l,mid);
		tree[p].rson=merge(tree[p].rson,tree[q].rson,mid+1,r);	
	}
	return p;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>m;
	while(m--){
		cin>>ch;
		//对于操作1、2、3、4、5、7,很容易想到使用并查集维护连通块,
		//对每个连通块开一棵权值线段树。
		if(ch==1){
			cin>>x;
			fa[++tot]=tot;
			insert(rt[tot],1,inf,x,1,log(x));
		}
		else if(ch==2){
			cin>>a>>b;
			a=find(a),b=find(b);
            if(a!=b) rt[a]=merge(rt[a],rt[b],1,inf);
            fa[b]=a;
		}
		//对于3、4操作,可以先统计出有多少个数小于/大于x,
		//然后删除所有小于/大于x的数,并在x位置加上这些数
		else if(ch==3){
			cin>>a>>x;
			a=find(a);
            int down=update(rt[a],1,inf,1,x-1);
            insert(rt[a],1,inf,x,down,down*log(x));
		}
		else if(ch==4){
			cin>>a>>x;
			a=find(a);
            int up=update(rt[a],1,inf,x+1,inf);
            insert(rt[a],1,inf,x,up,up*log(x));
		}
		else if(ch==5){
			cin>>a>>k;
			a=find(a);
			cout<<queryk(rt[a],1,inf,k)<<endl;
		}
		//取log(nm)=log(n)+log(m)处理乘法
		else if(ch==6){
			cin>>a>>b;
			a=find(a),b=find(b);
			if(tree[rt[a]].sum>tree[rt[b]].sum) cout<<"1"<<endl;
			else cout<<"0"<<endl;
		}
		else if(ch==7){
			cin>>a;
			a=find(a);
			cout<<tree[rt[a]].data<<endl;
		}
//		else if(ch==8) cin>>a>>b;
//		else if(ch==9) cin>>a;
	}
	return 0;
}

#一名爱打篮球的oier#

标签:rt,LJJ,int,sum,魔法,tree,bzoj4399,gjd,data
From: https://www.cnblogs.com/hzoiwzs/p/18184563

相关文章

  • 类的魔法方法
    【引入】Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发init :初始化类时触发del :删除类时触发new :构造类时触发str :str函数或者print函数触发repr :repr或者交互式解释器触发doc......
  • Python高阶---魔法方法
    魔法方法:通过dir(函数名)查看到的方法中以双下划线开始,以双下划线结束的方法。=========================================classStudent:definit(self,name,age):"""负责初始化类的实例,实例是由__new__方法传递过来的,也就是这里的self:paramname::paramage:"""self......
  • 牛客 215E 黄魔法师 题解
    Description给出\(n,k\),求一个长度为\(n\)的数组\(a\),满足有恰好\(k\)对数对\((i,j)(1\leqi<j\leqn)\)满足\(a_i+a_j\)为完全平方数。如果不存在,输出\(-1\)。linkSolution显然如果\(k>\binom{n}{2}\)就一定无解。构造时会发现肯定要尽量弄成相同的......
  • P10218 魔法手杖
    感觉考场上做这题还是挺聪明的答案显然满足二分的性质。考虑枚举答案mid,如果mid满足要求,那么就要满足如下条件:\[\sum_{a_{i}\oplusx<mid}b^{i}<m\]\[\foralli,a_{i}+x>=mid\]因为如果你这个\(a_{i}\)如果不能满足异或,那么肯定就需要加。第一个条件即为:被定向加强的......
  • 【.NET】利用 IL 魔法实现随心随意的泛型约束
    众所周知,C#只支持对基类/接口/class/struct/new()以及一些IDE魔法的约束,比如这样publicstaticstringTest<T>(Tvalue)whereT:ITest{returnvalue.Test();}publicinterfaceITest{stringTest();}但是如果我们想要随心所欲的约束就不行了publicst......
  • vue3在构建时,使用魔法糖语法时defineProps和defineEmits的注意事项
    在Vue3.2+版本中,可以使用<scriptsetup>替代传统的script标签来编写组件,它提供了更简洁的语法来编写CompositionAPI代码。在<scriptsetup>中,使用defineProps和defineEmits时需要注意:如果显式地导入defineProps时,在编译时会提示以下wanning<scriptsteup>impo......
  • 2024年4月6日-UE5-等级、经验、血条、魔法消耗
    在01主角蓝图里,新建2个变量 新增一个类别叫玩家属性,然后把上面的拖进来 然后在角色总类里也新建这个类别,然后把生命值拖进来 这样在01主角里,就都有了在01玩家里再新建几个属性 把玩家等级改成1,魔法值调成默认100,当前经验值0,最大经验值100然后创建一个UI空间蓝图,战......
  • Python程序设计 魔法函数
    1.魔法方法Python中有一些特殊方法,它们允许我们的类和Python更好地集成。在标准库参考(StandardLibraryReference)中,它们被称为魔法方法(MagicMethods),是与Python的其他特性无缝集成的基础。例如,我们用字符串来表示一个对象的值。Object 基类包含了__repr__() 和__str__()......
  • 用JavaScript实现响应式设计的魔法
    在数字世界的迷宫中,响应式设计就像是一把万能钥匙,能打开任何大小屏幕的大门。不论是巨大的桌面显示器,还是袖珍的手机屏幕,响应式设计确保你的网站或应用能在任何设备上都提供优质的用户体验。但如何用JavaScript施展这种魔法呢?让我们一探究竟。使用媒体查询监听器在CSS中,我......
  • C语言链表:链式魔法,数据之美
    导入链表,作为C语言中一种基础且重要的数据结构,以其独特的方式组织和存储数据,成为了解决许多复杂问题的关键。下面,我们将更具体地探讨C语言链表的各个方面。一、链表的基本结构链表由一系列节点组成,每个节点通常包含两部分:数据域和指针域。数据域用于存储实际的数据,而指针域......