首页 > 其他分享 >【P8819 [CSP-S 2022]】 星战 题解(图论 + 哈希)

【P8819 [CSP-S 2022]】 星战 题解(图论 + 哈希)

时间:2023-06-12 20:11:52浏览次数:44  
标签:图论 星战 题解 出度 入度 哈希 节点

图论 + 哈希。

Link.

因为实在是太妙了所以写个题解。

Solution

  • 因为每个点的出度都为 \(1\),所以从任意一点出发永远可以走下去,故每次只需判断每个点度数是否为 \(1\) 即可。

  • 然后一三操作显然直接 \(O(1)\) 维护,\(50\ pts\)。

  • 考虑二四操作。每次操作显然对点 \(u\) 的出度没有影响,但是对边的起点 \(v\) 的出度有影响。考虑如何把操作转化到对 \(u\) 的修改上来。

  • 发现可以维护一个点的入度。如果不考虑反攻时刻的判断,四个操作在入度上的修改都能做到 \(O(1)\)。

  • 根据入度 = 出度,反攻时刻的判断可以变为所有节点的入度值等于 \(n\)。但是这样无法保证每个节点的出度都是 \(1\)。

  • 考虑优化一下入度的计算,实现 \(O(1)\) 判断所有节点的出度一定都为 \(1\)。结合起来考虑,发现如果使用哈希的思想,给每个节点随机权值 \(w_i\),定义一个节点的入度为所有边起点的权值和,那么如果 \(\sum r_i=\sum w_i\),则能保证每个节点都有一条出边指向某个节点。

  • 解题重点在于转化与哈希思想。如果想到第一条和哈希,此题基本迎刃而解。

Code

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i, a, b) for(int i = a; i <= b; ++i)
const int maxn = 5e5 + 5;
int n, m, q;
int tot, r[maxn], w[maxn], g[maxn];

mt19937 rng(time(0));

signed main(){
	scanf("%lld%lld", &n, &m);
	rep(i, 1, n) w[i] = rng(), tot += w[i];
	int rec = 0;
	while(m--){ int u, v; scanf("%lld%lld", &u, &v);
		g[v] = (r[v] += w[u]), rec += w[u];
	}
	scanf("%lld", &q);
	while(q--){
		int t; scanf("%lld", &t);
		if(t == 1){ int u, v; scanf("%lld%lld", &u, &v);
			r[v] -= w[u], rec -= w[u];
		} else if(t == 2){ int v; scanf("%lld", &v);
			rec -= r[v], r[v] = 0;
		} else if(t == 3){ int u, v; scanf("%lld%lld", &u, &v);
			r[v] += w[u], rec += w[u];
		} else{ int v; scanf("%lld", &v);
			rec += g[v] - r[v], r[v] = g[v];
		} if(rec == tot) printf("YES\n"); else printf("NO\n");
	}
	return 0;
}

Thanks for reading.

标签:图论,星战,题解,出度,入度,哈希,节点
From: https://www.cnblogs.com/gsn531/p/17476006.html

相关文章

  • [ABC212E] Safety Journey 题解
    SafetyJourney题目大意给定一张缺少了\(m\)条边的\(n\)个点的完全图和一个正整数\(k\),你需要求出满足以下条件的序列\(A\)的数量:\(A\)的长度为\(k+1\)。\(A_0=A_k=1\)。\(\forall0\lei\lek-1\),点\(A_i\)和点\(A_{i+1}\)之间存在边。思路分析图上计数,考......
  • Codeforces Round 877 (Div.2) 题解 A - D
    A.BlackboardList题目大意起初黑板上有两个数,现在不断选取两个数作出他们俩差的绝对值并写在黑板上,如此往复直到黑板上有\(n\)个数。现在给定这\(n\)个数,问起初两数的其中一个数是多少。解题思路我们分两种可能:要么这两个数有负数,要么没有。有负数的情况,因为每次写下......
  • P1707 刷题比赛 题解
    多少有点混乱邪恶。题意:给出递推式:\[a_1=b_1=c_1=1\\a_2=b_2=c_2=3\\\begin{aligned}a_k&=p\timesa_{k-1}+q\timesa_{k-2}&+b_{k-1}+c_{k-1}&+r(k-2)^2+t(k-2)+1\\b_k&=u\timesb_{k-1}+v\timesb_{k-2}&+a_{k-1}+c_{k-1}&+w^{k-2}\\c......
  • P1306 斐波那契公约数 题解
    请求出\(f_n\)与\(f_m\)的最大公约数,即\(\gcd(f_n,f_m)\),答案对\(10^8\)取模。结论:\(\gcd(f_n,f_m)=f_{\gcd(n,m)}\)证明如下:首先引理1:\[f_{n+m}=f_{n-1}\timesf_{m}+f_{n}\timesf_{m+1}\]运用归纳法,可以简单证明,此处略去。引理2:\[\gcd(f_n,f_......
  • AtCoder Beginner Contest 305 题解
    https://atcoder.jp/contests/abc305/tasks_printE-ArtGalleryonGraph冷知识:md这题赛时没做出来/cy刚看到题:这是什么题啊,\(K,h\)都\(1e5\)能做吗/fn确实能做。考虑类似SPFA的操作。设\(a_x\)表示\(x\)还可以对距离最多为\(a_x\)的点产生贡献,然后就直接......
  • 查找二之哈希表查找
    1、功能:哈希表可以直接通过关键字直接找到数据的位置,不需要进行任何的比较,也就是说,哈希表建立了关键字和存储地址之间一种直接的映射关系,其查找的效率相对较高。2、定义1、哈希地址:哈希地址只是在查找表中的存储位置,并不是实际的物理存储物质2、哈希函数:f()是一个函数,......
  • Codeforces Round 876 Div2 A-D题解
    CodeforcesRound876Div2A-D题解A.TheGoodArray这个题就是问你对于\(i\leqn\),要求前面后面至少\(ceil(\frac{i}{k})\)个1那我们就贪心的每k个放一个1,或者直接用数学算一下就好了AC代码#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • 杂题题解
    序列变化(exchange)只要第一位确定,后面的\(n-1\)位都是唯一确定的。因为具体是B还是C只取决于两侧字母是否一样,所以两种变化方案其中一种是另一种每一位取反,要么都合法,要么都不合法。但变化出的方案可能不能继续变化下去,比如CCC变化到BBB之后就不能再变化了,但变化到CCC......
  • 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
    一致性哈希算法摘自:http://blog.codinglabs.org/articles/consistent-hashing.html算法简述一致性哈希算法(ConsistentHashing)最早在论文《ConsistentHashingandRandomTrees:DistributedCachingProtocolsforRelievingHotSpotsontheWorldWideWeb》中被提出。简单来......