AtCoder Beginner Contest 294(D-G
创始人
2025-06-01 01:40:53

D - Bank (atcoder.jp)

        (1)题目大意

                给你N个id,以及Q个询问,1表示用未被用到的最小的一个id,2表示x这个id现在被用到了,3表示再喊已经被喊的最小的那个人的id。

         (2)解题思路

                用两个set模拟即可。

         (3)代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair
#define fi first
#define se second
#define vi vector
#define vl vector
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
void solve()
{int n,m;cin >> n >> m;set  st,has;rep(i,1,n) st.insert(i);rep(i,1,m) {int op,x;cin >> op;if(op == 1) {int v = *st.begin();st.erase(st.begin());has.insert(v);}else if(op == 2) {cin >> x;has.erase(x);}else {cout << *has.begin() << endl;}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T = 1;// cin >> T;while(T --) solve();return 0;
}

E - 2xN Grid (atcoder.jp)

        (1)题目大意

                给你一个2*L的矩阵,第一行有N1个小段,每一段是一个数,第二行有N2个小段,每一段也是一个数,问你有多少对A[1][j] = A[2][j]

         (2)解题思路

                类似于区间合并的思想,使用双指针,若当上下指针区间元素一样,则算这个区间的交集是多少,然后根据上下指针的右边界的大小移动指针即可。

         (3)代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair
#define fi first
#define se second
#define vi vector
#define vl vector
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
#define PLL pair
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
struct Node {ll l,r;int v;
}a[N],b[N];
ll inter(ll l1,ll r1,ll l2,ll r2)
{return min(r1,r2) - max(l1,l2) + 1;
}
void solve()
{ll L,n,m;cin >> L >> n >> m;ll st = 1,x;int v;rep(i,1,n) {cin >> v >> x;a[i] = {st,st + x - 1,v};st += x;}st = 1;rep(i,1,m) {cin >> v >> x;b[i] = {st,st + x - 1,v};st += x;}int l1 = 1,l2 = 1;ll ans = 0;while(l1 <= n + 1 && l2 <= m + 1) {if(a[l1].v == b[l2].v) ans += inter(a[l1].l,a[l1].r,b[l2].l,b[l2].r);if(a[l1].r >= b[l2].r) l2 ++;else l1 ++;}cout << ans << endl;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T = 1;// cin >> T;while(T --) solve();return 0;
}

F - Sugar Water 2 (atcoder.jp)

        (1)题目大意

                两个人分别由N个瓶子和M个瓶子的糖水,设第一个人第i个瓶子由Ai克糖和Bi克水,第二个人第j个瓶子由Cj克糖和Dj克水,分别从两个人中取出一个瓶子,问你第k大糖分率是多少?

         (2)解题思路

                考虑k过大,因此考虑二分答案V

                式子可以写为\frac{xi + xj}{xi + yi + xj + yj} > V,若满足这个式子有大于V的个数有K个,那么此答案符合要求,把除法变乘法xi + xj > V(xi + yi + xj + yj),把i放一边j放一边变为(1-V)xi-Vyi>(V-1)xj+Vyj,把AB数组处理成左边式子,把CD数组处理成右边式子,排个序双指针扫一下看有多少个满足条件即可。

         (3)代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair
#define fi first
#define se second
#define vi vector
#define vl vector
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const double eps = 1e-14;
const int N = 2e5 + 10;
PII a[N],b[N];
long double A[N],B[N];
ll n,m,k;
bool check(long double V)
{rep(i,1,n) A[i] = (1 - V) * a[i].fi - V * a[i].se;rep(i,1,m) B[i] = (V - 1) * b[i].fi + V * b[i].se;sort(A + 1,A + 1 + n);sort(B + 1,B + 1 + m);ll cnt = 0,cur = 1;rep(i,1,n) {while(cur <= m && B[cur] <= A[i]) cur ++;cnt += cur - 1;}return cnt >= k;
}
void solve()
{cin >> n >> m >> k;cout << fixed << setprecision(15);rep(i,1,n) cin >> a[i].fi >> a[i].se;rep(i,1,m) cin >> b[i].fi >> b[i].se;long double l = 0,r = 1;while(r - l >= eps) {long double mid = (l + r) / 2;if(check(mid)) l = mid + eps;else r = mid - eps;}cout << l * 100 << endl;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T = 1;// cin >> T;while(T --) solve();return 0;
}

G - Distance Queries on a Tree (atcoder.jp)

        (1)题目大意

                给你一颗树有N个节点,有两种操作,第一种操作是把第i条边的权值修改为w,第二个操作是询问u到v的路径和。

         (2)解题思路

                预处理出dfs序,因为树上操作不好直接修改,因此转换成区间问题,又因为是边权和,我们可以按照dfs序把边权转换为点权处理,按照拆点的思路把树上每一个点分成入点和出点,若修改了第i条边的权值,相当于修改了第i条边的入点的和,然后在这个出点+1的位置减去修改的即可,因此可以考虑树状数组进行单点修改和区间查询。

                注意查询的时候我们是qry[1,in[u]] + qry[1,in[v]] - 2 *qry[1,lca(in[u],in[v]));查询的时候是直接查询第u节点之前的和和节点之前的和然后减去他们2倍lca的和,因为他们lca之前的全部都重复了,比如。

                

        查询4和5的和,要减去2倍2之前的和。

        (3)代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair
#define fi first
#define se second
#define vi vector
#define vl vector
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int siz[N],in[N],out[N],son[N],fa[N],top[N],dep[N],pid[N],tim;
int he[N];
struct Edge {int x,y;int v;
}e[N];
vector  G[N];
void dfs1(int u,int f)
{siz[u] = 1;in[u] = ++ tim;dep[u] = dep[f] + 1;fa[u] = f;for(auto x : G[u]) {if(x.fi == f) continue;dfs1(x.fi,u);pid[x.se] = x.fi;siz[u] += siz[x.fi];if(siz[x.fi] > siz[son[u]]) son[u] = x.fi;}out[u] = ++ tim;
}
void dfs2(int u,int f)
{top[u] = f;if(son[u]) dfs2(son[u],f);for(auto x : G[u]) {if(x.fi == fa[u] || x.fi == son[u]) continue;dfs2(x.fi,x.fi);}
}
int getLCA(int x,int y)
{while(top[x] != top[y]) {if(dep[top[x]] < dep[top[y]]) swap(x,y);x = fa[top[x]];}if(dep[x] > dep[y]) swap(x,y);return x;
}
struct Fenwick{ll tr[(N << 2) + 10];int n;Fenwick(int n = 0) {init(n);}void init(int n) {this->n = n;for(int i = 1;i <= n;++ i) {tr[i] = 0;}}int lowbit(int x) {return x & -x;}void add(int x,int v) {while(x <= n) {tr[x] += v;x += lowbit(x);}}ll qry(int x) {ll res = 0;while(x >= 1) {res += tr[x];x -= lowbit(x);}return res;}
};
void solve()
{int n,u,v;cin >> n;rep(i,1,n - 1) {int x,y,w;cin >> x >> y >> w;G[x].pb({y,i});G[y].pb({x,i});e[i] = {x,y,w};}dfs1(1,0);dfs2(1,0);Fenwick fen(n * 2);rep(i,1,n - 1) {int rp = pid[i];fen.add(in[rp],e[i].v);fen.add(out[rp] + 1,-e[i].v);}int q;cin >> q;while(q --) {int op,x,y;cin >> op >> x >> y;if(op == 1) {int rp = pid[x];fen.add(in[rp],y - e[x].v);fen.add(out[rp] + 1,e[x].v - y);e[x].v = y;}else {//询问x,yint pf = getLCA(x,y);cout << fen.qry(in[x]) + fen.qry(in[y]) - 2 * fen.qry(in[pf]) << endl;}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T = 1;// cin >> T;while(T --) solve();return 0;
}

 

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...