【学习笔记】CF1774F2 Magician and Pigs (Hard Version)

首先不同的 1 1 1操作之间是互不影响的,因此不妨考虑只有一个 1 1 1操作的情形。对于相邻的 2 2 2操作显然可以合并。然后对于一个 3 3 3操作,可以看成是把之前的操作序列复制了一遍,那么相当于把原来的 x x x序列复制一遍到最前面,然后对于后一半 x x x序列全部减去 δ \delta δ并且 δ \delta δ乘以 2 2 2,因此 3 3 3操作不会超过 log ⁡ \log log次。不难发现 x x x序列具有单调性,那么我们可以在这个长度为 2 k ( k ≤ log ⁡ n ) 2^k(k\le \log n) 2k(klogn)的序列中二分找到第一个 > 0 >0 >0的位置。观察发现我们只需求出操作完后队首元素的值即可,因为前后两半具有对称关系。复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)。细节: δ \delta δ的初值应该是之前展开过后所有 2 2 2操作的和。 δ = 0 \delta=0 δ=0的情况需要特判。

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define db double
using namespace std;
const int mod=998244353;
const int N=1e6+5;
int n,m,nxt[N],nxt2[N];
ll s[N],s2[N],c[N],f[N],res;
struct node{
	int op;
	ll x;
}a[N];
ll fpow(ll x,ll y){
	ll z(1);
	for(;y;y>>=1){
		if(y&1)z=z*x%mod;
		x=x*x%mod;
	}return z;
}
int main(){
//	freopen("data.in","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].op,s[i]=s[i-1],s2[i]=s2[i-1];
		if(a[i].op==1||a[i].op==2)cin>>a[i].x;
		if(a[i].op==2)s[i]+=a[i].x;
		if(a[i].op==3)s2[i]++;
	}for(int i=n;i>=1;i--){
		if(a[i+1].op==3)nxt[i]=i+1;
		else nxt[i]=nxt[i+1];
		if(a[i+1].op==2)nxt2[i]=i+1;
		else nxt2[i]=nxt2[i+1];
	}
	for(int i=1;i<=n;i++){
		if(a[i].op==1){
			if(!f[0]){
				int j=nxt2[i];
				if(!j){
					res=(res+fpow(2,s2[n]-s2[i]))%mod;
					continue;
				} ll mul=fpow(2,s2[j]-s2[i]);
				m=0;
				for(j=nxt[j];j&&f[m]<=1e9;j=nxt[j]){
					m++,c[m]=s[j]-s[i],f[m]=((m==1)?f[m-1]:f[m-1]*2)+(c[m]-c[m-1]);
				}a[i].x-=s[n]-s[i];
				for(j=m;j>=1;j--){
					if(a[i].x-f[j]>0){
						res=(res+(1ll<<j-1)*mul%mod)%mod;
						a[i].x-=f[j];
					}
				}if(a[i].x>0) res=(res+mul)%mod;
			}
			else{
				m=0;
				for(int j=nxt[i];j&&f[m]<=1e9;j=nxt[j]){
					m++,c[m]=s[j]-s[i],f[m]=((m==1)?f[m-1]:f[m-1]*2)+(c[m]-c[m-1]);
				}assert(m<=31);a[i].x-=s[n]-s[i];
				for(int j=m;j>=1;j--){
					if(a[i].x-f[j]>0){
						res=(res+(1ll<<j-1))%mod;
						a[i].x-=f[j];
					}
				}if(a[i].x>0) res++;
			}
			
		}else if(a[i].op==2)f[0]+=a[i].x;
		else f[0]=min(1000000000ll,f[0]*2);
	}cout<<res;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: magician_robot.zip 是一个压缩文件,其具体内容和用途需要依据实际情况而定。一般来说,这个压缩文件可能包含有关魔术师机器人的源代码、二进制编译文件、文档/说明文件等。魔术师机器人是一种可以模仿人类魔术师对物体的控制和掌控能力,自动完成一些魔术表演的机器人系统。通过这个系统,人们可以实现更为复杂和精密的魔术表演,同时为智能机器人领域的发展带来了新的思路和技术。如果要使用 magican_robot.zip,需先解压缩文件,然后根据具体说明,安装相应软件或直接运行相应程序,即可实现机器人的魔术表演。 ### 回答2: magician_robot.zip是一个文件压缩包,其中可能包含有关于魔术师机器人的信息或者程序代码。魔术师机器人是一种特殊的机器人,可以模拟魔术师的表演,展示一些令人惊叹的魔术表演。它通常有人形外观,配备了触觉传感器、摄像头等多个传感器设备,可以对周围环境进行感知,并且配备了多个舵机和电动机,可以完成复杂的动作,如抓取物体、做手势、发声等。魔术师机器人的设计和制造需要涉及机械、电子、计算机等多个学科领域的知识,是相当高级复杂的智能机器人系统。如果您想研究制造魔术师机器人或者了解相关信息,可能需要下载并解压缩magician_robot.zip文件,从其中获得更多有关该机器人的信息。 ### 回答3: magician_robot.zip是一个文件夹,其名称中的“magician”表示魔术师,而“robot”表示机器人。因此,magician_robot.zip可能是一个用于魔术表演的机器人程序或设计文件。 在现今数字化的时代,机器人技术得到了快速发展并广泛应用。一些魔术师也开始使用机器人来加强他们的表演效果。由于机器人的动作可以被精确地编程和控制,因此可以创造出更加惊险刺激的魔术效果。 因此,magician_robot.zip可能包含了一个用于机器人表演的程序或设计文件,其中可能包含了机器人运动路径、音效和灯光控制等内容。如果您有机器人和魔术的兴趣,您可以打开这个文件夹,深入探索其中的内容并利用它们来展示您的魔术技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值