GCJ2015 还原集合 题解

GoogleCodeJam-2015::person_running:GCJ 2015的所有28个问题的Python解决方案 Google Code Jam 2015的Python解决方案。解决方案以*开头,表示它将在最大的数据集中获得TLE(总计算量> 10^8 ,这对于Python在5到15秒内解决问题并不友好)。 今年,为小型数据集设置了4-minute计时器,为大型数据集设置了8-minute计时器。 资格赛 # 标题 解 时间 空间 困难 标签 注意 一个 O(S) O(1) 简单 乙 O(最大(P)* D) O(1) 简单 C O(长) O(长) 中 d O(1) O(1) 硬 第一轮 # 标题 解 时间 空间 困难 标签 注意 一个 O(S) O(1) 简单 乙 O(log(N * max(M))+ BlogB) O(B) 中 二元搜寻 C O(N ^ 2) 上) 硬 第一轮 # 标题 解 时间 空间 困难 标签 注意 一个 O(logN) O(logN) 简单 乙 O(R * C) O(1) 中 C O(HlogH) 哦) 硬 堆 1C回合 # 标题 解 时间 空间 困难 标签 注意 一个 O(1) O(1) 简单 乙 O(K + L 立即下载

GCJ2015 还原集合

提交地址找不到 /qd。

假设说我们知道一个数 x,x>0x, x > 0x,x>0 我们考虑对其进行背包,不妨假设上一个背包的数组为 fff。

4IXWEq.png

发现对于一个新的数组位置 iii 会对应 i−x,xi - x, xi−x,x 两个位置。

然后考虑一下 x,x<0x, x < 0x,x<0 的情况,位置 iii 会对应 x,i+xx, i + xx,i+x 两个位置。

发现本质上还原的两个位置只相差了 xxx,所以我们最后还原出来的数列也只是位置相差了 xxx。这个 xxx 是由若干个数拼接而成的,也就是将一个数取反得到的。


我们考虑如何得到最终答案的一个数,如果当前集合和的最大值减去次大值肯定只有几种情况。

  • 少了一个最小的正数。
  • 多了一个最大的负数。

结合一下就是得到的数的绝对值是最小的。我们不妨将所有的数都当做正数来考虑,那么最后得到初始的 fff 数组也就是只有 f0=1f_0 = 1f0​=1 。那么我们找那个唯一有值的情况,之后进行背包即可。

如果 f0≠1f_0 \ne 1f0​​=1 呢?肯定是有若干个 000 组成的集合,也就是 2sum−12^{sum - 1}2sum−1,其中 sumsumsum 是 000 的数量。


当我们找到这个位置 fx=1f_x = 1fx​=1 而且其他位置都是 000 的时候我们考虑将其他数进行取反。对于背包 g(i,j)g(i, j)g(i,j) 表示考虑第 iii 个数,容量为 jjj 是否被拼成。如果 g(i,s)=1g(i, s) = 1g(i,s)=1 而且 g(i−1,s−v)=1g(i - 1, s - v) = 1g(i−1,s−v)=1 那么说明这个数是可以放的。

这里进行背包之后直接进行贪心即可。


背包的空间太大?我们发现最终能够拼成的所有不同权值的集合都已经给出了,我们对于每个权值直接进行离散化即可。

因为一开始我们的 xxx 肯定是 <0< 0<0 的,我们会考虑将其取反,那么我们的权值也需要对应取反一下。

也就是将数轴正负翻转一下即可。


代码实现的话就是直接按照上述过程进行模拟。

#include <bits/stdc++.h>
using namespace std;

//#define Fread
//#define Getmod

#ifdef Fread
char buf[1 << 21], *iS, *iT;
#define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
#define getchar gc
#endif // Fread

template <typename T>
void r1(T &x) {
	x = 0;
	char c(getchar());
	int f(1);
	for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
	for(; '0' <= c && c <= '9';c = getchar()) x = (x * 10) + (c ^ 48);
	x *= f;
}

template <typename T,typename... Args> inline void r1(T& t, Args&... args) {
    r1(t);  r1(args...);
}

#define int long long
const int maxn = 2e5 + 5;
const int maxm = maxn << 1;
const int inf = 1e15;
void Solve() {
    int i, j, n;
    r1(n);
    struct Node {
        int s, p;
        int operator < (const Node &z) const {
            return s < z.s;
        }
    };
    vector<Node> p(n + 1);
    vector<int> v;
    for(i = 1; i <= n; ++ i) r1(p[i].s);
    for(i = 1; i <= n; ++ i) r1(p[i].p);
    sort(p.begin() + 1, p.end());

    for(i = 1; i <= n; ++ i) v.push_back(-p[i].s);
    sort(v.begin(), v.end());
    
    function<pair<int, int>(void)> gt;
    gt = [&] () {
        int mx[2]; mx[0] = mx[1] = - inf;
        for(i = n; i >= 1; -- i) if(p[i].p) {
            if(p[i].s > mx[0]) mx[1] = mx[0], mx[0] = p[i].s;
            else mx[1] = max(mx[1], p[i].s);
        }
        return make_pair(mx[0], mx[1]);
    };// the empty : only mx[0]
    
    int ps0(0);
    vector<int> abpos;
    while(1) {
        pair<int, int> x = gt();
        if(x.second == -inf) { ps0 = x.first; break; }
        abpos.push_back(x.first - x.second);
        int delta = x.first - x.second;
        static map<int, int> mp;
        mp.clear();
        mp[p[1].s] = p[1].p;
        for(i = 2; i <= n; ++ i) {
            if(mp.count(p[i].s - delta)) p[i].p -= mp[p[i].s - delta];
            mp[p[i].s] = p[i].p;
        }
    }
    int T(0);
    for(i = 1; i <= n; ++ i) if(p[i].p > 0) { T = log2(p[i].p); break; }
    while(T --) abpos.push_back(0);

    sort(abpos.begin(), abpos.end());
    ps0 = -ps0;
    vector<vector<int> >  f(abpos.size() + 2, vector<int>(n + 2, 0));

    f[0][lower_bound(v.begin(), v.end(), 0) - v.begin()] = 1;

    for(i = 0; i < abpos.size(); ++ i) {
        f[i + 1] = f[i];
        for(j = v.size() - 1; j >= 0 && v[j] - abpos[i] >= 0; -- j) {
            int id = lower_bound(v.begin(), v.end(), v[j] - abpos[i]) - v.begin();
            if(v[id] == v[j] - abpos[i])
                f[i + 1][j] |= f[i][id];
        }
    }
    for(int i = abpos.size(), ns = lower_bound(v.begin(), v.end(), ps0) - v.begin(); i > 0; -- i) {
        int x = v[ns] - abpos[i - 1];
        if(x < 0) continue;
        int y = lower_bound(v.begin(), v.end(), x) - v.begin();
        if(v[y] == x && f[i - 1][y] == 1) abpos[i - 1] = - abpos[i - 1], ns = y, ps0 += abpos[i - 1];
        if(x == 0) break;
    }
    sort(abpos.begin(), abpos.end());
    for(int v : abpos) printf(" %lld", v);
    puts("");
}

signed main() {
    freopen("recoverset.in", "r", stdin);
    freopen("recoverset.out", "w", stdout);
    int i, j, T;
    r1(T);
    for(i = 1; i <= T; ++ i) {
        printf("Case #%lld:", i);
        Solve();
    }
	return 0;
}
深信服桌面云实战:从零部署到高效运维的配置全景指南 本文详细介绍了深信服桌面云从零部署到高效运维的全流程配置指南,涵盖硬件规划、平台部署、虚拟桌面发布、终端管理及性能优化等关键环节。特别强调了双万兆网络架构、分布式存储配置和智能调度功能的应用,帮助用户实现高性能、高可用的虚拟桌面环境。 阅读详情

相关推荐

FREERTOS+LWIP+IAP实现TCP、HTTP、网页访问并固件升级、更新配置 (三)lwip实现httpd服务并在web访问

在前两篇文章中配置freeRTOS和,并实现了TCP、UDP的通信协议,现在终于轮到重头戏lwip的httpd服务,LWIP官方例程中是有很多自带的网页的,但是远远不够满足实际项目的使用需求,因此我也是踩了很多坑,从前端网页制作,到网络通信的实现,到后端数据处理,从头开始学起,也是学习到了很多没接触过的东西,本章将搭建LWIP的HTTP服务使得浏览器可以访问WEB。

wangjiaheng0716的博客 2965

GCJ 2015R2(Bilingual-最小割)

Problem C. Bilingual Problem Elliot's parents speak French and English to him at home. He has heard a lot of words, but it isn't always clear to him which word comes from which language! E

nike0good |Oier&ACMer | 熟能生巧 1380

使用TBtools进行物种间共线性分析

Sequence Toolkit ---Fasta Tools ----ID Prefix (fasta文件)

sunny_dayone的博客 8752

GCJ 2015 Round D

Problem B. GBus count

lydcsdn 770

Imatest-Star模块(西门子星图)

星图分析指南:基于ISO12233标准的MTF测试方法,通过放射状射线和正弦灰度变化评估相机SFR性能。

weixin_64706696的博客 1571

避坑指南:微信小程序蓝牙广播在iOS上的那些‘坑’(附serviceUuids传值解决方案)

本文深入解析微信小程序蓝牙广播在iOS平台上的开发难点,特别是`serviceUuids`传值解决方案。通过对比iOS与安卓的蓝牙协议实现差异,提供实战编码策略和硬件端配合方案,帮助开发者有效规避兼容性问题,提升蓝牙外围设备开发效率。

weixin_30316097的博客 423

论低分构造题

2000 + 构造题

莫莫 dicol 的博客 304

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8216

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 253

java毕设:基于springboot的服装搭配推荐系统(springboot+layui+jq+html)1011

项目描述 基于springboot的服装搭配推荐系统: 基于天气服装搭配推荐系统为用户提供未来一周的天气预报情况,并根据预报天气和用户现有的服装进行着装搭配,以及显示未来6小时精确温度数据为用户提供更精确的天气信息便于用户在出行前对自己的着装进行调整,每日用户可以根据自己当日对系统推荐的着装搭配舒适度进行反馈,系统将根据用户的反馈对用户着装的保暖系数进行相应调整,通过多次的反馈和调整形成对用户着装的个体化和精确化的推荐。 本系统可以为用户提供以下服务: 1.未来五天的天气信息显示; 2.未来六小时内天气温度

qq_2537071370的博客 3647

用Python爬虫抓取大宗交易成交数据:全面解析与实战代码

大宗交易是指在证券市场中,涉及大额买卖的交易。此类交易通常由机构投资者进行,其交易量较大,对市场的影响显著。大宗交易数据包含了买卖双方的成交价格、成交量等关键信息,这些数据对于投资者和分析师而言,具有重要的市场预测意义。Python爬虫是一种自动化抓取互联网上数据的工具。通过爬虫,我们可以定期获取大宗交易数据,节省人工查询的时间。爬虫的工作原理通常包括:发送HTTP请求、获取响应数据、解析网页内容、提取关键信息、存储和展示数据。

2201_76125261的博客 417

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 322

灰度图像采集显示

灰度图像采集显示 在FPGA内部,采集到的视频数据线通过一个FIFO,将原本与25MHZ时钟同步的数据流转换到FPGA内部50MHZ的时钟。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。于此同时,使用另一异步FIFO缓存从DDR3读出的图像数据;LCD驱动模块不断地发出读图像数据请求给到这个FIFO,从中读取图像数据并送给VGA显示器进行实时图像的显示。 ...

小柚子的博客 484

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 302

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 597

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 137

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 23

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 358

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 415

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

a bit 89

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 220

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 180

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 183

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 366

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 401
上一篇: CF1416B Make Them Equal 题解
下一篇: CF1391D 505 题解
sharp_legendgod
博客等级 码龄7年 8粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值