2021icpc网络赛A题ac代码及思路

思路读完题后了解题的大意:有k个节点,编号为0 - k-1,每个节点可以在空闲时间处理请求,每个请求的有一个到达时间和处理该请求的持续时间;节点空闲表示当一个请求在达到时间时,该节点未处理任何一个其他请求,即为该节点空闲!第i个请求优先考虑i % k 个节点是否为空,不为空优先考虑i % k, 否则依次后推,(1 + 1) % k, (i + 2) % k,直到找到空闲节点为止。然后我看了一下数据大小k个节点和n组请求 k, n <= 1^5;以及节点的到达时间和持续时间 <= 1e9; 所以本题涉及的最大数据不会超过2e9!,不会报int;最开始模拟去写,然后tle了,因为最坏的情况时n*k,我们需要将其控制在nlog(k) 以内;模拟思路1模拟思路就是去模拟这个过程,优先考虑i%k是否满足,不满足继续后推(i + 1) % k … 如果所有的节点都不满足当前时间为空闲就表示第i个请求不被接收;然而最坏的情况就是每次都没有满足的节点,我们都要去模拟一次整个过程也就是所有节点,单次模拟时间复杂度就是k, 那么n次时间复杂度就是n*k; n, k <= 1^5, 所以最坏情况必定会tle.

模拟过程,节点1处理了两个请求, 0,2节点各一个,故此1处理请求最多,输出1.线段树优化思路我们唯一能优化的地方就是单次查找的节点,单次查找满足条件的节点采用线段树去优化,可以将其每次查找的复杂度降低到log(k)级别;线段树优化:线段树优化需要维护一个区间内的最小值(也就是某个节点在最小的时间段空闲),如果该最小值小于某个请求的到来时间,代表该区间存在一个满足条件的节点能够处理到来的请求;因为考虑道第i个请求的优先选择i%k 节点, 所以我们ask操作时, 区间分别为 (i%k+1 ~ k) 就是i%k的右半部分区间优先考虑,其次左半部分的区间(1 ~ i%k) (注:因为此处是从1 - k,所以i % k应该再加一个1);

依次内推,写出线段树板子即可!#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <queue>#include <vector>#include <cstdio>using namespace std;typedef long long LL;const int N = 100010, INF = 2e9+10;LL a[N], n, k;LL cnt[N];struct SegmT{LL l, r;LL val;} tr[N * 4];void upside(int p){tr[p].val = min(tr[p * 2].val, tr[p * 2 + 1].val);}void build(LL p, LL l, LL r){tr[p].l = l, tr[p].r = r;if (l == r) {tr[p].val = 0;return;}LL mid = (l + r) >> 1;build(p * 2, l, mid);build(p * 2 + 1, mid + 1, r);upside(p);}void change(LL p, LL x, LL v){if (tr[p].l == tr[p].r){tr[p].val = v;return;}LL mid = (tr[p].l + tr[p].r) >> 1;if (x <= mid) change(p * 2, x, v);else change(p * 2 + 1, x, v);upside(p);}LL ask(LL p, LL l, LL r, LL t){if (tr[p].l == tr[p].r) {return tr[p].r;}LL mid = (tr[p].l + tr[p].r) >> 1;LL res = -1;if (l <= mid && r >= tr[p].l && tr[p * 2].val <= t){res = ask(p * 2, l, r, t);}if( res == - 1 && r >= mid + 1 &&  l <= tr[p].r && tr[p * 2 + 1].val <= t){res = ask(p * 2 + 1, l, r, t);}return res;}int main(){cin >> k >> n;for (int i = 0; i < N * 4; i ++) tr[i].val = INF;build(1, 1, k);LL res = 0;for (int i = 0; i < n; i ++){LL co, t;scanf("%lld %lld", &co, &t);LL p = (i % k) + 1; // 当前所取的p值!LL t1 = ask(1, p, k, co);if (t1 == -1){LL t2 = ask(1, 1, p-1, co);if (t2 != -1){cnt[t2] ++;res = max(res, cnt[t2]);change(1, t2, co + t);}}else{cnt[t1] ++;res = max(res, cnt[t1]);change(1, t1, co + t);}}bool flag = false;for (int i = 1; i <= k; i ++){if (!flag && cnt[i] == res) {printf("%lld", i-1);flag = true;}else if (cnt[i] == res) printf(" %lld", i-1);}return 0;}实习编辑:王晓姣稿件来源:深度学习与文旅应用实验室(DLETA)

(0)

相关推荐

  • 前端程序员学好算法系列(六)队列

    利用队列我们可以解决很多问题,js数组也可以实现队列,队列的思想为先近先出,js可以用 push和 shift() 很容易的实现一个队列 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐 ...

  • CF679div.2

    A Finding Sasuke 题意:给出长度为 \(n\) 的序列 \(a_i(i=1,2,\cdots,n,0<|a_i|\le100)\),求 \(b_i(i=1,2,\cdots,n, ...

  • 「ACM-ICPC 2018 南京站网络赛 A 题」An Olympian Math Problem

    描述 传送门:我是传送门 Alice, a student of grade 66, is thinking about an Olympian Math problem, but she feels ...

  • 网络赛题---3D13-H02 伞形镂空罩

    [题目]3D13-H02 [注意]其中阵列.共线.水平等几何关系.(输入答案时请精确到小数点后两位) [参数]A=60,B=35,C=60,D=3,T=4 [问题] 1.请问图中X=? 2.请问模型体 ...

  • 网络赛题---3D13-M04 方形异形串环

    CaTICs竞赛 第13届3D建模试题 [题目] [注意]其中等距.平行等几何关系.[其他]同色短线长度相等.仔细观察其结构形态,图中所有相邻四棱柱之间距离均为T,所有四棱柱短边长均为A.(输入答案时 ...

  • 网络赛题--3D13-H06 方柱异形台 练习题

    CaTICs竞赛 第13届   solidworks 3D建模试题 [题目] [几何]平行.对称.同色线条等长.除灰色面外,同色面相互平行.K视向垂直于对称线.E.F均为面与面之间的距离. [参数] ...

  • 网络赛题 --- 3D13-H01 边角台 练习题

    CaTICs竞赛 第13届 solidworks 3D建模试题 [题目] [注意]其中阵列.相切.共线等几何关系.仔细观察其形态结构.(题图为示意图,只用于表达尺寸和几何关系,由于参数变化,其形态会有 ...

  • 网络赛题---3D13-M03 锁扣连接件

    [题目]3D13-M03 [注意]其中对称.相切.同心等几何关系.(输入答案时请精确到小数点后两位) [参数]A=100,B=15,C=22,D=8,E=50,F=16 [问题] 1.请问图中P1到P ...

  • 网络赛题 --- 3D10-M5 齿轮箱上盖

    CaTICs竞赛试题 [问题] [注意]其中相等.同心.相切等几何关系.[其他]同色短线长度相等,同色圆弧等半径.(题图为示意图,只用于表达尺寸和几何关系,由于参数变化,其形态会有所变化.)(输入答案 ...

  • 网络赛题--3D13-H05 练习题

    CaTICs竞赛 第13届 solidworks 3D建模试题 [题目] [注意]其中对称.相切.等距.重合等几何关系.[其他]同色圆弧半径相同,同色短线长度相等,模型未注壁厚均为T,仔细观察其形态. ...

  • 网络赛题---3D10-M04 衍生支架连接件

    [题目]3D10-M04 [注意]其中相等.同心.相切等几何关系.[其他]同色短线长度相等.(题图为示意图,只用于表达尺寸和几何关系,由于参数变化,其形态会有所变化.) [参数]A=25 B=20 C ...