比赛时思路不正确,赛后看大佬的代码才知道是线段树+二分。

这题和D题一样,维护的都是区间最小值,当时肝出了D,要是用D的思路来想想这题,说不定也能做出来了。

线段树维护的是解决完问题的时间的区间最小值,所以区间的值是单调递减的,我们想在[i%k,k-1]中找一个<=start的最靠左的值,可以用二分来优化遍历数组。如果在[i%k,k-1]中找不着,那就只好去[0,i%k-1]里面找了,再找不着,只好放弃了。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, INF = 1e18;
int tree[N * 4];
int book[N];
int x, y, val;
void up(int now, int l, int r)
{if (l == r) {tree[now] = val;return;}int chl = 2 * now, chr = 2 * now + 1;int mid = (l + r) >> 1;if (x <= mid) up(chl, l, mid);else up(chr, mid + 1, r);tree[now] = min(tree[chl], tree[chr]);
}
int que(int now, int l, int r)
{if (x <= l && y >= r) {return tree[now];}int chl = 2 * now, chr = 2 * now + 1;int mid = (l + r) >> 1;int ret = INF;if (x <= mid) ret = min(ret, que(chl, l, mid));if (y > mid) ret = min(ret, que(chr, mid + 1, r));return ret;
}
signed main()
{int k, n;scanf("%lld%lld", &k, &n);for (int i = 0; i < n; i++) {int s, e;scanf("%lld%lld", &s, &e);int l = i % k, r = k - 1;while(l < r) {int mid = (l + r) >> 1;x = l, y = mid;if (que(1, 0, k - 1) <= s) r = mid;else l = mid + 1;}x = l, y = l;if (que(1, 0, k - 1) <= s) {x = l, val = s + e;book[l]++;up(1, 0, k - 1);}else {l = 0, r = i % k - 1;while(l < r) {int mid = (l + r) >> 1;x = l, y = mid;if (que(1, 0, k - 1) <= s) r = mid;else l = mid + 1;}x = l, y = l;if (que(1, 0, k - 1) <= s) {x = l, val = s + e;book[l]++;up(1, 0, k - 1);}}}int ma = 0;for (int i = 0; i < k; i++) {ma = max(ma, book[i]);}vector<int> ans;for (int i = 0; i < k; i++) {if (ma == book[i]) ans.push_back(i);}for (int i = 0; i < ans.size(); i++) {printf("%lld", ans[i]);if (i != ans.size() - 1) printf(" ");}return 0;
}

顺便附上D题的线段树,这题比起A就是多了个懒标记,下传即可。。
D Edge of Taixuan

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
int tree[N * 4], add[N * 4];
int x, y, val;
void down(int now)
{if (add[now] == INF) return;int chl = 2 * now, chr = 2 * now + 1;tree[chl] = min(tree[chl], add[now]);tree[chr] = min(tree[chr], add[now]);add[chl] = min(add[chl], add[now]);add[chr] = min(add[chr], add[now]);add[now] = INF;
}
void up(int now, int l, int r)
{if (x <= l && y >= r) {tree[now] = min(tree[now], val);add[now] = min(add[now], val);return;}down(now);int chl = 2 * now, chr = 2 * now + 1;int mid = (l + r) >> 1;if (x <= mid) up(chl, l, mid);if (y > mid) up(chr, mid + 1, r);tree[now] = min(tree[chl], tree[chr]);
}
int que(int now, int l, int r)
{if (x <= l && y >= r) {return tree[now];}down(now);int chl = 2 * now, chr = 2 * now + 1;int mid = (l + r) >> 1;int ret = INF;if (x <= mid) ret = min(ret, que(chl, l, mid));if (y > mid) ret = min(ret, que(chr, mid + 1, r));return ret;
}
signed main()
{int t;scanf("%lld", &t);int cnt = 0;while(t--) {memset(tree, INF, sizeof(tree));memset(add, INF, sizeof(add));int n, m;scanf("%lld%lld", &n, &m);int sum = 0;for (int i = 1; i <= m; i++) {scanf("%lld%lld%lld", &x, &y, &val);sum += (y - x) * (y - x + 1) / 2 * val;y--;up(1, 1, n - 1);}// cout << "sum = " << sum << endl;int ans = 0;bool ck = 1;for (int i = 1; i <= n - 1; i++) {x = y = i;int ret = que(1, 1, n - 1);if (ret == INF) {ck = 0;break;}ans += ret;}if (ck) printf("Case #%lld: %lld", ++cnt, sum - ans);else printf("Case #%lld: Gotta prepare a lesson", ++cnt);if (t) printf("\n");}return 0;
}

2021--ICPC网络预选第一场--A Busiest Computing Nodes相关推荐

  1. 图论 ---- DAG删点+枚举+暴力+离线前缀异或和 J Red-Black Paths (2021 icpc网络赛第一场)

    补题地址 题目大意: 比赛时候自己演自己卡A-这题也不难 一开始给你一个空图.有4个操作 在图中给u→vu\rightarrow vu→v加一条有向边 把uuu节点涂成红色 把vvv节点涂成黑色 询问 ...

  2. 【线段树-维护区间最小值和区间和】2021 ICPC网络赛第一场 D: Edge of Taixuan

    Problem D: Edge of Taixuan 评测传送门 (ps: 评测时需要先花费一个币买下题目集后方可进行提交并评测.) 题目大意: 给出 n n n个结点, m m m次操作,每次操作给 ...

  3. J Red-Black Paths(ICPC网络赛第一场)

    J Red-Black Paths(ICPC网络赛第一场) 题意: 有n个点,m次操作,有三种操作: 1 u v:从u向v建一个有向边 2 u:将点u染成红色 3 u: 将点u染成黑色 4 查询最新生 ...

  4. 2021.icpc网络赛第二场

    Leaking Roof 签到 大意:给定 n*n 格子,每个格子的水量为m, 当前格子的水会向周围有公共边的,且高度严格大于的格子等量流动,当且仅当高度为0时水会流出,求最终每个格子流出的水量.n& ...

  5. ICPC网络赛第二场G Limit

    ICPC网络赛第二场G Limit 题意: 给你数组a和b,求解: 1≤n≤100000,−100≤ai,bi≤100,0≤t≤5.1≤n≤100000,−100≤a_{i},b_{i}≤100,0≤ ...

  6. icpc网络赛第二场K Meal

    icpc网络赛第二场K Meal 题意: 有n个人,n个菜, 现在n个人轮流吃菜,起初S中有n个菜,第i个人会在还没拿走的菜中随机选一个,拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{ ...

  7. 2020ICPC·小米 网络选拔赛第一场 J.Matrix Subtraction

    2020ICPC 小米 网络选拔赛第一场 J.Matrix Subtraction 题目链接 题目描述 Given a matrix MM_{}M​ of size n×mn\times mn×m a ...

  8. 2020ICPC·小米 网络选拔赛第一场 D.Router Mesh

    2020ICPC·小米 网络选拔赛第一场 D.Router Mesh 题目链接 题目描述 In a Mesh networking system, there are nn_{}n​ MI Route ...

  9. ICPC2020小米网络选拔赛第一场复盘

    1.看题 第一次组队打ICPC,可能任务分配上还有待优化 但是有个团队,感觉安心好多. 我们有三个人,开始是分开来,每人看三题 djn看ABC,jyf看DEF,我看GHI,JK没人看 我开始只来得及看 ...

  10. 2020ICPC·小米 网络选拔赛第一场

    比赛链接 前言 第二场都快打了才补完题目发博客,最近事情真的太多了= = A - Intelligent Warehouse(DP+数论优化),三种做法 题目大意 给出 n n n个数,从中选择最多的 ...

最新文章

  1. makefile 中 =, :=, ?=, +=的区别
  2. mysql 2003错误 10055_MYSQL无法连接 提示10055错误的解决方法
  3. 浅析epoll – epoll例子以及分析 - C++爱好者博客
  4. http工具类(支持https,连接池和失败重试)
  5. SYN攻击原理 accpet()函数调用时机
  6. A Greeting from Qinhuangdao Gym - 102769A 2020ccpc秦皇岛分站赛
  7. 使用CXF发布WebService服务简单实例
  8. mysql 5.5.42,mysql-5.1.42安装完成后,出现如下错误的解决办法
  9. 玩了10小时赛博朋克2077,我觉得很失望
  10. PHP time zone unknown Fail
  11. python模块time_python模块之time和datetime
  12. Python-判断变量类型和继承链-type isinstance
  13. FW:星巴客装B指南
  14. 惠普m202dw_惠普HP LaserJet Pro M202dw 驱动
  15. java面试 自我介绍_java面试自我介绍
  16. 和秋叶一起学PPT之线条(课时六)
  17. 《第一本无人驾驶技术书》
  18. VLAN_Trank使用
  19. 论文:OIE@OIA: an Adaptable and Efficient Open Information Extraction Framework
  20. push进队列的C2075错误

热门文章

  1. HDU1034C++
  2. [Usaco2010Hol]Dotp
  3. python数据清洗工具、方法、过程整理归纳(六、数据清洗之数据预处理(一)——重复值处理、缺失值处理)
  4. RxSwift核心原理探究
  5. 深度分析DD哪些数据会引起国安注意?
  6. 自然语言处理面试基础
  7. cython混淆加密
  8. aws打开慢_亚马逊AWS服务器访问较慢,如何快速访问AWS服务器呢?
  9. java es nested_关于nested类型的使用
  10. Spring Boot application properties或application yml相关配置