当前位置: 首页 > news >正文

UOJ Round #33 部分题目题解

比赛传送门:UOJ Round #33。

A 题赛时切了。

B 题解

首先将 \(0\) 看作 \(-1\)\(1\) 看作 \(+1\),设前缀和序列为 \(b\)

\(i\) 为满足 \(b_i=y\) 的最小值,\(j\) 为满足 \(b_i=-x\) 的最小值。

如果 \(i,j\) 不存在,那么对于每一个士兵肯定攻击最近的一个敌方士兵来保证平局,因此输出 Draw。

如果 \(i,j\) 有一个不存在,那么将其设为 \(+\infty\)

\(i<j\) 那么 Aries 必胜,否则 Aqua 必胜。

考虑证明前半部分,后半部分同理。

首先对于 Aries 的士兵来说,若它们的后面有 Aqua 的士兵,那么就攻击,否则攻击 Aqua。

因为这时不存在 \(k<i\) 使 \(b_k = -x\),那么 Aqua 怎么打都是输的。

那么问题就转化为如何找到 \(i,j\),显然可以考虑放宽限制,将第一个限制改为 \(\ge\) 第二个限制改为 \(\le\),显然还是成立,直接线段树二分即可。

如果不会放宽限制,可以直接分块冲过去。

这里实现的是线段树二分。

#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
inline int read(){char c=getchar();int f=1,ans=0;while(c<48||c>57) f=(c==45?f=-1:1),c=getchar();while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();return ans*f;
}
const int N=2e5+10;
int a[N],b[N],n,m;
int t1[N<<2],t2[N<<2],add[N<<2];
#define lc k<<1
#define rc k<<1|1
inline void pushdown(int k){if (add[k]){int x=add[k];t1[lc]+=x,t1[rc]+=x,add[lc]+=x,add[rc]+=x,t2[lc]+=x,t2[rc]+=x;add[k]=0;}
}
void change(int k,int l,int r,int l1,int r1,int x){if (l1<=l&&r1>=r){add[k]+=x,t1[k]+=x,t2[k]+=x;return ;}int mid=l+r>>1;pushdown(k);if (l1<=mid) change(lc,l,mid,l1,r1,x);if (r1>mid) change(rc,mid+1,r,l1,r1,x);t1[k]=max(t1[lc],t1[rc]),t2[k]=min(t2[lc],t2[rc]);
}
int ask1(int k,int l,int r,int l1,int r1){if (l1==0) l1++;if (l1>r1) return 0;if (l1<=l&&r1>=r) return t1[k];int mid=l+r>>1,ans=-1e18;pushdown(k);if (l1<=mid) ans=max(ans,ask1(lc,l,mid,l1,r1));if (r1>mid) ans=max(ans,ask1(rc,mid+1,r,l1,r1));return ans;
}
int ask2(int k,int l,int r,int l1,int r1){if (l1<=l&&r1>=r) return t2[k];int mid=l+r>>1,ans=1e18;pushdown(k); if (l1<=mid) ans=min(ans,ask2(lc,l,mid,l1,r1));if (r1>mid) ans=min(ans,ask2(rc,mid+1,r,l1,r1));return ans;
}
inline int get1(int l,int r,int x){int ans=1e18;int tmp=l;while(l<=r){int mid=l+r>>1;if (ask1(1,1,n,tmp,mid)>=x) ans=mid,r=mid-1;else l=mid+1;}return ans;
}
inline int get2(int l,int r,int x){int ans=1e18;int tmp=l;while(l<=r){int mid=l+r>>1;if (ask2(1,1,n,tmp,mid)<=x) ans=mid,r=mid-1;else l=mid+1;}return ans;
}
main(){n=read(),m=read();for (int i=1;i<=n;i++) scanf("%1lld",a+i);for (int i=1;i<=n;i++) b[i]=b[i-1]+(a[i]?-1:1),change(1,1,n,i,i,b[i]);while(m--){int op=read(),l=read();if (op==1){change(1,1,n,l,n,(a[l]?2:-2));a[l]^=1;} if (op==2){int r=read(),x=read(),y=read();int i=get1(l,r,y+ask1(1,1,n,l-1,l-1)),j=get2(l,r,-x+ask1(1,1,n,l-1,l-1));if (i==1e18&&j==1e18) puts("Draw");else if (i<j) puts("Aries");else puts("Aqua");}}return 0;
}
http://www.jsqmd.com/news/343110/

相关文章:

  • 中科院分区表发布在即!人工智能领域7本期刊升1区TOP,2025中科院分区升降对比!
  • 分布式锁的特性是什么?如何实现分布式锁?
  • 千兆宽带在英国城乡地区加速普及
  • 计算机大数据毕设实战-基于Python+Echart的学生心理健康数据可视化系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java 企业级 Agent 实战:完整工程模板 · 多 Agent + Graph 工作流落地指南
  • 老年人评估项目开发记录8
  • 5步搞定|宠物AI识别与智能剪辑开发实践
  • webvnc用法 —— 使用noVNC实现浏览器网页访问vnc(基于web的远程桌面)
  • 【毕业设计】基于Python+Echart的学生心理健康数据可视化系统设计与实现(源码+文档+远程调试,全bao定制等)
  • 408真题解析-2010-32-操作系统-中断处理过程
  • 2026年诚信的超高压水刀,五轴水刀厂家行业优选榜单 - 品牌鉴赏师
  • 道路直播:以安全为基,藏温暖于行
  • nodejs基于vue的行政职业能力测试系统的设计与实现-vue
  • DeepSeek大模型微调实战:从入门到精通的完整指南
  • 深入解析:挑战概率直觉:蒙提霍尔问题的解密与应用
  • 萤石开放平台 音视频 | 标准流直播协议
  • 【计算机毕业设计案例】基于Python+Echart的学生心理健康数据可视化系统设计与实现(程序+文档+讲解+定制)
  • nodejs基于web的动漫插画分享网站
  • 互联网人必藏:大模型技术落地实战指南,从小白到高手的进阶之路_互联网行业AI大模型开发解决方案
  • 【年度妙题】神秘无理函数的最值问题与柯西不等式的应用
  • Java后端开发 or AI大模型应用开发?这么简单的问题还用做选择?
  • AI应用架构师用可视化工具提升企业AI竞争力:4个推荐工具
  • 掌握应用开发学习路线,快速成为大模型专家!大模型学习路线,AI大模型开发全流程解析及项目实战!
  • PCIe-Completion Timeout Mechanism
  • AI大模型开发进阶之路:五阶段学习路线助你成为高薪开发者
  • 彼得林奇对公司供应链多元化策略的效果评估
  • 基于微信小程序的高校班务管理系统(源码+lw+部署文档+讲解等)
  • nodejs基于微信小程序的学习交流论坛考试平台
  • 掌握大数据领域Doris的配置参数调优
  • 空间知识图谱赋能多模态合成:提升大模型空间理解能力的新范式