F.Enchanted

https://codeforces.com/gym/105139/problem/F24湖北省赛F

看了一下前面两种操作,做法不是很明显

后面两种操作,一看就是可持久化线段树,单点修改,版本复制

接下来解决前面的两种操作

第一个操作

两个相同的合成一个新的(3+3->4),感觉是二进制,

举个例子,[1,2,2,4]->[1,3,4]最大是4, 我们模拟二进制运算,我们维护(2^{a[i]]})就可以转化成二进制,(1021)->(1101),找最高位1的位置即可,__lg函数得到答案

第二个操作

沿着第一个操作思路以及例子,k=3,(1101)+(100)->(10001),发现高位的1,1都向前进了,比k低位的1不会有贡献,我们就可以模拟这个操作,计算贡献

#include<iostream>
#define INF (1ll<<61)
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int mo=19260817;
const int N=1e6+9;
int a[N];
int n,m;
ll A;
int p,q;
//可持久化线段树
struct KCJSEG{
    struct node{
	    int l,r;
	    ll val;
	}seg[N<<5];
	#define tl(id) seg[id].l
	#define tr(id) seg[id].r
	#define pushup(id) seg[id].val=seg[tl(id)].val+seg[tr(id)].val
	int root[N],index,mx;
	int inrange(int L,int R,int l,int r){return L>=l && R<=r;}
	int outofrange(int L,int R,int l,int r){return L>r || l>R;}
	void build(int &id,int l,int r){
	    id=++index;
	    if(l==r){
	        seg[id].val=a[l];
	        return;
	    }
	    int mid=(l+r)>>1;
	    build(tl(id),l,mid);
	    build(tr(id),mid+1,r);
	    pushup(id);
	}
	void update(int post,int &curr,int l,int r,int pos,int v){
	    curr=++index;
	    seg[curr]=seg[post];
	    if(l==r){
	        seg[curr].val=v;
	        return;
	    }
	    int mid=(l+r)>>1;
	    if(mid>=pos){
	        update(tl(post),tl(curr),l,mid,pos,v);
	    }else{
	        update(tr(post),tr(curr),mid+1,r,pos,v);
	    }
	    pushup(curr);
	}
	ll query(int curr,int L,int R,int l,int r){
		if(inrange(L,R,l,r)){
			return seg[curr].val;
		}else if(!outofrange(L,R,l,r)){
			int mid=(L+R)>>1;
			return query(tl(curr),L,mid,l,r)+query(tr(curr),mid+1,R,l,r);
		}else{
			return 0;
		}
	}
}tr;
void rnd(){	
	A*=7;
	A+=13;
	A%=mo;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>A>>p>>q;
	for(int i=1;i<=n;i++){
		rnd();
		a[i]=(A%q)+1;
	}
	for(int i=1;i<=n;i++){
		a[i]=1ll<<a[i];
	}
	tr.build(tr.root[0],1,n);
	for(int i=1;i<=m;i++){
		tr.root[i]=tr.root[i-1];
		rnd();
		int opt=(A%p)+1;
		if(opt==1){
			rnd();
			int L=(A%n)+1;
			rnd();
			int R=(A%n)+1;
			int l=min(L,R);
			int r=max(L,R);
			ll ans=tr.query(tr.root[i],1,n,l,r);
			cout<<__lg(ans)<<'\n';//log2()
		}else if(opt==2){
			rnd();
			int L=(A%n)+1;
			rnd();
			int R=(A%n)+1;
			int l=min(L,R);
			int r=max(L,R);
			rnd();
			int k=(A%q)+1;
			ll res=tr.query(tr.root[i],1,n,l,r);
			ll ans=0;
			for(int j=0;res;j++){
				if(j>=k){
					if(res&1){
						ans+=(1ll<<(j+1))%mod;
						ans%=mod;
					}else{
						break;
					}
				}
				res>>=1;
			}
			cout<<(ans%mod+mod)%mod<<'\n';
		}else if(opt==3){
			rnd();
			int pos=(A%n)+1;
			rnd();
			ll k=(A%q)+1;
			k=(1ll<<k);
			tr.update(tr.root[i-1],tr.root[i],1,n,pos,k);
		}else{
			rnd();
			int t=A%i;
			tr.root[i]=tr.root[t];
		}
	}
	return 0;
}

### 回答1: Fabric Loader是Minecraft的一个模组加载器,使用它可以加载一些自定义的模组来扩展游戏的功能。如果要让穿戴有“附魔保护”的鞋子的玩家在游戏中不受到坠落伤害,可以编写以下格式的Fabric Loader模组代码: ``` package net.example.mod; import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; public class ExampleMod implements ModInitializer { @Override public void onInitialize() { // Register the callback function for player attacks AttackEntityCallback.EVENT.register((PlayerEntity player, World world, Entity entity, int i, int j) -> { // Check if the player is wearing enchanted boots ItemStack boots = player.getEquippedStack(EquipmentSlot.FEET); if (boots.getItem() == Items.DIAMOND_BOOTS && boots.hasEnchant(Enchantments.FEATHER_FALLING)) { // Cancel fall damage entity.damage(DamageSource.FALL, 0f); } return ActionResult.PASS; }); } } ``` 这段代码注册了一个回调函数,当玩家攻击实体时会执行。在回调函数中,首先获取玩家当前穿戴的鞋子,然后检查鞋子是否为钻石鞋子,并且是否附有“附魔保护”的附魔。如果满足条件,则取消实体的坠落伤害。 因此,如果一个玩家在游戏中穿戴有这样的鞋子,那么即使他从高处掉落,也不会受到坠落伤害,可以起到保护作用。 ### 回答2: 要写一个Fabric Loader格式的Minecraft模组,使得穿戴带有附魔"摔落保护"的靴子的玩家不会踩坏耕地,可以按照以下步骤进行: 1. 先确定你已经安装了Fabric Loader和Fabric API,并在开发环境中设置好相关的文件结构和配置。 2. 创建一个新的Java类,命名为"EnchantmentProtectionMod"(可以根据个人喜好进行命名)。 3. 导入必要的类和接口,例如:`net.fabricmc.api.ModInitializer`和`net.fabricmc.fabric.api.event.player.BlockBreakEvents`。 4. 实现ModInitializer接口,并重写其中的`onInitialize`方法。 5. 在onInitialize方法中,注册一个监听器,监听玩家破坏方块的事件。 6. 在监听器的回调方法中,判断玩家所穿戴的靴子是否含有"摔落保护"附魔。 7. 如果玩家穿戴的靴子含有"摔落保护"附魔,判断即将被破坏的方块是否为耕地。 8. 如果即将被破坏的方块是耕地,取消方块破坏事件的监听,以避免玩家踩坏耕地。 9. 在完成代码编写后,进行编译并将生成的mod文件放入Minecraft的mod文件夹。 10. 启动Minecraft游戏,确保Fabric Loader正确加载并启用了你的mod。 11. 穿戴带有"摔落保护"附魔的靴子,并尝试在耕地上行走,确保不再踩坏耕地。 这是一个简单的实现示例,仅供参考。根据个人的需求和理解,可以进一步完善和优化这个mod。 ### 回答3: 要写一个Fabric Loader格式的Minecraft模组,使得穿戴带有附魔“摔落保护”的靴子的玩家不会踩坏耕地,可以按照以下步骤进行: 1. 首先,在你的开发环境中安装Fabric Loader和Minecraft开发工具包。 2. 创建一个新的Fabric mod项目,并编写mod的基本代码框架。 3. 定义一个新的附魔类型“耕地保护”,该附魔可以添加到靴子上。 4. 在靴子类中添加一个判断玩家是否穿着带有“耕地保护”附魔的靴子的方法。 5. 当玩家在踩踏方块时,通过这个方法判断玩家是否穿戴了带有“耕地保护”附魔的靴子。 6. 如果玩家穿戴了这样的靴子,则阻止玩家的踩踏行为对耕地方块造成破坏。 7. 添加其他必要的代码,如注册附魔、添加配置选项等。 8. 构建并测试你的模组,确保功能正常运作。 9. 发布你的模组,并与其他玩家共享。 通过上述步骤,你可以编写一个满足需求的Fabric Loader格式的Minecraft模组,使得穿戴带有附魔“摔落保护”的靴子的玩家不会踩坏耕地。模组的功能将增加游玩的便利性和可玩性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值