P8819 [CSP-S 2022] 星战 题解

news/2024/10/6 16:35:36/文章来源:https://www.cnblogs.com/sea-and-sky/p/18449167

“不可以,总司令”

题目传送门

随机化的巧妙运用

考虑什么时候可以发起反攻,
每个节点都可以走到一个环上,每个节点的出度为\(1\) .....

事实上,我们会发现第一个条件是没用的,因为当每个节点出度为一时就一定可以走到一个环上

所以这个问题就转化为了判断当前的图是否每个点的出度为 \(1\)

但是我们发现如果维护每个点的出度的话复杂度会假掉,修复/炸掉一个节点是要遍历他的所有出度,不行。

既然维护出度不行,难道我们维护入度吗?

还真是,维护入度可以在 O(1) 的时间里实现

但是维护入度有一个问题,

每个节点入度为 \(1\) 仅仅只是 每个结点的出度唯一的 必要条件

那我们就要想办法将这个必要条件尽可能转化为 充要条件 ,也就是说要让每个节点给其他节点带来的入度变得特殊

所以,我们最终会想到给每个节点附上一个随机权值,看最终所有入度的权值之和是否等于每个节点出度为 \(1\) 时的入度权值之和

然后这题就做完了

上代码!

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
mt19937 rnd;
int n, m,q;
struct edge
{int f, t;
};
edge eds[1000010];
struct node
{int num;int key;vector<int> to;ll tin_;ll in_;//表示这个节点在一开始的入度之和// ll out_;
};
node nod[1000010];
ll tot_quan;//总的权值
ll ans_quan;//所有节点出度为 1 时的权值之和
int main()
{ios::sync_with_stdio(false);srand(time(NULL));rnd.seed(rand());cin >> n >> m;int a, b, c;for (int yy = 1; yy <= n; yy++){nod[yy].key = rnd();//给每个点附上随机权值ans_quan += nod[yy].key;}for (int ww = 1; ww <= m; ww++){cin >> a >> b;eds[ww].f = a;eds[ww].t = b;nod[a].to.push_back(ww);// nod[a].out_ += nod[a].key;nod[b].in_ += nod[a].key;}for (int ww = 1; ww <= n; ww++){tot_quan += nod[ww].in_;nod[ww].tin_=nod[ww].in_;}cin >> q;int t;for (int ww = 1; ww <= q; ww++)//接下来模拟操作即可{cin >> t;if (t == 1){cin>>a>>b;tot_quan-=nod[a].key;nod[b].tin_-=nod[a].key;}else if (t == 2){cin>>a;tot_quan-=nod[a].tin_;nod[a].tin_=0;}else if (t == 3){cin>>a>>b;tot_quan+=nod[a].key;nod[b].tin_+=nod[a].key;}else if (t == 4){cin>>a;tot_quan+=(nod[a].in_-nod[a].tin_);nod[a].tin_=nod[a].in_;}if(tot_quan==ans_quan){cout<<"YES\n";}else{cout<<"NO\n";}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人知识面/技能池

虽然走得慢,但是一直在前行 知识面/技能池 电路 模拟电路微弱信号处理信号链设计1Msps采样电路设计滤波器设计无源滤波器有源滤波器光电探测电路设计电力电子逆变电路设计磁耦合谐振式无线电能传输开关电源LED恒流驱动AC/DC 设计基本电路知识电路基础知识复习跟习题册联系现代…

【CodeForces训练记录】Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)

赛后反思 做红温了,太菜了,每题都需要WA几次才能过,B题看到 MEX 选择性害怕,时间复杂度又算错了 A题 每次选择一对 \(a_i,a_j\) 把均值插入数组最后面,要想结果最大,对于两个数求均值,最后的结果一定是小于等于其中的较大值,我们可以考虑如何最大化最后一次操作,想到将…

傻逼模拟赛搬的时候能不能看看题面改之后还是不是让人能看懂还有不发 checker 是有什么心事吗

如题。 傻逼模拟赛搬的时候能不能看看题面改之后还是不是让人能看懂还有不发 checker 是有什么心事吗还在最后一道题放集训队互测什么意思 什么叫有 \(b_{k}\) 种 \(k\) 类型的货币,同一种流通的货币不会超过二十种 什么叫接下来 \(n\) 个数表示 \(a_{1} \sim a_{n-1}\)upd:

Java - 10 二维数据

Java - 10 二维数据 一维数组的每个元素又是一个一维数组 静态初始化 int[][] arr = {{0,0,0,0},{1,1,1,1},{2,2,2,2},{3,3,3,3}};public class TwoDimensionArray {public static void main(String[] args) {int[][] arr = {{0,0,0,0},{1,1,1,1},{2,2,2,2},{3,3,3,3}};// 遍历…

Java - 11 类与对象

Java - 11 类与对象 类 类[属性, 行为] ->对象[属性, 行为] public class Test{public static void main(String[] args){Cat cat1 = new Cat(); // 创建对象cat1.name = "大宝";cat1.age = "3";cat1.color = "orange";System.out.println(ca…

20222413 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 在本周的学习过程中,我了解到了许多缓冲区溢出攻击的实际案例、缓冲区溢出攻击的原理和相关基础知识,包括GDB调试器的使用方法、反汇编、基础的汇编语言与指令等,重新温习了函数调用过程和进程管理方面的知识内容。并且通过实验一,我能够了解并熟练完成Linux系统…

函数的上下文

函数的上下文 概述 在函数体的语句中,会出现this这个词,this就是函数的上下文 函数中this是谁,就说明函数的上下文是谁 函数中的this是谁,要看是如何调用的,因为this不是一成不变的 比如我们看下面的例子 var obj = {a: 100,fun: function() {console.log(this.a);} };我们…

拥挤聚集智能监测系统

拥挤聚集智能监测系统可以通过对人员数量、密度等进行实时监测,拥挤聚集智能监测系统识别出拥挤聚集的情况,并及时发出预警。拥挤聚集智能监测系统可以通过对人员进车间的人数等进行监测,识别出是否存在人员拥堵、挤压等安全隐患,及时发出警报,提醒工作人员采取措施疏散人…

睡岗识别 AI助力企业安全管控

睡岗识别可以通过AI视频智能分析技术,睡岗识别识别出操作人员是否存在睡岗情况。例如,在变电站等场景中,睡岗识别技术可以通过对识别出操作人员是否存在睡岗情况,及时发出预警,避免因操作人员的疏忽而导致的安全事故。在工厂车间中,睡岗识别技术可以通过对工人的行为进行…

加油站安全风险监测预警系统

加油站安全风险监测预警系统可以通过对加油站设备、环境、人员等方面进行监测,加油站安全风险监测预警系统实现对加油站的全面监管。例如,在加油站油罐区中,加油站安全风险监测预警系统可以对加油站人员抽烟打电话、明火烟雾等环境安全隐患进行自动识别,及时发出预警,避免…

山西煤矿电子封条

山西煤矿电子封条通过AI视觉分析技术,山西煤矿电子封条实现对各矿区(煤矿和非煤矿区)每日矿井出入井人监察控制、调度室空岗识别、煤矿生产作业状态、摄像头遮挡、挪动角度识别、货运车辆出矿识别等。山西煤矿电子封条实现当前待办事项的推送,以及对各矿区用户区域内的报警…

离岗识别 AI助力企业安全管控

离岗识别通过yolov5网络模型技术,离岗识别可以自动识别办公室、工厂、监控室监控画面中人员离岗脱岗睡岗等行为,发现违规行为立即抓拍告警并同步睡岗离岗等违规数据到后台提醒值班人员及时处理。离岗识别采用人工智能算法识别技术对各主控室、办公室、工厂、煤矿监控室等人员…