2021--ICPC网络预选第一场--A Busiest Computing Nodes
比赛时思路不正确,赛后看大佬的代码才知道是线段树+二分。
这题和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相关推荐
- 图论 ---- DAG删点+枚举+暴力+离线前缀异或和 J Red-Black Paths (2021 icpc网络赛第一场)
补题地址 题目大意: 比赛时候自己演自己卡A-这题也不难 一开始给你一个空图.有4个操作 在图中给u→vu\rightarrow vu→v加一条有向边 把uuu节点涂成红色 把vvv节点涂成黑色 询问 ...
- 【线段树-维护区间最小值和区间和】2021 ICPC网络赛第一场 D: Edge of Taixuan
Problem D: Edge of Taixuan 评测传送门 (ps: 评测时需要先花费一个币买下题目集后方可进行提交并评测.) 题目大意: 给出 n n n个结点, m m m次操作,每次操作给 ...
- J Red-Black Paths(ICPC网络赛第一场)
J Red-Black Paths(ICPC网络赛第一场) 题意: 有n个点,m次操作,有三种操作: 1 u v:从u向v建一个有向边 2 u:将点u染成红色 3 u: 将点u染成黑色 4 查询最新生 ...
- 2021.icpc网络赛第二场
Leaking Roof 签到 大意:给定 n*n 格子,每个格子的水量为m, 当前格子的水会向周围有公共边的,且高度严格大于的格子等量流动,当且仅当高度为0时水会流出,求最终每个格子流出的水量.n& ...
- 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≤ ...
- icpc网络赛第二场K Meal
icpc网络赛第二场K Meal 题意: 有n个人,n个菜, 现在n个人轮流吃菜,起初S中有n个菜,第i个人会在还没拿走的菜中随机选一个,拿走第j个菜的概率为ai,j∑k∈Sai,k\frac{a_{ ...
- 2020ICPC·小米 网络选拔赛第一场 J.Matrix Subtraction
2020ICPC 小米 网络选拔赛第一场 J.Matrix Subtraction 题目链接 题目描述 Given a matrix MM_{}M of size n×mn\times mn×m a ...
- 2020ICPC·小米 网络选拔赛第一场 D.Router Mesh
2020ICPC·小米 网络选拔赛第一场 D.Router Mesh 题目链接 题目描述 In a Mesh networking system, there are nn_{}n MI Route ...
- ICPC2020小米网络选拔赛第一场复盘
1.看题 第一次组队打ICPC,可能任务分配上还有待优化 但是有个团队,感觉安心好多. 我们有三个人,开始是分开来,每人看三题 djn看ABC,jyf看DEF,我看GHI,JK没人看 我开始只来得及看 ...
- 2020ICPC·小米 网络选拔赛第一场
比赛链接 前言 第二场都快打了才补完题目发博客,最近事情真的太多了= = A - Intelligent Warehouse(DP+数论优化),三种做法 题目大意 给出 n n n个数,从中选择最多的 ...
最新文章
- makefile 中 =, :=, ?=, +=的区别
- mysql 2003错误 10055_MYSQL无法连接 提示10055错误的解决方法
- 浅析epoll – epoll例子以及分析 - C++爱好者博客
- http工具类(支持https,连接池和失败重试)
- SYN攻击原理 accpet()函数调用时机
- A Greeting from Qinhuangdao Gym - 102769A 2020ccpc秦皇岛分站赛
- 使用CXF发布WebService服务简单实例
- mysql 5.5.42,mysql-5.1.42安装完成后,出现如下错误的解决办法
- 玩了10小时赛博朋克2077,我觉得很失望
- PHP time zone unknown Fail
- python模块time_python模块之time和datetime
- Python-判断变量类型和继承链-type isinstance
- FW:星巴客装B指南
- 惠普m202dw_惠普HP LaserJet Pro M202dw 驱动
- java面试 自我介绍_java面试自我介绍
- 和秋叶一起学PPT之线条(课时六)
- 《第一本无人驾驶技术书》
- VLAN_Trank使用
- 论文:OIE@OIA: an Adaptable and Efficient Open Information Extraction Framework
- push进队列的C2075错误