热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2016-2017ACM-ICPC东北欧区域赛(NEERC16)Gym101190E:离线查询与排序优化策略

题目链接:http://codeforces.com/gym/101190/attachments题意:在一个共享三轮车站点,某些用户需要租用车辆。该问题涉及如何通过离线查询和排序优化策略来高效地管理和分配车辆资源。具体来说,需要设计一种算法,在满足所有用户需求的同时,最小化总等待时间和资源浪费。通过合理的数据结构和算法优化,可以显著提高系统的整体性能和用户体验。

题目链接:http://codeforces.com/gym/101190/attachments

题意:一个公共三轮车车站可以提供给一些人租车,但是在开始时刻,公园里有所少量车这个是不确定的,然后现在有n个信息和q个询问,信息有两种形式+ a b代表在a时间有b个人还车,另外一种是 - a b代表在a时间有b个人借车,这些人借车是要排队的,如果当前没有车,则只能等待,对于每一个询问给定了初始时刻车站里面有多少量车,然后要询问的是对于每一个可能的初始值的等待时间,如果等待时间是不确定的话,输出INFINITY。

解法&#xff1a;首先是一个单点更新的问题&#xff0c;可是我们发现一次更新之后会影响下一次的查询&#xff0c;或者你更新之后又可以回到之前的版本&#xff0c;所以可持久化&#xff1f;瞎几把yy之后&#xff0c;我们不妨来分析一下样例&#xff0c;可以观察到什么时候是要租车的呢&#xff1f;首先输入的信息用 op t[i] a[i]来表示一下&#xff0c;t[i]代表时间戳&#xff0c;a[i]代表人或者车的数量(取决于操作)&#xff0c;第二种操作意味着要减少a[i]量车&#xff0c;如果车你的数量减小到<&#61;0那么久只能等待了。并且当前要等待的时间是多少呢&#xff1f;我们容易把它预处理出来&#xff0c;下面的s[i]就是人或者车的数量的前缀和&#xff0c;显然为正代表当前时间不需要租车&#xff0c;否则需要租车。

for(int i &#61; 1; i <&#61; n; i&#43;&#43;){s[i] &#61; s[i-1] &#43; a[i];if(i 1] - t[i];}

处理出这个也不能解决这个问题&#xff0c;接下来显然当s[i]>0的那些时间段是不用考虑的&#xff0c;你想啊&#xff0c;当前车的数量够用&#xff0c;肯定傻子才会等待吧。所以我们把需要等待的总时间以及等待的时间段的长度记录下来

long long sum1 &#61; 0, sum2 &#61; 0;for(int i &#61; 1; i <&#61; n; i&#43;&#43;){if(s[i] <0){b[&#43;&#43;cnt] &#61; i;sum1 &#43;&#61; 1LL*(-s[i])*t[i];sum2 &#43;&#61; t[i];}}

接下来就是想到我们在线很难做那么我们可以离线做啊&#xff0c;所以就有了询问离线的思路了。我们会想离线该怎么做呢&#xff1f;容易想到我们会按照x来排序&#xff0c;离线是为了能用到之前处理的信息&#xff0c;而不是无序重来一遍&#xff0c;这样显然是可以降低复杂度的吧。所以我们会想到按照x从小到大排序&#xff0c;这里的x就是第初始的车的数量&#xff0c;想一下吧&#xff0c;当前x比较小的时候你覆盖了一些之前等待的时间区间&#xff0c;那么下次你的x比现在的大&#xff0c;也必然可以覆盖上次的区间&#xff0c;所以就不用重复扫描&#xff0c;自然大大降低了复杂度。

struct node{int x, id;bool operator <(const node &rhs) const{return x }c[maxn];

在询问离线的时候我已经提到了&#xff0c;要利用之前的信息&#xff0c;所以我们也要对那些需要等待的时间段进行排序&#xff0c;每一个时间段都有一个值代表当前等待的人数&#xff0c;这里是负数所以从大到小排&#xff0c;比如-2>-3&#xff0c;那么2会排在3的前面&#xff0c;那么你x增大&#xff0c;显然也是可以覆盖当前区间能覆盖的每一条线段的&#xff0c;然后我们按照这个思路去模拟一发就可以了。注意不确定的条件就是当当前的x&#43;s[n]<0的时候&#xff0c;这个时候显然车都不够。

sort(c &#43; 1, c &#43; q &#43; 1);for(int i &#61; 1; i <&#61; q; i&#43;&#43;){int x &#61; c[i].x;while(j <&#61; cnt && (-s[b[j]]) <&#61; x){sum1 -&#61; 1LL*(-s[b[j]]) * t[b[j]];sum2 -&#61; t[b[j]];&#43;&#43;j;}if(s[n] &#43; x <0){ans[c[i].id] &#61; -1;}else{ans[c[i].id] &#61; sum1 - x * sum2;}}

完整码&#xff1a;

#include
using namespace std;
const int maxn &#61; 1e5 &#43; 7;
int n, q;
int a[maxn], t[maxn];
int s[maxn];
int b[maxn], cnt;
long long ans[maxn];
struct node{int x, id;bool operator <(const node &rhs) const{return x }c[maxn];
bool cmp(int i, int j){return s[i] > s[j];
}int main()
{freopen("expect.in", "r", stdin);freopen("expect.out", "w", stdout);scanf("%d%d", &n, &q);for(int i &#61; 1; i <&#61; n; i&#43;&#43;){char op[5];scanf("%s%d%d", op, &t[i], &a[i]);if(op[0] &#61;&#61; &#39;-&#39;) a[i] &#61; -a[i];}//处理出初始的信息for(int i &#61; 1; i <&#61; n; i&#43;&#43;){s[i] &#61; s[i-1] &#43; a[i];if(i 1] - t[i];}
// for(int i &#61; 1; i <&#61; n; i&#43;&#43;){
// printf("s[%d] &#61; %d, t[%d] &#61; %d\n", i, s[i], i, t[i]);
// }long long sum1 &#61; 0, sum2 &#61; 0;for(int i &#61; 1; i <&#61; n; i&#43;&#43;){if(s[i] <0){b[&#43;&#43;cnt] &#61; i;sum1 &#43;&#61; 1LL*(-s[i])*t[i];sum2 &#43;&#61; t[i];}}sort(b &#43; 1, b &#43; cnt &#43; 1, cmp);int j &#61; 1;long long k &#61; 0;for(int i &#61; 1; i <&#61; q; i&#43;&#43;){scanf("%d", &c[i].x);c[i].id &#61; i;}sort(c &#43; 1, c &#43; q &#43; 1);for(int i &#61; 1; i <&#61; q; i&#43;&#43;){int x &#61; c[i].x;while(j <&#61; cnt && (-s[b[j]]) <&#61; x){sum1 -&#61; 1LL*(-s[b[j]]) * t[b[j]];sum2 -&#61; t[b[j]];&#43;&#43;j;}if(s[n] &#43; x <0){ans[c[i].id] &#61; -1;}else{ans[c[i].id] &#61; sum1 - x * sum2;}}for(int i &#61; 1; i <&#61; q; i&#43;&#43;){if(ans[i] &#61;&#61; -1) printf("INFINITY\n");else printf("%lld\n", ans[i]);}return 0;
}


推荐阅读
  • 每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)
    题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0, 2^1, …, 2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。 ... [详细]
  • 题目链接:POJ 2777。问题描述:给定一个区域,需要进行多次涂色操作,并在每次操作后查询某个区间内的不同颜色数量。解决方案:由于题目中颜色种类不超过30种,可以利用线段树的懒惰更新策略来高效处理这些操作。通过懒惰标记,避免了不必要的节点更新,从而显著提高了算法的效率。此外,该方法还能有效应对大规模数据输入,确保在合理的时间内完成所有操作。 ... [详细]
  • 在晴朗天气条件下,对一种神奇的魔法现象进行了深入分析。该题目为原创,基准时间限制为1秒,空间限制为131072KB,分值20,属于3级难度的算法题。研究发现,这种魔法现象在阳光明媚的环境中表现得尤为显著,进一步探讨了其背后的科学原理和技术实现方法。 ... [详细]
  • 在2021-2022 ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 针对NOJ1102黑白图像问题,本文采用深度优先搜索算法进行详细分析与实现。该问题要求在给定的时间限制(普通Java为1000-3000毫秒)和内存限制(65536KByte)内,处理一个n×n的黑白图像。通过对图像的逐像素遍历,利用深度优先搜索算法有效地识别并标记相连的黑色区域,从而实现图像的高效处理。实验结果显示,该方法在多种测试用例中均能稳定达到预期效果,具有较高的准确性和效率。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 在C语言中,定义一个包含学号、姓名和年龄的学生信息结构体,并遵循严格的命名规范。首先,初始化结构体变量的所有成员为默认值,然后将其学号设为88,姓名设为“liming”,年龄设为25。最后,在控制台上输出该结构体变量的详细信息,以验证数据的正确性。例如,使用 `typedef struct Student` 定义结构体类型。 ... [详细]
  • 在牛客2021多校竞赛的一道题目中,涉及了5000×5000×5000的复杂度计算。实验结果显示,使用bitset进行数据处理仅需140毫秒,而使用bool数组则显著较慢。本文通过详细的性能分析,探讨了bitset与bool在数据处理速度上的差异,并提出了针对不同应用场景的优化建议。具体来说,bitset在位级操作上具有更高的效率,适用于大规模数据处理任务,而bool数组则在某些特定场景下更为灵活。通过对这两种数据结构的深入对比,本文旨在为开发者提供选择合适数据结构的参考依据。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
author-avatar
王晓宁smile
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有