CSP22.3 T4通信系统管理
之前在CCF CSP认证2022年3月完整题解这篇博客记录了自己花了两天时间乱搞出来的方法,但是实际上动态维护区间最值,通过 s e t set set实现会更简洁,用优先队列需要额外开数组记录节点的实时信息,而且堆中节点需要一个有效标记——失效时间,因为节点失效之后不会立刻从堆中 erase,而是作为堆顶弹出。因此需要这样一个标记判断节点是否有效,是否代表了实时流量,是否应弹出。
然而这样设计导致在流量变化时需要更新该标记,而两个节点之间可能存在多股流量,应使用最近失效时间更新标记,因此我通过结构 m a p < p a i r < i n t , i n t > , p r i o r i t y _ q u e u e < i n t , v e c t o r < i n t > > , g r e a t e r < i n t > > map<pair<int,int>,priority\_queue<int,vector<int>>,greater<int>> map<pair<int,int>,priority_queue<int,vector<int>>,greater<int>> 维护所有失效时间点,并快速查找最近者。
还存在空间问题,节点数量为 1 e 5 1e5 1e5,而 ( 1 e 5 ) 2 = 1 e 10 (1e5)^2=1e10 (1e5)2=1e10,因此维护实时信息的数组只能动态使用空间(用 v e c t o r vector vector 的 p u s h _ b a c k push\_back push_back 和 e r a s e erase erase 方法)。
更多地,我的代码封装几乎没有,直接 copy 改一改不用动脑省事呵呵,导致最后行数 250+。。。
综上,通过 s e t set set 动态维护区间最值为最佳。
摘自之前的 blog:
在处理额度失效上,我也使用了最小堆,类似一个“沙漏”,其实没必要,甚至增加了复杂度。用 m a p < l l , t u p l e > map<ll,tuple> map<ll,tuple> 即可,tuple 存储端点,和失效额度值。实际上,时间是以天为单位连续的,范围为1e5,用数组存储也可以,用 m a p map map 是动态开辟空间,牺牲时间换空间。
之前我将问题复杂化主要是不了解 s e t set set 和 m a p map map 这两个结构的底层实现是平衡树,节点之间存在大小关系,通过迭代器访问获得的是有序的节点序列,这也要求我们定义结构体储存与这两个结构时重载小于号,定义这种大小关系。
以下是看了 yhf 学长的 live coding ,自己写了一遍并整理思路。
思路
主要通信对象
维护每个节点的主要通信对象,而节点和其他诸多节点时间有多个流量(额度),要维护其中最大者,流量相同则编号最小者,定义流量如下:
struct node {ll v; int to;node(ll v, int to) : v(v), to(to) {}bool operator < (const node &d) const {return v == d.v ? to < d.to : v > d.v;}
};
存储于 s e t < n o d e > d [ m a x n ] set<node> d[maxn] set<node>d[maxn] 结构,如何更新?将原流量 erase ,重新 insert 新流量。最大者为 d [ i ] . b e g i n ( ) − > t o d[i].begin()->to d[i].begin()−>to.
孤岛、通信对
通过 i s l o n e l y islonely islonely 函数判断更新前后节点是否为孤岛,判据为没有流量或者流量为0,;
通过 i s p a i r ispair ispair 判断节点是否包含“通信对”关系,首先节点不为孤岛,然后,找到它的主要通信对象 y y y ,看 y y y 的对象是否是自己,这里注意,由于 w o r k work work 对节点对的对称操作是先后进行,不同步(实际肯定是同时发生), y y y 可能先操作并且变为“孤岛”了,因此要保证 y y y 不是“孤岛”:
return (!islonely(y) && d[y].begin()->to == x);
代码
using ll = long long;
const int maxn = 1e5 + 10;// 通信主要通信对象
// 通信孤岛、通信对
// n, m:1e5struct node {ll v; int to;node(ll v, int to) : v(v), to(to) {}bool operator < (const node &d) const {return v == d.v ? to < d.to : v > d.v;}
};struct info {int u, v, x;info(int u, int v, int x) : u(u), v(v), x(x) {}
};set<node> d[maxn];
map<pair<int, int> , ll> save; // 维护点对实时额度
vector<info> decr[maxn];
int pv, qv; // 通信孤岛、通信对数int islonely(int x) {return (d[x].begin() == d[x].end() || d[x].begin()->v == 0);
} // 检查是否孤岛int ispair(int x) {if (islonely(x)) return 0;int y = d[x].begin()->to;return (!islonely(y) && d[y].begin()->to == x);
} // 检查是否包含通讯对void work(int u, int v, int x) {ll origVal = save[{u, v}];save[{u, v}] += x;pv -= islonely(u);qv -= ispair(u);node orig(origVal, v);d[u].erase(orig);d[u].emplace(save[{u, v}], v);pv += islonely(u);qv += ispair(u);
} // 节点u的额度申请、过期void solve() {int n, m;cin >> n >> m;pv = n; qv = 0;for (int i = 1; i <= m; i++) {// 处理过期额度for (const auto &t : decr[i]) {work(t.u, t.v, -t.x);work(t.v, t.u, -t.x);}int k, l, num, p, q;// 当天额度申请cin >> k;int u, v, x, y;for (int j = 1; j <= k; j++) {cin >> u >> v >> x >> y;if (i + y <= m) decr[i + y].emplace_back(u, v, x);work(u, v, x);work(v, u, x);}// 查询通信主要通信对象cin >> l;for (int j = 1; j <= l; j++) {cin >> num;if (islonely(num)) {cout << "0\n";}else {cout << d[num].begin()->to << '\n';}}// 查询通信孤岛、通信对cin >> p >> q;if (p) cout << pv << '\n';if (q) cout << qv << '\n';// cout << '\n';}
}
CSP22.3 T4通信系统管理相关推荐
- CSP 202203 题解:未初始化警告,出行计划,计算资源调度器,通信系统管理,博弈论与石子合并
试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page CCF 官方题解请点击这里. 阅读本题解前,您应当了解下列知识: ...
- CSP认证: 20220304通信系统管理
感想:首先得解决用什么数据结构储存数组,创建一个二维数组,下标作为两个计算器之间的可用传输额度,用压缩储存.
- 2022年9月CSP认证题解 如此编码(k进制),何以包邮?(背包问题),吉祥物投票(珂朵莉树、懒标记、并查集)
T1 如此编码 思路 由公式 和前缀乘积定义 得m=b1+a1×b2+⋅⋅⋅+a1×a2×⋅⋅⋅×an−1×bnm=b_1+a_1\times b_2+···+a_1\times a_2\times· ...
- ccf-csp202203
这次csp是100+100+100+20+20的操作,第一题不说了,第二题感觉是数据水了?,它的c到了2e5,n也有1e5他的第四题和第五题全部暴力,两个嵌套之后没有竟然没有ETL!!!出题人数据善良 ...
- ccf-csp历年满分题解 + 总结汇总(已完成55题,持续更新中...)
2013-12 出现次数最多的数 ISBN号码 最大的矩形 有趣的数 I'm stuck! 2014-03 相反数 窗口 命令行选项 ...
- CSP认证近两期试题汇总
前言 因为了学分的需要,准备参加CSP认证,结果发现这个比赛没有题解,平台也没有提供相关讨论方式,因此决定以此来记录本人刷题解答.希望能够帮到大家,共同进步. 本人主要使用python刷题,但是pyt ...
- 一位未来程序猿的成长历程
在这里记录自己在编程训练过程中的一些想法,欢迎各位大佬前来指点. 编程 PAT甲级 CSP认证 LeetCode:数据结构 PAT甲级 1001 A+B Format 1002 A+B for Pol ...
- CCF- CSP历年认证考试题目链接+题解总结(持续更新)
CCF- CSP历年认证考试题目链接+题解总结(持续更新ing) 目录 CCF- CSP历年认证考试题目链接+题解总结(持续更新ing) 202206第26次CCF计算机软件能力认证 202203第2 ...
- 【STC15】 STC15W408AS SBUS通信例程
STC15 SBUS通信例程 相关单片机外设介绍 SBUS协议介绍 代码部分 程序文件 相关单片机外设介绍 1.STC15W408AS内部晶振频率最高可以设置为35MHz ,本demo设置为24MHz ...
最新文章
- 第一课 PHP学习要求
- python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
- 第三场阴影场与属性访问器接口
- magento -- 修改文件来手动控制编译的开启和关闭
- 【anaconda】激活环境失败-bash: activate:No such file/没有那个文件或目录
- Leetcode每日一题:26.remove-duplicates-from-sorted-array(删除排序数组中的重复项)
- rez注入器源码_CF-rez-Tool crossfire的REZ文件全套修改工具 - 下载 - 搜珍网
- html.actionlink 锚点,razor - 从@ Html.ActionLink MVC 4将参数传递给控制器
- Android App开发常用尺寸规范
- win10专业版激活时提示无法连接到internet怎么办?
- 输入商品显示商品名称和价格
- 目前流行的装修风格_现在最流行的装修风格是什么 装修风格流行趋势是什么...
- python 取数组最后一个,如何获取数组中的最后一个键?
- git 修改分支名称 --- git branch -m
- SpringAop篇 (2) Spring中的切面编程技术 AspectJ
- java洁癖_如何平衡代码洁癖和项目进度?
- oracle12c启动apply,Oracle 12c 新特性 -- DG 默认使用 Real-Time Apply
- 【CF1092F】 Tree with Maximum Cost
- PDF 签章图片不显示问题
- [转]商业模式新生代