之前在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通信系统管理相关推荐

  1. CSP 202203 题解:未初始化警告,出行计划,计算资源调度器,通信系统管理,博弈论与石子合并

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page CCF 官方题解请点击这里. 阅读本题解前,您应当了解下列知识: ...

  2. CSP认证: 20220304通信系统管理

    感想:首先得解决用什么数据结构储存数组,创建一个二维数组,下标作为两个计算器之间的可用传输额度,用压缩储存.

  3. 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· ...

  4. ccf-csp202203

    这次csp是100+100+100+20+20的操作,第一题不说了,第二题感觉是数据水了?,它的c到了2e5,n也有1e5他的第四题和第五题全部暴力,两个嵌套之后没有竟然没有ETL!!!出题人数据善良 ...

  5. ccf-csp历年满分题解 + 总结汇总(已完成55题,持续更新中...)

    2013-12     出现次数最多的数     ISBN号码     最大的矩形     有趣的数     I'm stuck! 2014-03     相反数     窗口     命令行选项   ...

  6. CSP认证近两期试题汇总

    前言 因为了学分的需要,准备参加CSP认证,结果发现这个比赛没有题解,平台也没有提供相关讨论方式,因此决定以此来记录本人刷题解答.希望能够帮到大家,共同进步. 本人主要使用python刷题,但是pyt ...

  7. 一位未来程序猿的成长历程

    在这里记录自己在编程训练过程中的一些想法,欢迎各位大佬前来指点. 编程 PAT甲级 CSP认证 LeetCode:数据结构 PAT甲级 1001 A+B Format 1002 A+B for Pol ...

  8. CCF- CSP历年认证考试题目链接+题解总结(持续更新)

    CCF- CSP历年认证考试题目链接+题解总结(持续更新ing) 目录 CCF- CSP历年认证考试题目链接+题解总结(持续更新ing) 202206第26次CCF计算机软件能力认证 202203第2 ...

  9. 【STC15】 STC15W408AS SBUS通信例程

    STC15 SBUS通信例程 相关单片机外设介绍 SBUS协议介绍 代码部分 程序文件 相关单片机外设介绍 1.STC15W408AS内部晶振频率最高可以设置为35MHz ,本demo设置为24MHz ...

最新文章

  1. 第一课 PHP学习要求
  2. python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
  3. 第三场阴影场与属性访问器接口
  4. magento -- 修改文件来手动控制编译的开启和关闭
  5. 【anaconda】激活环境失败-bash: activate:No such file/没有那个文件或目录
  6. Leetcode每日一题:26.remove-duplicates-from-sorted-array(删除排序数组中的重复项)
  7. rez注入器源码_CF-rez-Tool crossfire的REZ文件全套修改工具 - 下载 - 搜珍网
  8. html.actionlink 锚点,razor - 从@ Html.ActionLink MVC 4将参数传递给控制器
  9. Android App开发常用尺寸规范
  10. win10专业版激活时提示无法连接到internet怎么办?
  11. 输入商品显示商品名称和价格
  12. 目前流行的装修风格_现在最流行的装修风格是什么 装修风格流行趋势是什么...
  13. python 取数组最后一个,如何获取数组中的最后一个键?
  14. git 修改分支名称 --- git branch -m
  15. SpringAop篇 (2) Spring中的切面编程技术 AspectJ
  16. java洁癖_如何平衡代码洁癖和项目进度?
  17. oracle12c启动apply,Oracle 12c 新特性 -- DG 默认使用 Real-Time Apply
  18. 【CF1092F】 Tree with Maximum Cost
  19. PDF 签章图片不显示问题
  20. [转]商业模式新生代

热门文章

  1. 国行switch商店服务器维护,国行Nintendo Switch e商店商城常见问题解答
  2. 写作套路:如何写论文摘要
  3. Excel按列合并相同相邻单元格和拆分单元格
  4. 什么是编程语言,语言之间的区别
  5. 脸上用激光手术点完痦子之后出现疤痕增生怎么处理比较好
  6. 京东JD App签名/加密算法研究
  7. 图10——判断顶点u和顶点v是否存在简单路径
  8. 游戏3D美术设计就业前景如何?现在饱和了吗
  9. 2017-03-19第nn次考试
  10. Kettle计算器常用函数