ABC355E Guess the Sum 题解

news/2024/9/30 1:39:45

ABC355E Guess the Sum

题目大意

给定一个长度为 \(2^n\) 的序列 \((A_0,A_1,\dots,A_{2^n-1})\),每次可以询问一个长度为 \(2^i\) 的区间 \([l,r]\),满足 \(l\)\(2^i\) 的倍数,标准输入会返回 \([l,r]\) 的区间和 \(\bmod 10\) 的结果,要求以最少的次数计算出给定区间 \([L,R]\) 的区间和。

Solve

\(sum\) 为原序列的前缀和数组,询问区间 \([l,r]\) 的区间和相当于询问 \(sum_r-sum_{l-1}\)

考虑在前缀和上建图,如果可以询问区间 \([l,r]\),那么就在 \(l-1\)\(r\) 间连一条无向边。建边后从 \(L-1\) 跑单源最短路即可,可以用 BFS 跑,因为边权都是 \(1\)

至于输出询问,我们可以对于每个点 \(i\),用 \(fa_i\) 记录它是从哪个点转移过来的,最后从 \(R\) 跑一遍 DFS 即可。

注意,原序列的下标从 \(0\) 开始,所以访问 \(sum_{0-1}\) 时会出问题,应将原序列下标整体加一。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{short f=1;int x=0;char c=getchar();while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a,b,ans,res,fa[1<<19];
vector<int>e[1<<19];
bool vis[1<<19];
void bfs()
{queue<int>q;q.push(a);vis[a]=1;while(!q.empty()){int u=q.front();q.pop();for(auto i:e[u])if(!vis[i]){fa[i]=u;vis[i]=1;if(i==-~b)	return;q.push(i);}}
}
void dfs(int u)
{int len=log2(abs(fa[u]-u));if(fa[u]>u)//若转移点在当前点右侧,说明是走回头路,应减去这一段区间和。printf("? %lld %lld\n",len,u/(1<<len)),fflush(stdout)/*清空缓冲区*/,ans-=(res=read());else//否则应加上区间和printf("? %lld %lld\n",len,(fa[u])/(1<<len)),fflush(stdout),ans+=(res=read());if(res==-1)	exit(0);//依题意,若询问不合法或询问次数多于最小次数标准输出会返回-1,此时退出。if(fa[u]!=a)	dfs(fa[u]);//若是从起点a-1转移过来,则说明已询问完,此时不再继续询问。
}
signed main()
{n=read();a=read();b=read();for(int len=(1<<n);len;len>>=1)for(int i=1;i+len-1<=(1<<n);i=-~i)if((i-1)%len==0)//建图e[i-1].push_back(i+len-1),e[i+len-1].push_back(i-1);bfs();dfs(-~b);printf("! %lld",(ans%100+100)%100);fflush(stdout);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

单文件静默安装包 2024年6月14日

单文件静默安装包 2024年6月14日"D:\Prog\7z SFX Builder\单文件静默安装包.txt" "D:\Prog\7z SFX Builder\单文件静默安装包.txt" Version 1.0 Builder 2024年6月14日1、目的目标 制作Windows系统平台上的应用软件的静默安装包, 例如:一键安装MS-Offic…

c/c++设计模式----命令模式

1. 通过一个范例引出命令模式代码编写方法//红烧鱼,锅包肉#include <iostream> #include <list>#ifdef _DEBUG //只在Debug(调试)模式下 #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符 #define new DEBUG_N…

增补博客 第二十二篇 python 牛顿迭代法

【题目描述】编写程序,使用牛顿迭代法求方程在x附近的一个实根。【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。【输入格式】请在一行中输入方程系数a、b、c、d和实数x,数据中间以空格为间隔。【输出格式】对每一组输入的数据,输出牛顿迭代法…

python学习笔记-scrapy源码流程和自定义爬虫框架

一、scrapy源码流程流程要点:1、执行CrawlerProcess构造方法  2、CrawlerProcess对象(含有配置文件)的spiders     2.1、为每个爬虫创建一个Crawler     2.2、执行d=Crawler.crawl(...)       d.addBoth(_done)     2.3、CrawlerProcess对象._active={…

RTE Open Day 联手 AGI Playground,最先锋 RTE+AI Builders 齐聚北京丨活动招募

6 月 22 日至 23 日,北京,AGI Playground 2024 即将引燃今夏!6 月 22 日至 23 日,北京,AGI Playground 2024 即将引燃今夏!这场备受瞩目的 AGI 盛会,将汇聚王小川、杨植麟等众多创业者。RTE 开发者社区的 Builders 和 RTE Open Day 也将亮相其中!「有一群人在一起,就很…

在DataSet数据集中 DataView筛选数据

1. 将从数据库拿到的DataSet数据集转为DataTable类型DataTable dt = SqlHelper.GetData()使用: RowFilter来实现筛选功能赛选出ClassId为我指定 ClassId的数据 dt.DefaultView.RowFilter = "ClassId=" + classId;筛选出年龄大于我 text 值的数据 dt.DefaultView.RowF…

增补博客 第十一篇 python 分段函数图形绘制

【题目描述】已知,在区间绘制该分段函数的曲线,以及由该曲线所包围的填充图形。 【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。import matplotlib.pyplot as plt import numpy as npx = np.arange(-2, 2, 0.0001) y1 = np.sqrt(2 * np.sqrt(x…

增补博客 第八篇 python 中国大学排名数据分析与可视化

【题目描述】以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:(1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;(2)结合matplotlib库,对2015-2019年间前10位大…