首页 > 其他分享 >星战

星战

时间:2024-07-12 16:11:55浏览次数:3  
标签:cur 星战 int res 据点 哈希 摧毁

https://www.luogu.com.cn/problem/P8819

https://www.acwing.com/problem/content/description/4737/

  • 为了使虫洞穿梭的过程连续,尽量减少战舰在据点切换虫洞时的质能损耗,当且仅当只有一个从该据点出发的虫洞可用时,这个据点可以实现连续穿梭
  • 如果我方所有据点都可以实现连续穿梭,那么每个点都可以一直走,也能满足我方所有据点都可以实现反击,所以只需要判断每个点的出度是否都是 \(1\) 即可。

我们把终点为据点 \(u\) 的所有虫洞归为据点 \(u\) 的虫洞。

敌人会摧毁某个虫洞,这会使它连接的两个据点无法再通过这个虫洞直接到达,但这样的打击无法摧毁它连接的两个据点。

B 型特种部队可以将某据点的所有损坏的虫洞修复。

  • 若 \(t = 2\),接下来一个整数 \(u\) 表示敌人摧毁了据点 \(u\)。如果该据点的虫洞已全部被摧毁,那么这次袭击不会有任何效果。
  • 若 \(t = 4\),接下来一个整数 \(u\) 表示我方修复了据点 \(u\)。如果该据点没有被摧毁的虫洞,那么这次修复不会有任何效果。

题目的暗示:记录每个点的出度,可以分别记录以点 \(u\) 为终点的虫洞的起始点有哪些点,用一个01数组记录,若有 \(i\rightarrow u\) 的边,则 \(s_u\) 的第 \(i\) 位=1。然后最后求 \(\sum_{u=1}^n s_u\) 是否恰好每一位都是1即可。

如果按照 \(n\) 位维护,遇到2、4操作,无论如何都是 \(O(n)\),最坏达到 \(O(nq)\),TLE。

由CCF的特性以及往年无解的分数可知,正确率高的算法也可以通过此题。

我们发现这个东西很像字符串哈希,将一个需要 \(O(n)\) 比较的str转换成num,只是需要支持相加操作。

其实每一位赋值不同的权值,发现 \(h(s_x)+h(s_y)=h(s_x+s_y)\),因为每一位是可以单独考虑的。

我们将 \(s_u\) 转换成了哈希值了。

每次只需要将涉及到的那个 \(s_u\) 先减去,遇到1、3更新一位,遇到2、4直接置空、恢复初始状态,然后加上新的值即可。

用 ull 可以自动取模。

复杂度 \(O(n+m+q)\)。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=500010,P=13331;
int n,m,q;
ull p[N],ao,res,org[N],cur[N];
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.txt","r",stdin);
    #endif
    #ifdef ONLINE_JUDGE
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    #endif
    p[0]=1;
    cin>>n>>m;
    for(int i=1;i<=n;++i)p[i]=p[i-1]*P;
    for(int i=1;i<=m;++i){
    	int a,b;
    	cin>>a>>b;
    	org[b]+=p[a],cur[b]+=p[a];
	}
	for(int i=1;i<=n;++i)ao+=p[i],res+=cur[i];
	cin>>q;
	for(int i=1;i<=q;++i){
		int t,u,v=0;
		cin>>t>>u;
		if(t==1||t==3)cin>>v;
		res-=cur[u]+cur[v];
		if(t==1)cur[v]-=p[u];
		if(t==2)cur[u]=0;
		if(t==3)cur[v]+=p[u];
		if(t==4)cur[u]=org[u];
		res+=cur[u]+cur[v];
		cout<<(ao==res?"YES\n":"NO\n");
	}
    return 0;
}

这种做法的名字:和哈希

标签:cur,星战,int,res,据点,哈希,摧毁
From: https://www.cnblogs.com/wscqwq/p/18298593

相关文章

  • P8819 [CSP-S 2022] 星战 (很厉害的随机化想法)
    简化下题意有n个点m条单向边每条边有激活和失活两种状态,一共有4中操作1.失活一条u->v的边2.失活终点是v的边3.激活u->v的边4.激活终点是v的边问你每次修改后每个点的出度是否都为1.50分的做法就是暴力修改,对于1操作和3操作都是可以o(1)解决,对于2操作和4......
  • P8819 [CSP-S 2022] 星战 做题记录
    不可以,总司令。题目传送门思路首先,当图中每个点出度为\(1\)时,从任一点出发必定会进入环。证明:假设有一点不符合,则沿着它的出边一直走会到一个出度为\(0\)的「终点」,与每个点出度为\(1\)矛盾。想通了这点,这题就不难了。发现出度要\(O(n)\)维护,入度可以\(O(1)\)维护......
  • 【P8819 [CSP-S 2022]】 星战 题解(图论 + 哈希)
    图论+哈希。Link.因为实在是太妙了所以写个题解。Solution因为每个点的出度都为\(1\),所以从任意一点出发永远可以走下去,故每次只需判断每个点度数是否为\(1\)即可。然后一三操作显然直接\(O(1)\)维护,\(50\pts\)。考虑二四操作。每次操作显然对点\(u\)的出度......
  • P8819 [CSP-S 2022] 星战
    [CSP-S2022]星战这么长时间过去都快不会写题解了。嗯……不过还是稍微记一下会比较好。题意看完之后就是让我们去判断整张图是否是一个内向基环树森林。然后这个事情......
  • 题解 LGP8819【[CSP-S 2022] 星战】
    postedon2022-10-3011:39:14|under题解|sourceproblem一个\(n\)个点\(m\)条边的有向图,\(q\)次操作:删除一条边,保证存在;增加一条边,保证不存在;删除一个点......
  • CSP-S2022 假期计划 策略游戏 星战 数据传输
    [折半搜索/BFS]T1:给定一个无向图,边权是1,点权\(vi\epsilon[1,1e18]\),要求你选出4个不重复的点,从1出发到这些点然后回到1,可以经过重复点,但是要求\(max(dis(1,i),dis(i,j),......
  • CSP-S 星战题解
    更好的体验首先可以观察出一个性质,只要每个点的出度都是1,那么就一定会满足“每个点都能进入一个环”的性质,也就是说只要每个点出度为1,那么该情况就是合法的。然后考虑怎......
  • P8819 [CSP-S 2022] 星战 题解
    思路考前练习了特别多的随机权题目,但是考场上考了我们整个机房都没做出来。通读题目,发现如果当前可以进行反攻了,只有此时的所有点的出度均为一。考虑它的四个操作。给......
  • P8819 CSP-S 2022 星战
    P8819CSP-S2022星战-洛谷|计算机科学教育新生态(luogu.com.cn)很棒的一道题,虽然一开始阅读理解确实掉了印象分,但后来做出来发现,瑕不掩瑜。先翻译一下题目:\(n\)......
  • [CSP-S 2022] 星战
    link首先手玩一下满足条件的图,只需要满足条件二:所有点出度为1,条件1会自然满足,我们必然可以顺着其出边走下去。code......