【20.69%】【codeforces 732E】Sockets
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
The ICM ACPC World Finals is coming! Unfortunately, the organizers of the competition were so busy preparing tasks that totally missed an important technical point — the organization of electricity supplement for all the participants workstations.
There are n computers for participants, the i-th of which has power equal to positive integer pi. At the same time there are m sockets available, the j-th of which has power euqal to positive integer sj. It is possible to connect the i-th computer to the j-th socket if and only if their powers are the same: pi = sj. It is allowed to connect no more than one computer to one socket. Thus, if the powers of all computers and sockets are distinct, then no computer can be connected to any of the sockets.
In order to fix the situation professor Puch Williams urgently ordered a wagon of adapters — power splitters. Each adapter has one plug and one socket with a voltage divider between them. After plugging an adapter to a socket with power x, the power on the adapter’s socket becomes equal to , it means that it is equal to the socket’s power divided by two with rounding up, for example and .
Each adapter can be used only once. It is possible to connect several adapters in a chain plugging the first to a socket. For example, if two adapters are plugged one after enother to a socket with power 10, it becomes possible to connect one computer with power 3 to this socket.
The organizers should install adapters so that it will be possible to supply with electricity the maximum number of computers c at the same time. If there are several possible connection configurations, they want to find the one that uses the minimum number of adapters u to connect c computers.
Help organizers calculate the maximum number of connected computers c and the minimum number of adapters u needed for this.
The wagon of adapters contains enough of them to do the task. It is guaranteed that it’s possible to connect at least one computer.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 200 000) — the number of computers and the number of sockets.
The second line contains n integers p1, p2, …, pn (1 ≤ pi ≤ 109) — the powers of the computers.
The third line contains m integers s1, s2, …, sm (1 ≤ si ≤ 109) — the power of the sockets.
Output
In the first line print two numbers c and u — the maximum number of computers which can at the same time be connected to electricity and the minimum number of adapters needed to connect c computers.
In the second line print m integers a1, a2, …, am (0 ≤ ai ≤ 109), where ai equals the number of adapters orginizers need to plug into the i-th socket. The sum of all ai should be equal to u.
In third line print n integers b1, b2, …, bn (0 ≤ bi ≤ m), where the bj-th equals the number of the socket which the j-th computer should be connected to. bj = 0 means that the j-th computer should not be connected to any socket. All bj that are different from 0 should be distinct. The power of the j-th computer should be equal to the power of the socket bj after plugging in abj adapters. The number of non-zero bj should be equal to c.
If there are multiple answers, print any of them.
Examples
input
2 2
1 1
2 2
output
2 2
1 1
1 2
input
2 1
2 100
99
output
1 6
6
1 0
【题解】
将插口按照power值升序排;
顺序处理每个power,如果有和当前处理的插头power相同的电脑。那么就把那个电脑插到这个插头上。如果没有,就一直除2,直到可以或power=0。为什么可以遇到就插上去呢?如果插在后面的插头,虽然可能也可以,但是必然要多耗费除2的次数(升序排的意义在此);而要满足除2次数最少则必然是这样的;
心里有些疑问吧
/*比如某个插头
power为8
同时有两个电脑power分别为4和1;
那我们肯定是把power为4的电脑插在这个插头上的(只除一次2);
而那个power为1的电脑,如果后面还有插头;
比如power=16;- >除4次;
总共5次
那是不是一开始power为8的的时候先插这个power为1的好点?
1 -> 8 :3次
后面4的时候
4 ->16:2次
总共5次
结果一样;
再试下
插头为32 64
电脑为2和16
先插16的
32
16 ->32 ->1
64
2->64 ->5
先插2的
32
2 -> 32 -> 4
64
16->64 >2
最后结果也是一样的;
但是如果没有后面那个插头显然先处理高power的更优;因为减少的次数少;
用map来快速判断有没有某个电脑的power的为x
*/
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 300000;
struct abc
{
int x, pos;
};
map <int, int> fre;
vector <int> v[MAXN];
int n, m, ans1[MAXN] = { 0 }, ans2[MAXN] = { 0 }, cnt = 0;
abc a[MAXN];
bool cmp(abc a, abc b)
{
return a.x < b.x;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
int temp = fre[x];
if (temp == 0)
{
fre[x] = ++cnt;
v[cnt].push_back(i);
}
else
v[temp].push_back(i);
}
for (int i = 1; i <= m; i++)
scanf("%d", &a[i].x), a[i].pos = i;
sort(a + 1, a + 1 + m,cmp);
int total = 0, num = 0;
for (int i = 1; i <= m; i++)
{
int sub = 0;
int x = a[i].x;
while (x)
{
int xx = fre[x];
if (xx)
{
int len = v[xx].size();
if (len)
{
int it = v[xx][len - 1];
ans2[it] = a[i].pos;
ans1[a[i].pos] = sub;
v[xx].pop_back();
total += sub;
num++;
break;
}
else
fre.erase(x);
}
if (x == 1)
break;
x = (x + 1) >> 1;
sub++;
}
}
printf("%d %d\n", num, total);
for (int i = 1; i <= m; i++)
printf("%d%c", ans1[i], i == m ? '\n' : ' ');
for (int i = 1; i <= n; i++)
printf("%d%c", ans2[i], i == n ? '\n' : ' ');
return 0;
}
【20.69%】【codeforces 732E】Sockets的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【20.23%】【codeforces 740A】Alyona and copybooks
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【20.51%】【codeforces 610D】Vika and Segments
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 515C】Drazil and Factorial
[题目链接]:http://codeforces.com/contest/515/problem/C [题意] 定义f(n)=n这个数各个位置上的数的阶乘的乘积; 给你a; 让你另外求一个不含0和1的 ...
- 【codeforces 766E】Mahmoud and a xor trip
[题目链接]:http://codeforces.com/contest/766/problem/E [题意] 定义树上任意两点之间的距离为这条简单路径上经过的点; 那些点上的权值的所有异或; 求任意 ...
- 【codeforces 797E】Array Queries
[题目链接]:http://codeforces.com/problemset/problem/797/E [题意] 给你一个n个元素的数组; 每个元素都在1..n之间; 然后给你q个询问; 每个询问 ...
- 【codeforces 509A】Maximum in Table
[题目链接]:http://codeforces.com/contest/509/problem/A [题意] 给你一个递推式f[i][j] = f[i-1][j]+f[i][j-1]; 让你求f[i ...
- 【codeforces 757D】Felicity's Big Secret Revealed
[题目链接]:http://codeforces.com/problemset/problem/757/D [题意] 给你一个01串; 让你分割这个01串; 要求2切..n+1切; 对于每一种切法 所 ...
- 【codeforces 760D】Travel Card
[题目链接]:http://codeforces.com/contest/760/problem/D [题意] 去旅行,有3种类型的乘车票; 第一种:只能旅行一次20元 第二种:按时间计算,90分钟内 ...
随机推荐
- Windows Forms 布局篇
1,锚定功能(Anchor属性) 默认为“Top,Left”,不管窗体大小如果改变,保持相对于窗体左上角的位置. 如果设置为”Top,Bottom,Left,Right”这样,控件的大小将随窗体的大小 ...
- P2P网贷-借款与发标
P2P网贷-借款与发标 关于借款,我想说,需要资金的人真的很多.贷款利率不太高的情况下,借款客户相对而言还是比较好开发的, 比较难的是,确保客户能按时还款.目前,信用还是比较混乱的. 借款来源,客户 ...
- UWP 新手教程1——UWP的前世今生
文件夹 引言 设备族群 UI 和通用输入模式 通用控件和布局面板 工具 自适应扩展 通用输入处理 引言 在本篇文章中,可以掌握下面知识: 设备族群,怎样决定目标设备 新的UI控件和新面板帮助你适应不同 ...
- thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)
thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...
- JSONP的使用示例(以及jquery版jsonp)超简单
前言: 平时工作中很少跨域,很少用到jsonp,但是几乎每次面试都会被问到这个问题.很崩溃. 菜鸟教程上的jsonp教程就很好.这里做个笔记,自己捋一遍. Jsonp(JSON with Paddin ...
- IOS计算两点之间的距离
//广州经纬度 CLLocationCoordinate2D guangZhouLocation; guangZhouLocation.latitude = 23.20; guangZhouLocat ...
- The behavior of App killed or restored by Android System or by users
What's the behavior of App killed or restored by Android System or by users? First, user kills the a ...
- Ubuntu设置IP(VMware9.03)
说明:在VMware上新安装Ubuntu11.04(64位) vi编辑器特难用,输入老出错,费了老大劲才把IP改好,IP改完之后最好立马重装一个编辑器vim. 设置静态IP: # vi /etc/ne ...
- sqlplus中怎么将你全部的操作和结果记录保存到你指定的文件里
[在sqlplus的操作中,非常多时候我们都想把自己的写的sql语句和改动日志或者结果信息做记录] [首先]肯定要正常连接到oralce数据库. [然后] 你用你指定的用户登录到oralce数据库之后 ...
- Spring常用工具类(ApplicationContextAware、DisposableBean、InitializingBean)
原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不 ...