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 构造 贪心 二分的更多相关文章

  1. 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 ...

  2. 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 = { ...

  3. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

    题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...

  4. poj 2782 Bin Packing (贪心+二分)

    F - 贪心+ 二分 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Description ...

  5. Card Game Cheater(贪心+二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. 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 ...

  7. LA 6979 Known Notation 构造+贪心 铜牌题

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...

  8. Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列

    A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a, ...

  9. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

随机推荐

  1. css可以修改超链接颜色吗?

    超链接a标签大家都应该很熟悉,这篇文章主要的讲的是a标签的基础css样式设置,下面我们来看一下css修改超链接颜色的方法. css可以使用下面几个伪类来设置超链接: a:link :是未被访问的样式, ...

  2. css3动画讲解,关于css3的@keyframes和animation

    通过css3我们可以创建动画,它能取代gif图片.Flash.Js动画等,css3的animation动画是应用在html的DOM元素上的,通过样式来实现的. @keyframes 规则 @Keyfr ...

  3. 链表中倒数第k个节点(剑指offer-14)

    /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ ...

  4. 调整数组顺序使奇数位于偶数前面(剑指offer-13)

    方法1:新建两个数组,一个数组用来放奇数,一个数组用来放偶数,最后再把它们合并起来. 1 import java.util.*; 2 public class Solution { 3 public ...

  5. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  6. 动手实现一个简单的 rpc 框架到入门 grpc (上)

    rpc 全称 Remote Procedure Call 远程过程调用,即调用远程方法.我们调用当前进程中的方法时很简单,但是想要调用不同进程,甚至不同主机.不同语言中的方法时就需要借助 rpc 来实 ...

  7. Jenkins - 解决集成 jmeter+ant 发送邮件时报错:java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage

    jenkins + jmeter +ant 发送邮件失败 问题原因 其实就是缺失 jar 包,导致某些类找不到了 解决方案 点击该网站,下载commons-email.jar包 点击该网站,下载act ...

  8. day59 django初识

    目录 一.借助wsgiref模块实现简易版web框架 二.动静态页面 三.python三大主流web框架 四.启动一个django项目 1 启动前的注意事项 1.1 计算机的问题 1.2 django ...

  9. Redis RDB 分析工具 rdbtools 说明

    背景 Redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求.解析内存有二种方法:第一个是通过scan遍历所有ke ...

  10. 【RCTF-2015】bug

    信息: 题目来源: RCTF-2015 标签:PHP.SQL注入 解题过程 访问网址,提示需要登陆: 使用admin用户名进行注册,提示: 对登陆页面与注册页面进行Fuzz,没有发现注入点. 登陆后页 ...