『比赛记录』【LGR-193】洛谷 7 月月赛 IABC 362

最舒服的一集

image

image


「CROI · R2」在相思树下 I

想了好久还是决定把这道题也写一下,毕竟赛事花了 \(40min\) 才解决。

思路

开比赛,看题面,很快啊,打了一个双端队列的做法,结果 MLE,然后人傻了二十分钟。

之后缓过神来开始推式子。我们把答案先看做操作后的第一个数,提供一个样例:

\[2\,\,2\,\,2\,\,1\,\,2 \]

结果为:

\[1\,\,1\,\,1\,\,9\,\,9 \]

这么看是不是看不出来什么,我们换个写法:

\[2-1\,\,4-3\,\,8-7\,\,16-7\,\,32-23 \]

再加上一个初始答案 \(1-0\),是不是看出什么了?

我们设减法式子为 \(a-b\),通过观察模拟发现一下结论:

\(op=1\) 时,\(a=2a\)

\(op=2\) 时,\(b+=a\)\(a=2a\)

初始值 \(a=1\)\(b=0\)

于是我们就快乐地找到正解了。

Code:

#include<bits/stdc++.h>typedef long long ll;const int Ratio=0;
ll n,k;namespace Wisadel
{short main(){int T,op;scanf("%d",&T);while(T--){scanf("%lld%lld",&n,&k);ll a=1,b=0;for(int i=1;i<=k;i++){scanf("%d",&op);if(op==1) a*=2;else b+=a,a*=2;}printf("%lld\n",a-b);}return Ratio;}
}
int main(){return Wisadel::main();}

看来这种有简单方法但结论复杂的题确实不适合放在 T1,尤其是对我。


「CROI · R2」在相思树下 II

一道比 T2 简单的 T3。

思路

我们发现比赛流程图的形状是一棵完全二叉树,而题目所求的出每一轮次的进入范围限制也是从它的子比赛更新而来的,因此可以按类似线段树建图的方法直接处理出每一轮次的范围,最后 \(O(1)\) 查询即可。

我们先设 \(l_i\)\(r_i\) 分别为第 \(i\) 个节点中至少有 \(l_i\) 个数比符合条件的值 \(x\) 小,至少有 \(r_i\) 个数比 \(x\) 大。

放一张图形式化一下:

(图丑,轻喷)

我们以一个按照规则二比赛的节点举例:
假设胜者为 \(x\),那么比赛后即拼凑后的范围块长右图那样。

更新时,首先已知有 \(r_1\) 个数需要比 \(x\) 大,有 \(r_2\) 个数需要比 \(y\) 大,同时要满足 \(x<y\),所以最终这一节点的 \(r_i\) 值应为 \(r_1+r_2+1\)

同时需要至少有 \(l_1\) 个数比 \(x\) 小,\(l_2\) 个数比 \(y\) 小,由获胜者为 \(x\) 我们可以推出 \(l_1<l_2\),即 \(x\) 能取到更小的值,所以在这个节点中的左边界就是 \(x\) 子节点的左边界,但这是在假设 \(x\) 获胜的情况,所以真正更新时的 \(l_i\) 应等于 \(\min(l_1,l_2)\)

按规则一比赛的节点同理,大家可以自己手动模拟下,最终转移式为:

\[l_i=l_{lson}+l_{rson}+1 \]

\[r_i=\min(r_{lson}+r_{rson}) \]

实现方面,由于二叉树的性质,我们根据节点长度 \(len\) 可知该节点所在的层数为 \(log_2 \,len\)。题目中只需要进入某一层即可,所以整层的范围就是该层所有块的左右边界值分别的最小值。

细节处理

每节点左右边界初始为 \(0\) 即无限制,每层左右边界初始为 \(inf\) 以便赋值。

更新左右边界时要先递归到叶子结点再更新,因为每节点长度是从大到小的,而我们需要由小节点推大节点。

题目询问中为轮数,转化为层数需要在输入时减去 \(1\)

Code:

#include<bits/stdc++.h>using namespace std;const int Ratio=0;
const int N=1e6+5;
const int maxx=2e9;
int n,m;
int v[N<<1],sl[N<<1],sr[N<<1],L[25],R[25];namespace Wisadel
{#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((l+r)>>1)void Wbuild(int rt,int l,int r){if(l==r) return;int ceng=log2(r-l+1);// log2 自动向下取整 Wbuild(ls,l,mid),Wbuild(rs,mid+1,r);if(v[rt]==1) sl[rt]=sl[ls]+sl[rs]+1,sr[rt]=min(sr[ls],sr[rs]);else sl[rt]=min(sl[ls],sl[rs]),sr[rt]=sr[ls]+sr[rs]+1;// 判断节点类型并进行更新 L[ceng]=min(L[ceng],sl[rt]),R[ceng]=min(R[ceng],sr[rt]);// 更新每层范围 }short main(){scanf("%d%d",&n,&m);for(int i=1;i<=(1<<n)-1;i++) scanf("%d",&v[i]);for(int i=1;i<=n;i++) L[i]=maxx,R[i]=maxx;Wbuild(1,1,(1<<n));for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);b-=1;if(a>L[b]&&(1<<n)-a>=R[b]) printf("Yes\n");// 判断是否在范围内// (1<<n)-a>=R[b] 即为 (1<<n)-a+1>R[b] else printf("No\n");}return Ratio;}
}
int main(){return Wisadel::main();}

abc_362.C Sum=0

我在昨晚的 abc 中怒吃四发罚时,很好吃,你也来试试吧(雾

一道挺唐的题,感觉没啥技术含量,但就是不好 AC,问了一圈感觉我的方法还是比较正确的。

思路

输入时直接记录左右边界分别的和,判断是否存在。

若存在,则首先将答案序列赋为其值所在区间的中间值,求出 \(sum\)。然后遍历一遍 \(1\) ~ \(n\)\(sum=0\) 时直接结束循环;若 \(sum>0\)\(ans_i-l_i>=sum\),那么直接将 \(ans_i\) 赋值为 \(ans_i-sum\) 然后退出循环即可,否则赋值为 \(l_i\) 并且 \(sum-=ans_i-l_i\);若 \(sum<0\),当 \(r_i-ans_i>=-sum\) 时,将 \(ans_i\) 赋值为 \(ans_i+(-sum)\),否则赋值为 \(r_i\) 并且 \(sum+=r_i-ans_i\)

方法的正确性可以证明。

Code:

#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
using namespace std;
typedef long long ll;
#define lx int
inline lx qr()
{char ch=getchar();lx x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;
}
#undef lx
#define qr qr()
const int Ratio=0;
const int N=1e6+5;
const int maxx=2e9;
int n;
ll ls,rs,l[N],r[N];
ll ans[N];
namespace Wisadel
{short main(){n=qr;fo(i,1,n) l[i]=qr,r[i]=qr,ls+=l[i],rs+=r[i];if(ls>0||rs<0) printf("No\n");else{printf("Yes\n");ll sum=0;fo(i,1,n){ans[i]=(l[i]+r[i])>>1;sum+=ans[i];}if(sum==0)fo(i,1,n) printf("%lld ",ans[i]);else {fo(i,1,n){if(sum>0&&ans[i]-l[i]>=sum){ans[i]-=sum;sum=0;break;}else if(sum>0&&ans[i]-l[i]<sum){sum-=ans[i]-l[i];ans[i]=l[i];}else if(sum<0&&r[i]-ans[i]>=-sum){ans[i]+=-sum;sum=0;break;}else if(sum<0&&r[i]-ans[i]<-sum){sum+=r[i]-ans[i];ans[i]=r[i];}}fo(i,1,n) printf("%lld ",ans[i]);}}return Ratio;}
}
int main(){return Wisadel::main();}

还是比较简单的,但丁真自己没过。


Updating。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/743406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[DP] 数位DP

本文主要内容:数位DP例题数位DP 主要有两种方法,填数法和记搜。这里主要研究记搜的实现; 模板 相比于填数法,记搜的优点在于有固定的模板,实现较容易; 缺点在于需要很多 $ memset $,常数较大,容易被卡; 下面通过几道例题来了解记搜模板; 一 $ haha $ 数设记搜各参数如…

数据库的触发器的使用

需要实现在passenger中添加乘客信息后,在classes(班次)中对应舱位的已售出票数+1例:在passenger中添加了一个degree=“头等舱”的乘客,就在classes中对应头等舱已售出票数goodnumber+1 (经济舱类似,对应secondnumber+1实现方法: 在passenger表中增加触发器,在新增pa…

【比赛】CSP提高组模拟1

挂的分比我打的都多和初三学长们一起打的比赛,被人家爆杀了。 T1 最短路 20Pts 原题 Cow Toll Paths G。 正解是按点权排序后跑一遍 Floyd,歪解是多迭代几遍。 赛时没开 long long \(80 \to 20\)。点击查看代码 #include<bits/stdc++.h> #define int ll using namespa…

トヨタ自動車プログラミングコンテスト2024#7(ABC 362)

非常好名次,使我的 \(1\) 旋转 四发罚时应该是这次比赛最唐的东西了,没有就进前一千了 A.Buy a Pen 特判秒了,懒得打三种 ans=,所以就把不能选的那个赋值成无穷大了 #include<bits/stdc++.h> using namespace std; #define speed ios::sync_with_stdio(false); #defi…

领域驱动设计:CQRS 和事件源的强大功能

CQRS/ES 如何重新定义构建可扩展系统。 在过去的 15 年里,我一直在深入研究领域驱动设计 (DDD),每一步都在学习和改进。我一直很好奇,尤其是当你深入挖掘时,简单的客户请求会变得更加复杂。我特别感谢EventStorming这样的工具,它帮助揭示看似简单需求背后的真实流程和事件…

k8s简介

一、K8S 概览 1)K8S 是什么? K8S 是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白话就是:“K8S 是负责自动化运维管理多个跨机器 Docker 程序的集群”。 2) K…

flutter Error: unable to locate asset entry in pubspec.yaml: assets/fonts/Lato-Regular.ttf

在pubspec.yaml中添加font的时候出现这个问题 发现是因为我放的文件夹不对,需要放在根目录下(但是我不知道为什么android studio里没有显示一些文件夹) 本来放在这里 一直不对后来在文件夹找了一下放到lib里 新建了assets文件夹

详解工单系统

工单系统在人类早期的行为活动中就一直存在的理念,是人类关于工作流程的管理和记录。随着计算机软件的不断发展,工单系统由线下转为线上,提升了问题传达的准确性、处理效率以及数据的长久留痕可追溯等,应用领域也日渐广泛。本文将着重介绍工单的概念、不同领域工单系统简介…

Vue 3 后端错误消息处理范例

前端如何存储处理后端返回的错误信息,并按不同来源绑定到页面,例如显示在不同输入框的周围。这样即可实现清晰的错误显示。1. 错误消息格式 前后端消息传递时,我们可以通过 json 的 errors 字段传递错误信息,一个比较好的格式范例为: {errors: {global: ["网络错误&q…

OpenDiary 24.7

致敬传奇耐拖王现在是,7 月 13 日。距离上一次写日记过去了 58 天 致敬传奇耐拖王 xiwon那么,在鼠鼠肘赢牢大之前的这段时间,what happened, on earth?五月下旬,前去了西安邀请赛,打的一坨。回来之后写了一点游记,但是居然还没有写完 那么到底为什么没有写完呢?这要从很…

我用cpca 截取地址中的省市区,突然就乱了,这是什么原因

大家好,我是Python进阶者。 一、前言 前几天在Python钻石交流群【逆光】问了一个Python数据处理的问题,问题如下:请问一下 我用cpca 截取地址中的省市区,突然就乱了,这是什么原因? 二、实现过程 这里【瑜亮老师】给了个思路如下:看着好像是行弄乱了。 【不上班能干啥!】…