首页 > 其他分享 >清北学堂day2

清北学堂day2

时间:2022-11-17 16:55:51浏览次数:32  
标签:10 putin idx int 样例 day2 leq 学堂 清北

今晚

题目内容:

给定一张 \(n\) 个点 \(m\) 条边的有向图 \(G\) 。

有 \(n\) 个硬币。初始时有的正面朝上,有的反面朝上。每次你可以手动翻转一枚。

如果在 \(G\) 中有边 \(a\rightarrow b\) ,那么当第 \(a\) 枚硬币(被手动或自动)翻转后,第 \(b\) 枚也会被自动翻转。注意:它可以传递下去。

但如果你手动翻转某一枚后会触发无限次操作,那波特就直接炸了,你不能使其触发这种情况。

给定初始每个硬币的状态,求至少操作多少次后能使所有硬币都正面朝上。

无解输出 -1 。

输入格式:

n m
x_1,x_2,x_3,...,x_n (表示每枚硬币的状态,1表示正面朝上,0表示反面朝上)
a_1 b_1 (表示一条有向边a_1->b_1,下同)
a_2 b_1
a_3 b_3
......
a_n b_n

输出格式:

一行一个整数,表示答案。

样例1:

putin:

5 10
0 0 0 0 0
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

putout:

3

样例2:

putin:

3 3
0 0 0
1 2
2 3
3 1

putout:

-1

提示:

对于 \(30\%\) 的数据,\(n,m\leq 10\) 。

对于 \(50\%\) 的数据,\(n,m\leq 3000\) 。

对于 \(80\%\) 的数据,\(n,m\leq 10^5\) 。

对于 \(100\%\) 的数据,\(n,m\leq 5\times 10^5\) 。


考场上想复杂了这个最小次数真的很误导人
其实就是简单的拓扑记下每个点累计的反转次数
奇数的反转次数才是真的会反转
这个题主要是要在判环上注意一下
对于这种情况要先跑一下反图看是不是遍历不到的点都是正面
如果不是则输出\(-1\)(推一下即可)
如果都是\(1\)
则可以重建图(只包含上能便利到的点)
再跑\(topo\)就行

std:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+9;
int n,m,ans;
bool a[N];
int h[N],ver[N],ne[N],idx;
int ind[N];
void add(int u,int v)
{
    idx++,ver[idx] = v,ne[idx] = h[u];h[u] = idx;
}

struct E
{
    int u,v;
}e[N];
bool b[N]; 
queue<int> q;
int f[N];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i++)scanf("%d",&a[i]);
    for(int i = 1;i <= m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        e[i].u = u,e[i].v = v;
        add(v,u);
        ind[u]++;
    }

    for(int i = 1;i <= n;i++)
        if(!ind[i])q.push(i);

    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(int i = h[u];i;i = ne[i])
        {
            int v = ver[i];
            if(!--ind[v])q.push(v);
        }
    }

    for(int i = 1;i <= n;i++)
    {
        if(ind[i])
        {
            if(!a[i])return printf("-1"),0;
            b[i] = 1;
        }
    }
    memset(h,0,sizeof h);
    idx = 0;
    memset(ind,0,sizeof ind);
    for(int i = 1;i <= m;i++)if(!b[e[i].u]&&!b[e[i].v])add(e[i].u,e[i].v),ind[e[i].v]++;
    for(int i = 1;i <= n;i++)
        if(!ind[i])q.push(i);
    while(!q.empty())
    {
        int u = q.front();
        if(f[u]%2)a[u] ^= 1;
        if(!a[u])f[u]++,ans++;
        q.pop();
        for(int i = h[u];i;i = ne[i])
        {
            int v = ver[i];
            f[v] += f[u];
            if(!--ind[v])q.push(v);
        }
    }
    
    printf("%d",ans);
    return 0;
}

九点

题目内容:

你需要构造一个 \(1\) 到 \(n\) 的排列 \(p\) 。

有 \(m\) 条限制,每条限制有两个参数 \(x,y\) ,你要保证 \(p_x=y\) 或 \(p_y=x\) 。

求总方案数对 \(998244353\) 取模的结果。

输入格式:

\(n\) \(m\)
\(x_1\) \(y_1\)
\(x_2\) \(y_2\)
\(x_3\) \(y_3\)
\(......\)
\(x_m\) \(y_m\)

输出格式:

一行一个整数,表示答案。

样例1

putin

5 5
1 2
3 4
3 4
5 3
4 5

putout

2

样例2

putin

4 3
1 2
3 4
4 4

putout

0

提示:

对于 \(30\%\) 的数据,\(n,m\leq 10\) 。

对于 \(60\%\) 的数据,\(n,m\leq 2000\) 。

对于 \(100\%\) 的数据,\(n,m\leq 5\times 10^5\) 。


标签:10,putin,idx,int,样例,day2,leq,学堂,清北
From: https://www.cnblogs.com/AC7-/p/16900002.html

相关文章

  • 代码随想录Day25
    LeetCode404.左叶子之和计算给定二叉树的所有左叶子之和。   思路:首先由于计算左叶子之和,所以遍历的顺序一定是左在前,选用左右中的后续遍历进行递归比较合适。......
  • day27 -选择器完
    层次选择器选择全部*p{}所有该属性标签都会改变样式 1p{2background:#15f50c;3} 后代选择器选择某一项的后代所有的该元素都改变样式 1后代选......
  • 代码随想录Day24
    LeetCode257二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:思路:终止逻辑:走到叶子节点,所以原本终止......
  • day26 - 基本选择器
    基本选择器标签选择器标签选择器会选择页面上所有这种类型的标签在title下定义<style>标签名称{定义1...定义2...}1<!DOCTYPEhtml>2<htmllang="en">......
  • 代码随想录Day23
    LeetCode110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。......
  • day25- html表单学习
    表单<form表示一些操作:action:表单提交的位置,可以是一个网站也考研时一个请求处理的地址method:post,get提交方式get方式:在url中可以看见提交的信息,不安全但是很方便pos......
  • B站 MySQL 陈长宏老师讲课笔记day2
    B站MySQL数据库视频1.DQL查询语句的使用1)排序查询 语法:orderby字句 orderby排序字段1排序方式1,排序字段2排序方式2......  排序方式:   ASC:升序,......
  • 蓝桥杯_每日一题Day2
    12届蓝桥杯第五题:输入描述:输入三个正整数X,Y,M(X<Y<M),X和Y表示有毒气密室编号,M表示需要进入的密室编号,且三个正整数之间以英文逗号隔开,每次可前进一间或两间密室(非毒气)输出描......
  • day20221110今天学了什么?前端学习网站
    零基础开始学Web前端开发,有什么建议吗?-瑾瑜的回答-知乎https://www.zhihu.com/question/19637373/answer/2434134730前端学习路线(推荐视频)-前端小通的文章-知......
  • day2 java基础语法
    day1复习1.java的特点  2.jdk,jre,jvm的关系  3.为什么要配置path 基本语法1.关键字与保留字    2.标识符与标识符规则  3.java的命名规范 ......