Magician and Pigs

分析一下三个操作分别干了些什么

  1. 新添一只猪
  2. 使血量为 \(x\) 的猪血量变为 \(\max(x-v,0)\)
  3. 设前面操作后猪总共会受到 \(s\) 的伤害,复制一只血量为 \(\max(x-s,0)\) 的猪,使 \(s=s\times 2\)

根据操作 \(3\) 可得最多 \(\log x\) 次操作后会杀死任何一只复制的猪,此时复制变得没有任何意义。当没有任何操作 \(2\) 时,操作 \(3\) 变成了使猪的数量翻倍。所以考虑倒着做,处理每只猪最后能剩下多少猪。

预处理出每次操作 \(2/3\) 会造成多少伤害,对于操作 \(1\),若它后面产生的伤害已经超过这只猪的血量,显然不会有任何贡献。先去掉操作 \(2\) 造成的伤害,再考虑操作 \(3\) 造成的伤害。如果倒过来的第 \(i\) 次操作 \(3\) 造成 \(x\) 伤害能吃下来,那么前面所有伤害之后都能吃下来,因为每次伤害至少翻倍,那一只猪会变为 \(2^{cnt-i}\) 只猪,\(cnt\) 表示这次操作 \(1\) 后面共有 \(cnt\) 次操作 \(3\)。这是没有复制的猪承受伤害能增加的数量,还有复制出来的猪承受伤害能增加的数量,所以将血量减去 \(x\),再往前找。因为最多找 \(log x\) 次,所以复杂度为 \(O(n\log x)\)。

点击查看代码
#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
using namespace std;
namespace IO{
template<typename T>
inline void read(T &x){
x=0;
int f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
x=(f==1?x:-x);
}
template<typename T>
inline void write(T x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10){
write(x/10);
}
putchar(x%10+'0');
}
template<typename T>
inline void write_endl(T x){
write(x);
putchar('\n');
}
template<typename T>
inline void write_space(T x){
write(x);
putchar(' ');
}
}
using namespace IO;
const int N=8e5+10,mx=1e9,mod=998244353;
int n,m,opt[N],val[N],c[N],cnt,s[N],d[N],tot,sum,res=1,ans;
void solve(){
read(n);
for(int i=1;i<=n;i++){
read(opt[i]);
if(opt[i]!=3){
read(val[i]);
}
if(opt[i]==2){
sum+=val[i];
}
if(opt[i]==3){
val[i]=sum;
sum*=2;
}
sum=min(sum,mx);
}
sum=0;
for(int i=n;i;i--){
if(opt[i]==2){
sum+=val[i];
}
if(opt[i]==3){
if(val[i]==mx){
continue;
}
if(!val[i]){
res=res*2%mod;
continue;
}
c[++cnt]=val[i];
}
else{
val[i]-=sum;
if(val[i]<=0){
continue;
}
int S=0;
for(int j=1;j<=cnt;j++){
if(val[i]>c[j]){
S=(S+(1ll<<(cnt-j))%mod)%mod;
val[i]-=c[j];
}
}
ans=(ans+(S+1)*res)%mod;
}
}
write_endl(ans);
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
int t=1;
while(t--){
solve();
}
return 0;
}

cf1774f解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  10. ACM: Just a Hook 解题报告 -线段树

    E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

随机推荐

  1. 京东薅羊毛脚本-Docker

    一.安装好docker,然后创建容器: 注1:如果是旁路由,建议用--network host \代替-p 5678:5678 \这一行. 注2:如果想要看到lxk0301大佬的js脚本,并且重新部署 ...

  2. Asp.Net Core 程序开发技巧汇总

    使用Sqlite数据库 创建项目 Asp.Net Core Web应用程序 Web应用程序 ASP.NET Core 2.2 NuGet管理,添加Sqlite数据库支持 Microsoft.Entit ...

  3. OSPF故障诊断

  4. 大量数据的mysql分页查询

    优化之前 SELECT a, b FROM c LIMIT 800000,5000 优化之后 SELECT a, b FROM c WHERE id >= ( SELECT id FROM c ...

  5. Python学习笔记--高阶技巧

    闭包(避免全局变量被修改的风险) 函数的嵌套的利用 若是只是调用到外部函数的值,只需要用到函数的嵌套,具体实现如下: 若是要对外部函数的值进行修改,需要用到nonlocal关键字,具体实现如下: at ...

  6. Day04笔记

    01.explicit的作用(了解) class Maker { public: //explicit只能放在构造函数前面,构造函数只有一个参数或其他参数有默认值时 explicit Maker(in ...

  7. 简述SpringAOP的实现原理

    ​ Spring默认采取的动态代理机制实现AOP,当动态代理不可用时 (代理类无接口)会使用CGlib机制. Spring提供了两种方式来生成代理对象:JDKProxy和Cglib,具体使用哪种方式生 ...

  8. [nefu]算法设计与分析-锐格实验

    谈点个人感想:锐格这个题目和数据要是再不维护,估计直接就裂开了,跪求学校升级改进一下OJ系统和题目Orz 实验一 递归与分治 6104 #include<bits/stdc++.h> us ...

  9. python入门教程之一 什么是python

    python简介 1 什么是python Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页 ...

  10. 【论文阅读笔记】Class-Incremental Learning with Strong Pre-trained Models

    Key_words: Continual learning, strong pretrained model, fix, fusion Create_time: April 14, 2022 6:32 ...