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 解析(思維)的更多相关文章

  1. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  2. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  3. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  4. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  5. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  6. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  7. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  8. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  9. B. Kay and Snowflake 解析(思維、DFS、DP、重心)

    Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...

随机推荐

  1. 从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞

    从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. 其本质是Picklin ...

  2. PYG2010-02-精装友情通讯录再分析

  3. springboot maven项目运行常见报错 及ajax请求报错

    如图所示 tomcat运行后直接停止,也不报错 原因:我的原因是controller路径配置重名或者service没有配置@Service 遇见这错找了好久问题,网上也搜不到,特此记录一下 问题2 a ...

  4. spring ioc 源码分析(三)--finishBeanFactoryInitialization(beanFactory)

    之前的博客专门分析了一个类到BeanDefinition的创建过程,现在分析BeanDefinition 到一个bean的创建过程:从refresh() 方法的---->finishBeanFa ...

  5. MySQL 5.7 InnoDB锁

    简介 参考https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks. InnoDB引擎实现了标准的行级别 ...

  6. Python练习题 041:Project Euler 013:求和、取前10位数值

    本题来自 Project Euler 第13题:https://projecteuler.net/problem=13 # Project Euler: Problem 13: Large sum # ...

  7. JavaScript函数报错SyntaxError: expected expression, got ';'

    故事背景:编写Javaweb项目,在火狐浏览器下运行时firebug报错SyntaxError: expected expression, got ';'或者SyntaxError: expected ...

  8. aarch64架构移动设备挂载移动硬盘

    添加yum源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 安装ntfs yum inst ...

  9. Matlab中imagesc用法

    来源:https://ww2.mathworks.cn/help/matlab/ref/imagesc.html?searchHighlight=imagesc&s_tid=doc_srcht ...

  10. Mat对象与像素操作 OpenCV C++

    Mat对象,分为两个部分,头部和数据部分 Mat对象拷贝之后是相互独立的 Mat对象有三种创建方法 CV_8UC1单通道,CV_8UC2双通道,CV_8UC3三通道,通道数 Scalar(0-255, ...