尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

noipd8t2 - Slayer

noipd8t2 - Slayer
📅 发布时间:2026/6/20 3:46:37

要理解这段代码,需结合题目要求和题解的逆变换 + 辗转相除思路,逐部分分析:

  1. 题目核心与题解思路

    回顾题目要求:给定两个线性变换 \(T1((x,y))=(x+y,y)\)、\(T2((x,y))=(x,x+y)\),对于每个查询向量 \((x,y)\),统计有多少个给定的向量可通过若干次\(T1/T2\)变换(包括 0 次)得到。

    题解思路:正向变换可能无限多,逆变换分析更高效。
    观察到:若某一步向量的分量 \(x \leq 0\) 或 \(y \leq 0\),后续会一直保持,而查询的 \((x,y)\) 满足 \(x,y>0\),因此逆变换只有 “大数减小数的倍数” 这一种操作,类似欧几里得辗转相除。对每个给定向量,预处理其 “逆变换的所有中间状态”,存储后排序;查询时,对\((x,y)\)做同样的逆变换,通过二分查找统计符合条件的中间状态数量。

  2. 代码结构与关键逻辑解释

    (1)数据结构与输入处理
    tri 是 std::tuple<int,int,int>,用于存储逆变换过程中的三元组(记录当前分量、余数、原分量信息)。p[0] 和 p[1] 是两个数组,分别存储 “\(a \leq b\)” 和 “\(a > b\)” 两种情况下的三元组;m[0]、m[1] 是对应数组的元素计数。处理每个给定向量 \((a,b)\) 的循环:

    
    for(int a,b,f;n--;){a=read(),b=read(),f=0;while(a&&b)if(a<=b)p[0][++m[0]]={a,b%a,b-f},b%=a,f=1;else p[1][++m[1]]={b,a%b,a-f},a%=b,f=1;
    }

    这里模拟逆变换的辗转相除过程:若 \(a \leq b\),逆变换对应 “由 \((b, a)\) 变换到 \((a, b\%a)\)”,记录三元组 \((a, b\%a, b - f)\)(b - f 用于后续查询时判断原分量范围),然后更新 \(b = b\%a\),标记 \(f=1\)(表示已进行一次操作)。若 \(a > b\),类似处理,记录三元组 \((b, a\%b, a - f)\),更新 \(a = a\%b\),标记 \(f=1\)。循环直到 a 或 b 为 0,此时所有中间状态都被记录到 p[0] 或 p[1] 中。

    (2)排序预处理

    for(int o=2;o--;)std::sort(p[o]+1,p[o]+1+m[o]);
    

    对 p[0] 和 p[1] 分别排序,为后续二分查找做准备,确保能快速统计符合条件的三元组数量。

    (3)查询处理

    for(int a,b,ans;q--;){a=read(),b=read(),ans=0;ans+=std::upper_bound(p[0]+1,p[0]+1+m[0],tri{a,b%a,(int)1e18})-p[0];ans-=std::lower_bound(p[0]+1,p[0]+1+m[0],tri{a,b%a,b})-p[0];ans+=std::upper_bound(p[1]+1,p[1]+1+m[1],tri{b,a%b,(int)1e18})-p[1];ans-=std::lower_bound(p[1]+1,p[1]+1+m[1],tri{b,a%b,a})-p[1];printf("%lld\n",ans);
    }
    

    对每个查询 \((x,y)\)(代码中用a,b接收),模拟逆变换的辗转相除步骤,分两种情况统计:

    • 情况 1(对应p[0]):
      计算 \(y\%x\),在 p[0] 中查找三元组满足 “第一个元素是x、第二个元素是 \(y\%x\)、第三个元素在 \([y, 1e18)\) 范围内” 的数量(通过 upper_bound 和 lower_bound 的差实现)。

    • 情况 2(对应p[1]):
      计算 \(x\%y\),在 p[1] 中查找三元组满足 “第一个元素是y、第二个元素是\(x\%y\)、第三个元素在\([x, 1e18)\)范围内” 的数量。
      两者数量之和即为该查询的答案。

  3. 时间复杂度与效率预处理阶段:

    每个向量的辗转相除次数是 \(O(\log V)\)(V 是分量最大值),共 n 个向量,且排序的时间是 \(O(n \log V \log n)\)。

    查询阶段:每个查询的辗转相除次数是 \(O(\log V)\),每次二分查找是 \(O(\log n)\),共 q 个查询,总时间是 \(O(q \log V \log n)\)。

    整体复杂度 \(O((n + q) \log V \log n)\),能高效处理题目中的大规模数据。

综上,这段代码通过逆变换 + 辗转相除 + 二分查找的思路,将原问题转化为对 “变换中间状态” 的统计问题,实现了高效的查询。

相关新闻

  • OJ模拟面试3(异步判题架构)
  • 破局内容运营效率:2025 微信编辑器 10 款深度测评
  • 2025氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件推荐榜:福维科(山东)引领国产化,3 家企业凭技术实力登榜

最新新闻

  • 麻省理工研究人员打造 Fractal 操作系统,获苹果 M1 芯片新发现
  • React写的WebVR全景看房跳转demo,带贝壳式热点导航和视角控制
  • 2026年郑州脚手架搭建公司推荐:钢管脚手架/盘口脚手架搭建拆除、室内外装修架子搭设、脚手架租赁施工怎么选 - 海棠依旧大
  • 从PHP一句话木马到Webshell大马:攻防原理与实战防御指南
  • BepInEx IL2CPP启动失败:技术原理与完整解决方案指南
  • Elastic 被评为 IDC MarketScape《2026 年全球 SIEM 厂商评估》领导者

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号