首页 > 其他分享 >P8819题解

P8819题解

时间:2024-08-08 22:49:57浏览次数:9  
标签:标记 int 题解 出度 long P8819 序号 操作

题目大意

现在有个有向图图,共有n个点,m条边
总共有四种操作:操作1:将一条边打上标记
操作2:将一个点出发的所有边打上标记
操作3:将一条边移除标记
操作4:将一个点出发的所有边移除标记
打上标记的边视为被移除
每次操作进行一次询问,如果每个点出度都是1,整张图是个强连通图,那么输出"YES",否则输出"NO"

思路分析

首先,每个点出度都为1时,那么边数和点数相同,一定是个强连通图,所以我们只要记录出度即可
但如果用数组记录出度,每次查询O(n),总体时间复杂度O(nq),而n和q都是5e5,必定会TLE
因此,我们必须另辟蹊径
如果直接把所有边的起始点的序号求和,看是否等于点序号的总和,会出现这么一个问题:1+2+3+4+5=1+1+4+4+5
所以,为了保证不出现该类问题,我们需要对数据进行哈希处理,保证等于序号之和的情况只有序号累加。
这就要求数据足够分散,我们可以使用一个大范围的随机进行实现,然后用long long存储
而这个大范围的随机可以用mt19937,使用方法是 mt19937 rnd(一个数字,一般用time(0)保证随机性)初始化,用rand()进行单次随机
接下来就好做了,我们可以用一个mr数组来记录序号乘以出度的初始值,r数组来记录当前序号乘以出度的值,用now记录所有r的总和,sum记录所有节点序号的总和,每次操作对这些变量进行操作即可,然后判断sum是否与now相等

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long w[510000],r[510000],mr[510000],sum=0,now=0;
int main()
{
    int u,v,q,t;
    mt19937 rnd(time(0));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        w[i]=rand();
        sum+=w[i];
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        r[v]+=w[u];
        mr[v]=r[v];
        now+=w[u];
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d%d",&t,&u);
        if(t==2){
            now-=r[u];
            r[u]=0;
        }
        else if(t==4){
            now+=mr[u]-r[u];
            r[u]=mr[u];
        }
        else if(t==1){
            scanf("%d",&v);
            r[v]-=w[u];
            now-=w[u];
        }
        else if(t==3){
            scanf("%d",&v);
            r[v]+=w[u];
            now+=w[u];
        }
        if(now==sum)printf("YES\n");
        else printf("NO\n");
    }
}

标签:标记,int,题解,出度,long,P8819,序号,操作
From: https://www.cnblogs.com/wanxue/p/18349898

相关文章

  • 题解 洛谷P1478 陶陶摘苹果(升级版)
    题目传送门https://www.luogu.com.cn/problem/P1478截图来自洛谷:这道题就是这道题的升级版而已,我们可以定义一个结构体分别存抓当前苹果的力气与高度。之后进行从第1个苹果到第n个苹果的循环,判断当前苹果高度是否够,力气是否够。最重要的是要排序,因为要摘得苹果最多,所以要先......
  • Redis连接问题解决汇总
    Redis连接失败常见解决方案1.检查Redis命令行是否可以正常连接使用命令行客户端,输入:redis-cli-h虚拟机ip地址-p6379-aredis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接2.Redis命令行无法正常连接1)未打开Redis6379端口......
  • 牛客多校 A 题题解
    牛客多校8-AHaitangandGameGivenaset\(\textstyleS\),dXqwqandHaitangtaketurnsperformingthefollowingoperations,withdXqwqgoingfirst:Findapair\(\textstyle(x,y)\)suchthat\(\textstylex,y\inS\)and\(\textstyle\gcd(x,y......
  • ρars/ey 题解
    给个链接:ρars/ey。我们考虑一个树上背包。设\(f_{u,i}\)表示在\(u\)号节点的子树内删除\(i\)个点的最小代价。显然有答案为\(f_{1,siz_1-1}\)。接下来我们考虑转移。看这一张图:这里红圈内的东西为当前的\(siz_u\),绿圈部分为\(siz_j\)。我们枚举\(x\)为\(u\)子......
  • CF1514D Cut and Stick 题解
    不知道会不会更不好的阅读体验题目的关键步骤为求出区间绝对众数(频率高于\(\left\lceil\frac{len}{2}\right\rceil\))的出现次数,本文仅仅对这一问题进行探讨,剩余的解题步骤不难理解,可以参考其他题解。解法1考虑一个随机化的解法,从区间中随\(40\)个数,假定其为区间绝对众......
  • 电话号码转换 - 华为机试真题题解(Java)
    考试平台:时习知分值:200分(第二题)考试时间:两小时(共2题)题目描述将电话号码转换,需要实现如下的中英文电话号码转换:输入的字符串中每个数字对应为中文数字中的英文单词,如Double表示两个数字相同。将输入的中文数字字符串转换为英文单词的电话号码。若输入不合法,则输出......
  • 图片表格内容识别转换-II - 华为机试真题题解(Java)
    考试平台:时习知分值:200分考试时间:两小时(共2题)题目描述华为云推出了“通用表格识别”服务,可以将图片表格转换成文本数据。请你将文本数据进一步转换为“文本型表格”,如下图所示:输入现给出一个图片表格的文本数据:每行数据形如line3col1A,表示第3行第1列的单......
  • 20240808题解
    话说T2写了个动态树结果考场调不出来,这下大炮打蚊子了。森林(forest)题面:符合条件的森林中深度相同的点度数相同,\(1\lei\len\),求点数为\(i\)的符合条件的森林的种类数。题解:将森林中每一个根节点连到同一个节点上变成一棵树。令\(f(i)\)表示符合条件的树的种类数,那么\(f(i......
  • SSY20240805提高组T2题解
    题干描述题目描述给定一个长度为......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......