D. Equalize the Remainders 解析(思維)
Codeforce 999 D. Equalize the Remainders 解析(思維)
今天我們來看看CF999D
題目連結
題目
略,請直接看原題
前言
感覺要搞個類似\(stack\)的東西來儲存下一個沒滿的\(\mod m\)是哪一個才能避免\(O(m^2)\)的複雜度,沒想到反過來想,儲存前一個滿出來的是什麼就可以了。
想法
首先可能會想到,先把每個\(mod\)值都儲存到一個\(vector<int> as[\_n]\)裡,然後從\(mod=0\)開始一直到\(mod=m-1\),如果當前\(mod\)的數字太多,那就找最近的下一個\(mod\)還沒滿的值填補上去。然而這樣的複雜度要\(O(m^2)\)。
我一開始是想說看怎麼樣能利用類似\(stack\)的結構,去\(O(1)\)找到對於某個\(mod=i\)來說的下一個還沒滿的\(mod\)值,但是其實如果反過來想,每次如果有多出來的\(mod\)值,就先\(push\_back\)到一個\(vector\)裡,那麼繼續遍歷\(i=0\sim m-1\),當發現一個還沒滿的\(mod\)值時,\(vector\)末端的元素一定是靠當前\(i\)最近的。
然而會發現當前未滿的\(mod=i\)有可能需要後面的\(mod>i\)來填補,於是我們遍歷\(i\)時不要只到\(m-1\),而是讓\(i=0\sim 2m-1\),如此一來問題就解決了。
程式碼:
const int _n=2e5+10;
ll t,tt,n,m,mm,k,ii,a[_n],cnt;
VI as[_n],free;
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;mm=m*2,k=n/m;rep(i,0,n){cin>>a[i];as[a[i]%m].pb(i);}
rep(i,0,mm){
ii=i%m;
if(SZ(as[ii])>k){
t=SZ(as[ii])-k;
rep(j,0,t)free.pb(as[ii][j]);
}
if(SZ(as[ii])<k){
t=min(SZ(free),k-SZ(as[ii]));
rep(j,SZ(free)-t,SZ(free)){
tt=a[free[j]]%m;if(tt>ii)tt-=m;
a[free[j]]+=ii-tt,cnt+=ii-tt;
}free.erase(free.end()-t,free.end());
}
}
cout<<cnt<<'\n';
rep(i,0,n)cout<<a[i]<<' '; cout<<'\n';
return 0;
}
\(free\)這個\(vector\)名稱已經存在了,需要\(\#define\ free\ [隨便一個字串]\)
標頭、模板請點Submission看
Submission
D. Equalize the Remainders 解析(思維)的更多相关文章
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
- C. k-Amazing Numbers 解析(思維)
Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...
- D. Road to Post Office 解析(思維)
Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...
- C. Bank Hacking 解析(思維)
Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...
- B. Kay and Snowflake 解析(思維、DFS、DP、重心)
Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...
随机推荐
- python中浅拷贝和深拷贝的区别
浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...
- 日志分析平台ELK之日志收集器logstash常用插件配置
前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...
- C/C++ 条件编译
条件编译就是指有条件的编译,即根据条件去编译代码,在编译阶段时就对代码做出取舍,有的编译,有的不编译,这样比写成一个个判断函数更有效率,比如工程代码大部分的地方都类似,只有个别语句因为使用的硬件版本不 ...
- 【题解】CF1375D Replace by MEX
\(\color{purple}{Link}\) \(\text{Solution:}\) 观察到题目要求操作次数不超过\(2n,\)且不必最小化操作次数,所以一定是构造题. 考虑将序列转化为\([0 ...
- 【MySQL Errors】Table 'xxx' is marked as crashed and should be repaired 的解决方案
现象描述 访问 Zabbix Web,出现如下错误提示: • Error in query [SELECT * FROM history_uint h WHERE h.itemid='25067' O ...
- Docker笔记1:Docker 的介绍
目 录 1.Docker 简介 2.Docker 特性 3.Docker 应用场景 4.Docker 优点 1.Docker 简介 Docker 提供了一个可以运行你的应用程序的封套(env ...
- linux 已放弃(吐核) (core dumped) 问题分析
在运行自己写的 C 多线程程序是,出现:已放弃(吐核) 问题. 出现这种问题一般是下面这几种情况: 1.内存越界 2.使用的非线程安全的函数 3.全局数据未加锁保护 4.非法指针 5.堆栈溢出 也就 ...
- dubbo使用问题
新入职此公司, 发现公司使用的框架原来是传说中的分布式的(原谅我以前在传统公司工作,并远离浪潮久矣), 使用过程中发现各服务之间使用 dubbo 进行通信. 特地总结下遇见的坑,为以后总结经验. ...
- Cesium资料
CesiumLab论坛:https://github.com/cesiumlab/cesium-lab-forum/issues简书上的Cesium实验室文集:https://www.jianshu. ...
- 2014年 实验二 B2C网上购物
实验二 B2C网上购物 [实验目的] ⑴.熟悉虚拟银行和网上支付的应用 ⑵.熟悉并掌握消费者B2C网上购物和商家的销售处理 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网 (3) ...