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

2026.8.15

stone

\(n\) 枚符石,第 \(i\) 枚符石参数为正整数 \(a_i,b_i\),初始充能槽能量 \(s=0\),放入一枚符石时产生 \(s\cdot b_i\) 的损耗,之后 \(s\) 变为 \(s+a_i\),可以任意安排放入顺序,求最小总损耗下的方案数,对 \(1000000007\) 取模,同时输出最优顺序中字典序最小的编号序列。数据范围:\(1 \le n \le 2\times 10^5\)\(1 \le a_i,b_i \le 10^4\)

Key Observation:相邻两个元素产生的贡献只跟这两个元素有关,跟前面的无关,于是可以尝试邻项交换推导贪心策略。

设原有能量为 \(s\),相邻两个石头一、二的权值分别为 \((a_1,b_1),(a_2,b_2)\)。则:

  • 先一后二:\(\Delta s_1=s_0b_1+(s_0+a_1)b_2=s_0b_1+s_0b_2+a_1b_2\)
  • 先二后一:\(\Delta s_2=s_0b_2+(s_0+a_2)b_1=s_0b_1+s_0b_2+a_2b_1\)

发现 \(a_1b_2,a_2b_1\) 是这两种方案的区别,直接按照 \(a_1b_2<a_2b_1\) 排序即可,注意相同时按照编号小的在前面。

计数也非常简单,容易发现连续 \(k\) 个满足 \(a_{i-1}b_{i}=a_{i}b_{i-1}\)\(i(1 \le i < n)\) 可产生 \(k!\) 的贡献,每个连续段相互独立,用乘法原理。

时间复杂度 \(O(n \log n)\).

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
constexpr int N=2e5+7;
constexpr ll mod=1e9+7;
int n; ll ans=1,fac[N];
struct node{ll a,b;int id;}p[N];
ll calc()
{ll res=0,s=0;for(int i=1;i<=n;i++){res+=s*p[i].b;s+=p[i].a;}return res;
}
int main()
{freopen("stone.in","r",stdin);freopen("stone.out","w",stdout);cin.tie(0)->sync_with_stdio(0);cin>>n;fac[1]=1;for(int i=2;i<=n+2;i++) fac[i]=(fac[i-1]*i)%mod;for(int i=1;i<=n;i++) cin>>p[i].a>>p[i].b;for(int i=1;i<=n;i++) p[i].id=i;sort(p+1,p+n+1,[&](node A,node B){if(A.a*B.b==B.a*A.b) return A.id<B.id;else return A.a*B.b<B.a*A.b;});cout<<calc()<<" ";// for(int i=1;i<=n;i++) cerr<<p[i].a<<" "<<p[i].b<<"\n";ll continuous=0;  //连续for(int i=2;i<=n;i++){if(p[i-1].a*p[i].b==p[i].a*p[i-1].b){// cerr<<i<<endl;continuous++;}else{ans=(ans*fac[continuous+1])%mod;// cerr<<"contribution"<<continuous+1<<'\n';continuous=0;}// cerr<<continuous<<' '<<fac[continuous+1]<<'\n';}ans=(ans*fac[continuous+1])%mod;cout<<ans<<"\n";for(int i=1;i<=n;i++) cout<<p[i].id<<" \n"[i==n];cout.flush();return 0;
}
/*
整场比赛策略:T1正解+对拍 -> T2T3T4暴力 -> T2正解Observations:
1.a[i]相同时,按照b[i]从大到小的顺序放置,b[i]相同时,按照a[i]从小到大的顺序排序
2.相邻两个元素产生的贡献只跟这两个元素有关,跟前面的无关?假设原始有s0能量,然后有两个(a1,b1),(a2,b2)
先一后二:Δs=s0*b1+(s0+a1)*b2
先二后一:Δs=s0*b2+(s0+a2)*b1展开后都包含s0b1+s0b2项,唯一有区别的是第一个有a1b2,第二个有a2b1!!!
贪心正解就如同探囊取物a1b2=a2b1的相邻元素是计数的关键
*/
http://www.jsqmd.com/news/1399314/

相关文章:

  • 闲置加油卡无需过期浪费!2026四类加油卡回收变现渠道实测对比 - 京顺回收
  • 想在Windows上找回被偷走的时间?这款免费开源的软件使用时长统计工具帮你把每一分钟都记在账上
  • 零成本快速搭建企业管理系统:ERPNext 开源 ERP 完整上手指南
  • 2026年8月库尔勒屋顶漏水维修哪家好?屋面防水科普指南 - 聪居到家
  • MusicBee网易云歌词插件从入门到精通:5步解锁精准歌词同步与双语歌词显示
  • md2wechat-skill 多账号管理攻略:轻松搞定多个微信公众号的批量发布
  • 支付宝消费券别过期了!实测三大平台资质与回收价格对比 - 京顺回收
  • 为什么 League Akari 是英雄联盟玩家值得一试的免费游戏效率工具
  • JIT哲学与AI建站融合:实现网站按需交付与分钟级上线
  • 2026年不干胶标签印刷厂家推荐:防水防油耐候定制不干胶标签选择指南 - 汇聚至此
  • Clawdbot工程方案:融合CV与LLM,彻底解决UI自动化定位符不稳定难题
  • Arnis真实世界Minecraft地图生成指南:如何把家乡街景搬进游戏世界?
  • 微信防撤回补丁RevokeMsgPatcher:Windows消息保护终极指南
  • 2026年进贤县监控安防推荐:安全守护,信赖之选 - 官方资讯
  • 支付宝立减金回收平台哪家稳?2026行情解析与实操避坑指南 - 京顺回收
  • Playnite游戏库管理完整指南:三步整合全平台游戏,把上千款游戏收进一个界面
  • 没有打印机也能开发条码标签?ZPL虚拟打印机零硬件实战全攻略
  • OpenCore EFI 自动化配置工具 OpCore-Simplify:从硬件报告到可用 EFI 的完整上手指南
  • 从0到1开发分布式追踪:gh_mirrors/tr/trading的OpenTracing实现案例
  • 海口包包回收前先做这三件事,减少折价、规避压价、多卖20% - 一刻涨新知
  • 局域网联机终极方案:Goldberg 模拟器完整上手指南
  • 让AI替你写文档、做PPT、管文献:Harness Anything办公自动化上手指南
  • 鸽姆智库《人类文明永续治理公理宪章》(Charter of Axioms for Perpetual Governance of Human Civilization)
  • PingFangSC苹果平方字体包保姆级教程:6种字重+2种格式,跨平台中文字体一步到位
  • Homebrew 完整指南:15 秒安装一个软件,把重复部署时间压缩 90% 的包管理器
  • 5 步玩转 ExoPlayer 视频滤镜:轻松写出第一个 OpenGL 实时特效
  • 支付宝立减金回收平台实测,四种渠道横向对比 - 京顺回收
  • shriek-fx 事件回溯实战:如何利用 ES 特性实现业务数据的精准追踪与回滚
  • 2026阳泉香奈儿包包回收就来毓典奢品汇18617962974全国连锁专业靠谱 - 丽坤奢品汇
  • 一台电脑、一个窗口、所有游戏:Playnite游戏库管理工具使用手记