题目

分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案。一开始我是想先按这种方式进行合并,然后将最后未合并完的剩余数组元素向前推进插值,维护一个双端队列保存推进元素块的信息,借此更新答案,但写到一半想到了反例,又想了想感觉没有解决的办法,原因在于这种方式过于局部,很难顾及全局。如果要合并的两个数组原本就是单调不增序列那按照一开始的想法直接比较两数组元素大小进行合并就好了,这样最终答案是正确的。此时就可以开始乱想,如果想到平均值就好办了,通过类似单调栈的方式将原本数组划分为多个区块,满足区块的平均值单调不增,然后就可以按照一开始的想法合并数组了。然后我们大致证明一下可以感觉到这样最优的,即不存在交换两个元素使结果优于以这种方式合并数组的答案。

#include<cstdio>
#include<algorithm>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int N = 1e5 + 50; int T, n, m;
int a[N], b[N], c[N << 1], id[N << 1];
pair<ll, int> da[N], db[N]; int main(){
scanf("%d", &T);
for(int ca = 1; ca <= T; ++ca){
ll ans = 0;
int len_a = 0, len_b = 0, x = 1, y = 1, tot = 0, dx = 0, dy = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]); da[++len_a] = {a[i], 1};
while(len_a > 1 && da[len_a].fi * da[len_a - 1].se > da[len_a - 1].fi * da[len_a].se){
--len_a;
da[len_a] = {da[len_a].fi + da[len_a + 1].fi, da[len_a].se + da[len_a + 1].se};
}
}
for(int i = 1; i <= m; ++i){
scanf("%d", &b[i]); db[++len_b] = {b[i], 1};
while(len_b > 1 && db[len_b].fi * db[len_b - 1].se > db[len_b - 1].fi * db[len_b].se){
--len_b;
db[len_b] = {db[len_b].fi + db[len_b + 1].fi, db[len_b].se + db[len_b + 1].se};
}
}
while(x <= len_a && y <= len_b){
if(da[x].fi * db[y].se < db[y].fi * da[x].se){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
else{
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
}
while(x <= len_a){
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
while(y <= len_b){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
printf("Case %d: %lld\n", ca, ans);
}
return 0;
}

2018CCPC桂林 A(贪心,思维)的更多相关文章

  1. Mike and distribution CodeForces - 798D (贪心+思维)

    题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...

  2. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  3. 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

    题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...

  4. 贪心/思维题 UVA 11292 The Dragon of Loowater

    题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...

  5. T - Posterized(贪心思维)

    Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...

  6. 2018CCPC桂林站JStone Game

    题目描述 Alice and Bob are always playing game! The game today is about taking out stone from the stone ...

  7. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)

    链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...

  8. 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心

    https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...

  9. C. Coffee Break 贪心 思维 有点难 有意思

    C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...

  10. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

随机推荐

  1. 基于 ASP.NET 的投票系统

    OnlineVoting 基于 ASP.NET 的投票系统 功能页面 登录 注册 首页 投票广场 查看别人发布的投票. 个人中心 个人资料 换头像.修改密码和其他信息. 发布投票 项目地址:https ...

  2. flink-cdc同步mysql数据到elasticsearch

    1,什么是cdc CDC是(Change Data Capture 变更数据获取)的简称.核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的插入INSERT.更新UPDATE.删除DELETE ...

  3. C#byte数组获取每一位值

    获取byte中每一位的值 byte byData = 0x36; int n0, n1, n2, n3, n4, n5, n6, n7; n0 = (byData & 0x01) == 0x0 ...

  4. 《SQL与数据库基础》06. 函数

    目录 函数 字符串函数 数值函数 日期函数 流程函数 本文以 MySQL 为例 函数 函数是指一段可以直接被另一段程序调用的程序或代码. 要查看函数操作的结果,可以使用 SELECT 函数(参数); ...

  5. 解决 wg-quick 在 Mac 上 bash 3 无法运行的问题

    问题原因 我可以理解,开发人员不想使用苹果使用的旧bash v3.但从用户的帖子来看,安装一个较新的bash并不那么好 所以我看了wireguard的wg-quick.需要支持的唯一变化,两个bash ...

  6. day01 java 数据类型

    数据类型   1. 数值型:整数类型 byte   short   int   long 浮点类型 double float 基本数据类型:2.字符型:char 3.布尔型:boolean    1. ...

  7. 使用 OpenTelemetry 构建 .NET 应用可观测性(3):.NET SDK 概览

    目录 前言 概览 opentelemetry-dotnet opentelemetry-dotnet-contrib opentelemetry-dotnet-instrumentation SDK ...

  8. Java四种引用 强引用,软引用,弱引用,虚引用(转)

    强引用 : 只要引用存在,垃圾回收器永远不会回收 Object obj= new Object(); Object 对象对后面 new Object的一个强引用, 只有当obj这个被释放之后,对象才会 ...

  9. SpringBoot进阶教程(七十七)WebSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和 ...

  10. CF1294C

    题目简化和分析: 使得 \(a \times b\times c=n~~~~(a\ne b\ne c)\) 思路: 先枚举最小的 \(a\) ,(以下程序的返回值为最小因数(有部分优化),即 \(a\ ...