EC R 86 D Multiple Testcases 构造 贪心 二分
LINK:Multiple Testcases
得到很多种做法。其中O(n)的做法值得一提。
容易想到二分答案 check的时候发现不太清楚分配的策略。
需要先考虑如何分配 容易发现大的东西会对小的产生影响 而 对于某个能放的位置 我们放大的一定比小的要优。所以为了防止出现对小的影响到了需要调整的局面和放大的的局面不会比放小的差的思想 可以得到策略。
有了贪心的思路 可以考虑先放大的 考虑对于每个桶中从大到小放。
放完一个数字之和容易二分到下一个位置 然后set取出相应的值即可。复杂度nlogn.
容易发现其实不需要二分 预处理一下跳跃数组即可。
这个做法有另外的形式 sort一下从大到小放 然后发现位置不够用的时候再开一个 用堆或者set维护能用的位置。复杂度还是nlogn.
接下来考虑二分答案的思路。
一个比较不容易想到是正确的分配思路 二分答案之后 如果答案合法那么按照 1...mid ->1,,,mid放一定可以合法。
换句话说 答案满足这样构造的情况。设\(a_i\)为每个数字的个数\(g_i=\sum{w=i}^ka_w\)\(c_i\)表示限制
证明:如果mid>=ans 那么必然满足 \(mid\geq max{\lceil \frac{g_i}{c_i}\rceil}\)
这个结论是显然的。而这样构造可以发现对于某个i和其之后的数字来说算是平均分配了给了mid.
而这样平均分又有上述的关系作为保证 所以构造合法。
至此 进一步的 可以发现答案直接为上述式子的最大值即可。复杂度O(n)
code nlogn的set:
const ll MAXN=200010;
ll n,m,ans;
int c[MAXN],vis[MAXN];
vector<int>g[MAXN];
multiset<int>s;
multiset<int>:: iterator it;
signed main()
{
//freopen("1.in","r",stdin);
get(n);get(m);
rep(1,n,i)
{
int get(x);
s.insert(x);
}
c[0]=INF;
rep(1,m,i)get(c[i]),c[i]=min(c[i-1],c[i]);
int cnt=0;
while(cnt<n)
{
++ans;
it=s.end();--it;
int R=*it;
int ww=0;
while(1)
{
++ww;++cnt;
g[ans].pb(R);
if(cnt==n)break;
s.erase(it);
int l=0,r=R;
while(l+1<r)
{
int mid=(l+r)>>1;
if(c[mid]>ww)l=mid;
else r=mid;
}
int cc=c[r]>ww?r:l;
R=cc;
if(!R)break;
it=s.upper_bound(R);
if(it==s.begin())break;
--it;R=*it;
}
}
put(ans);
rep(1,ans,i)
{
printf("%d ",g[i].size());
for(ui j=0;j<g[i].size();++j)printf("%d ",g[i][j]);
puts("");
}
return 0;
}
O(n)的构造
const int MAXN=200010;
int n,m,ans;
int c[MAXN],w[MAXN],a[MAXN];
vector<int>g[MAXN];
signed main()
{
freopen("1.in","r",stdin);
get(n);get(m);
rep(1,n,i)++a[read()];
rep(1,m,i)get(c[i]);
fep(m,1,i)w[i]=a[i]+w[i+1],ans=max(ans,(w[i]-1)/c[i]+1);
int cnt=0;
rep(1,m,i)while(a[i])g[cnt].pb(i),cnt=(cnt+1)==ans?0:cnt+1,--a[i];
put(ans);
rep(0,ans-1,i)
{
printf("%d ",g[i].size());
for(ui j=0;j<g[i].size();++j)printf("%d ",g[i][j]);
puts("");
}
return 0;
}
EC R 86 D Multiple Testcases 构造 贪心 二分的更多相关文章
- Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找
The link to problem:Problem - D - Codeforces D. Range and Partition time limit per test: 2 second ...
- The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - F 贪心+二分
Heap Partition Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A sequence S = { ...
- 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II
题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...
- poj 2782 Bin Packing (贪心+二分)
F - 贪心+ 二分 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Codeforces Round #301 (Div. 2) B. School Marks 构造/贪心
B. School Marks Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/probl ...
- LA 6979 Known Notation 构造+贪心 铜牌题
题意:给出一个字符串,有两种操作: 1.插入一个数字 2.交换两个字符 问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...
- Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列
A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a, ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
随机推荐
- 微信网页授权access_token和普通access_token爬坑
两者的区别: 1.相同点:两者的有效期都是7200s 2.不同点: ①.网页授权access_token无需用户授权,无需用户关注,在网页授权回调域名下可获取到code,通过code换取网页授权acc ...
- 用Helm部署Kubernetes应用,支持多环境部署与版本回滚
1 前言 Helm是优秀的基于Kubernetes的包管理器.利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离.现在 ...
- 函数默认参数的TDZ
我们知道块级作用域会有TDZ. 其实方法参数也存在TDZ function add(first = second, second) { return first + second; } console ...
- 数据可视化之分析篇(四)PowerBI分析模型:产品关联度分析
https://zhuanlan.zhihu.com/p/64510355 逛超市的时候,面对货架上琳琅满目的商品,你会觉得这些商品的摆放,或者不同品类的货架分布是随机排列的吗,当然不是. 应该都听说 ...
- 迎难而上ArrayList,源码分析走一波
先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...
- 循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理
在前面随笔<循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理>中介绍了用户管理模块的内容,包括用户列表的展示,各种查看.编辑.新增对话框的界面处理和后台数据处 ...
- 用Tableau制作官网流量周报
好久没写博客了,上班摸鱼时间分享一下在工作中做的东西吧,先上图. 数据方面取自百度统计,身处传统类型公司,官网没有数据库,只好将就一下啦,反正是免费的,体验也还可以. 关于百度统计注册.添加管理站点和 ...
- PHP : CodeIgniter mysql_real_escape_string 警告
版本 CodeIgniter 3 PHP 5.4 感谢万能的stackoverflow. 得修改CodeIgniter的源码. ./system/database/drivers/mysql/mysq ...
- p40_数据交换方式
一.为什么要数据交换 数据链路发展史: 二.数据交换方式 电路交换 报文交换 分组交换[数据报方式,虚电路方式] 三.电路交换 eg:电话网络(特点:**独占资源,**即使两个人不说话,链接也不会被别 ...
- Makefile中自动生成头文件依赖
为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...