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

P10311 Weighted Mean Sol

题目链接

一道有些复杂的构造。

不妨设加权平均数为 \(\lambda\)。通过代换,就有了 \(\sum\limits_{i=1}^n b_i \cdot (a_i - \lambda) = 0\)。因此现在变成尝试构造 \(\lambda\)

显然的,排序对于答案的构造没有影响,因此下文中,数组默认有序。同时,记 \(c_i = a_i - \lambda\)

n为奇数

最为简单的情况。考虑直接取中位数为 \(\lambda\),则显然的,我们可以对称的让两项为 \(0\),这里不再赘述。

而对于中间位置,直接取到 \(m\),正确性显然。

n为偶数

这里又有分讨。定义 \(L = a[n/2],R = a[n/2+1]\)

L \(\ne\) R-1

那么考虑取 \(\lambda\)\(L+1\),显然上述构造成立。

L = R-1

本题最复杂的情况。

我们如果考虑取 \(\lambda = L\),然后删除 \(R\),并让 \(c_n + 1\)。那么这样又能构造了。但是会出现三个位置相同的情况。

我们需要证明,只要 \(n\) 不为 2,答案一定存在。考虑什么情况下不合法,显然是 \(c_1,c_n\) 产生了对应,那么只要重新取 \(\lambda = R\),就一定正确了。

而对于 \(n=2\) 不合法,证明是显然的。

Code

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
const int N = 1e6 + 10;
struct node{int val,id;
};
bool cmp(node x,node y){return x.val < y.val;
}
node a[N];
int b[N];
int tmp[N];
int n,m;
unordered_map<int,int> mp;
int ans[N];
void print(){for(int i=1;i<=n;i++)cout << ans[i] << " ";cout << "\n";
}
void solve(){cin >> n >> m;for(int i=1;i<=n;i++){cin >> a[i].val;a[i].id = i;}sort(a+1,a+1+n,cmp);if(n & 1){int k = ((n+1) / 2);b[k] = m;int c = a[k].val;for(int i=1;i<=n;i++)a[i].val -= c;for(int i=1;i<=n;i++)b[i] = a[i].val;b[k] = m;reverse(b+1,b+1+n);for(int i=1;i<=n;i++)ans[a[i].id] = abs(b[i]);print();return ;}else{int L,R;L = n/2,R = L + 1;if(n ==2  && a[L].val == a[R].val-1){cout << -1 << "\n";return ;}if(a[L].val == a[R].val-1){vector<int> c(n,0);vector<bool> vis(n+1,0);int tot = 0;int num = a[L].val;for(int i=1;i<=L;i++){c[++tot] = a[i].val - num;c[tot] = abs(c[tot]);}for(int i=R+1;i<=n;i++)c[++tot] = a[i].val - num;c[tot] ++ ;set<int> st;st.clear();for(int i=1;i<L;i++)st.insert(c[i]);for(int i=L+1;i<=tot;i++)st.erase(c[i]);if(!st.empty()){for(int i=1;i<=n;i++){if(c[i] == (*st.begin())){b[i] = c[tot];b[n/2+1] = b[n] = c[i];vis[i] = vis[n/2+1] = vis[n] = 1;st.clear();break;}}b[n/2] = m;int nw = L+2;for(int i=1;i<n/2;i++){if(vis[nw]) nw ++ ;if(vis[i]) continue;b[nw] = c[i];b[i] = c[nw-1];nw ++ ;}for(int i=1;i<=n;i++)ans[a[i].id] = b[i];print();return ;}reverse(a+1,a+1+n);for(int i=1;i<=n-1;i++)c[i] = 0;for(int i=1;i<=n;i++)vis[i] = 0;tot = 0;num = a[L].val;for(int i=1;i<=L;i++){c[++tot] = a[i].val - num;c[tot] = abs(c[tot]);}for(int i=R+1;i<=n;i++){c[++tot] = a[i].val - num;c[tot] = abs(c[tot]);}c[tot] ++ ;st.clear();for(int i=1;i<L;i++)st.insert(c[i]);for(int i=L+1;i<=tot;i++)st.erase(c[i]);if(!st.empty()){for(int i=1;i<=n;i++){if(c[i] == (*st.begin())){b[i] = c[tot];b[n/2+1] = b[n] = c[i];vis[i] = vis[n/2+1] = vis[n] = 1;st.clear();break;}}b[n/2] = m;int nw = L+2;for(int i=1;i<n/2;i++){if(vis[nw]) nw ++ ;if(vis[i]) continue;b[nw] = c[i];b[i] = c[nw-1];nw ++ ;}for(int i=1;i<=n;i++)ans[a[i].id] = b[i];print();return ;}}else{int c = a[L].val + 1;for(int i=1;i<=n;i++)a[i].val -= c;for(int i=1;i<=n;i++)b[i] = a[i].val;reverse(b+1,b+1+n);for(int i=1;i<=n;i++)ans[a[i].id] = abs(b[i]);print();}}
}
int main(){IOS;int T;cin >> T;while(T -- )solve();return 0;
}

后记

实际上,第一篇题解是有问题的,如果头尾相配,可能会在 \(L = R-1\) 时,出现无法匹配的情况。因此,奇数的情况是不适用的。我们需要的是找出没有重复的 \(c\),然后进行匹配。这样就合法了。

可恶的题解,让我和 ds 和空气肘击半天,最后发现构造方式是有问题的。

http://www.zskr.cn/news/1411839.html

相关文章:

  • 别再只用plt.plot了!用Matplotlib的arrow()函数给你的图表加个“方向感”(附完整参数避坑指南)
  • 2026最新东营市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • Windows 命令提示符(CMD)内容补缺输入输出重定向及管道
  • 告别迷茫!手把手拆解PCIe Gen1/Gen2物理层数据流(附实战错误排查)
  • 四平 cppm 培训机构中供国培首选 - 中供国培
  • 如何在本地安全导出Cookie文件:Get cookies.txt LOCALLY完整使用教程
  • TVA 对 CV 的代际超越逻辑(3)
  • 告别复制粘贴!用Keil MDK 5.27为GD32F450搭建专属工程模板(保姆级避坑指南)
  • 2026最新大安市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 别再让静电搞坏你的USB!手把手教你选对TVS管(附电容计算避坑指南)
  • 从‘找不到设备’到‘Hello DCU’:一次DCU-Z100驱动安装的完整排错记录与心得
  • ARM Compiler 6 LTO功能受限问题解析与优化方案
  • 爆款网页背后的秘密!惊艳全球的动效神器,让你的网站“活”过来
  • stm32从模式
  • 终极Wand增强指南:3步免费解锁专业版,开启游戏修改新体验 [特殊字符]
  • 用UGUI ScrollRect打造游戏内公告板/跑马灯:支持悬停暂停与四向滚动的完整配置流程
  • 5个必知技巧:用G-Helper彻底优化华硕笔记本性能
  • Mermaid Live Editor终极指南:5个技巧打造专业图表
  • Keil MDK Pack Installer URL机制与手动安装指南
  • Taotoken的TokenPlan套餐详解与成本控制实践分享
  • 告别「利用率崩溃」:GIPO开启大模型强化学习高效训练新方法 | ICML 2026
  • Arm MTE内存安全机制解析与安全实践
  • 2026最新大石桥市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 猫抓Cat-Catch:智能化网页媒体资源嗅探工具,如何实现一键式视频音频捕获?
  • AutoBridge:LLM驱动的智能设备自动化集成方案
  • 2026最新大同市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 终极指南:5步在Mac上解锁QQ音乐加密文件,实现全平台播放自由
  • Blender 3MF插件:3D打印工作流的完整解决方案
  • 别再让服务器偷偷费电了!手把手教你配置PCIe ASPM,轻松降低平台功耗
  • 如何高效使用抖音下载器:3个实用技巧快速获取无水印视频