为什么不搞\(T2\)???

因为我太菜了,那题我是真的搞不出来

题目描述

链接:https://ac.nowcoder.com/acm/contest/1100/C

来源:牛客网

小\(w\)喜欢打牌,某天小\(w\)与\(dogenya\)在一起玩扑克牌,这种扑克牌的面值都在\(1\)到\(n\),原本扑克牌只有一面,而小\(w\)手中的扑克牌是双面的魔术扑克(正反两面均有数字,可以随时进行切换),小\(w\)这个人就准备用它来出老千作弊。小\(w\)想要打出一些顺子,我们定义打出一个\(l\)到\(r\)的顺子需要面值为从\(l\)到\(r\)的卡牌各一张。小\(w\)想问问你,他能否利用手中的魔术卡牌打出这些顺子呢?

输入描述:

首先输入一行2个正整数\(n\),\(k\),表示牌面为\(1\)~\(n\),小\(w\)手中有\(k\)张魔术扑克牌。

然后输入\(k\)行,每行两个数字,表示卡牌的正面和反面的面值。

接下来输入一行一个正整数\(q\),表示\(q\)组查询,然后每组占一行查询输入两个整数\(l\),\(r\)。表示查询小\(w\)能否打出这么一个\(l\)到\(r\)的顺子。

输出描述:

对于输出"\(Yes\)"表示可以,"\(No\)"表示不可以。(不含引号)

每个查询都是独立的,查询之间互不影响。

题解

我在考试的时候看出来这是个图了,也想过正反面连边了,但是一些操作没想到,这题还是没能搞出来……

首先我们可以考虑一个事儿,就是我们不判自环重边的时候,有几张牌,就会连几条边

那一个数字可以使用的要求是什么呢,就是它的出度不为零(无向图

因为我们每张牌的正反面都要互相连边,假如说某个数字的出度为零,那么就说明这个数字没有在任意一张牌上出现过

那么我们就可以想到连完边以后,看一下图中各个连通块里有多少条边,就可以知道包含这个连通块里的某数字的牌一共有几张

举个栗子:

我们有三张牌,第一张两面是\(1,2\),第二张是\(2,3\),第三张是\(4,4\)

我们先找\(1\)所在连通块有几条边几个点,发现有两条边三个点,那么就说明只有两张牌包含这三个数字,这三个数字就一定不能同时出现

此时如果我们再加一张\(1,3\)的牌,就可以了

那么我们就可以发现,如果一个连通块是一棵树,那么它包含的数字一定不可能同时出现

我们就可以判一下有几个连通块是树

我们再考虑一个事儿,树上的数字一定不能被使用吗?

不是,只要我们不同时选用树上的所有点就可以使用

那么我们就可以记录一下每个树里的最大值和最小值,如果有一个顺子包含最小值,那么它不能包含最大值,否则它一定包含整棵树

如果一个顺子不包含最小值,那么这个连通块里的数字我们随便用

所以我们可以设一个数组\(r[i]\),记录以\(i\)为最小值的树的最大值是多少

从头到尾扫一遍每个查询区间,看有没有出现\(r[i]\)小于等于右端点的情况

我最后还特判了一下是不是每张牌的正反面都相等,不然找连通块会炸

可能是我的代码常数太大???反正别人做法跟我一样但是不用特判

话说考场上这题默认正反面相同写个暴力能拿50分……

宁康康代码:

#include<bits/stdc++.h>
using namespace std;
#define rint register int
int n, q, k, cnt, tag, b, minn, maxn, num, nump;
int head[100010], r[100010], vis[100010], t[100010], add[100010];
struct edge{
int nxt, to;
}a[200010];
inline void addedge( int x, int y ){
a[++cnt].nxt = head[x];
a[cnt].to = y;
head[x] = cnt;
}
inline int read( void ){
int re = 0, f = 1; char ch = getchar();
while( ch > '9' || ch < '0' ){
if( ch == '-' ) f = -1;
ch = getchar();
}
while( ch >= '0' && ch <= '9' ){
re = re * 10 + ch - '0';
ch = getchar();
}
return re * f;
}
inline void dfs( int now, int fa ){
maxn = max( maxn, now );
minn = min( minn, now );
vis[now] = 1;
nump++;
for( rint i = head[now]; i; i = a[i].nxt ){
int v = a[i].to; num++;
if( v == fa || vis[v] ) continue ;
dfs( v, now );
}
}
int main( void ){
n = read(); k = read();
for( rint i = 1; i <= k; i++ ){
int u, v; u = read(); v = read();
addedge( u, v ); addedge( v, u );
t[u] = 1; t[v] = 1;
if( u != v ) b = 1;
}
memset( r, 0x3f, sizeof( r ) );
if( !b ){
for( rint i = 1; i <= n; i++ ) add[i] = add[i - 1] + t[i];
q = read();
for( rint i = 1; i <= q; i++ ){
int u, v; u = read(); v = read();
if( add[v] - add[u] == v - u ) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
for( rint i = 1; i <= n; i++ ){
if( !vis[i] ){
maxn = 0, minn = 0x3f3f3f3f;
num = 0; nump = 0;
dfs( i, i );
if( num / 2 < nump ){
r[minn] = maxn;
}
}
}
q = read();
//for( rint i = 1; i <= n; i++ ) cout << r[i] << ' ';
for( rint i = 1; i <= q; i++ ){
tag = 0;
int u, v; u = read(); v = read();
for( rint j = u; j <= v; j++ ){
if( r[j] <= v ){
cout << "No" << endl;
tag = 1; break;
}
}
if( !tag ) cout << "Yes" << endl;
}
return 0;
}

Day1T3小w的魔术扑克——图论的更多相关文章

  1. 【牛客】小w的魔术扑克 (并查集?? 树状数组)

    题目描述 小w喜欢打牌,某天小w与dogenya在一起玩扑克牌,这种扑克牌的面值都在1到n,原本扑克牌只有一面,而小w手中的扑克牌是双面的魔术扑克(正反两面均有数字,可以随时进行切换),小w这个人就准 ...

  2. [CSP-S模拟测试]:小W的魔术(数学 or 找规律)

    题目传送门(内部题130) 输入格式 第一行一个整数$n$,表示字符串的长度. 第二行一个只包含小写字母的字符串$s$. 输出格式 一行一个整数表示答案对$998244353$取模后的结果. 样例 样 ...

  3. 【JZOJ6389】小w学图论

    description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节 ...

  4. XidianOJ 1076 小W喜欢的数字

    题目描述 大家都知道,小W是一名大帅哥,当然比起Light还是有点儿差距的!帅气的小W认为0-9这些数字,只有1,3,5是完美的. 欲问小W为什么,小W总是说"帅哥,是不需要解释的" ...

  5. 武汉科技大学ACM :1008: 小t和小w

    Problem Description 小t最近学了C语言,他想要在女朋友小w面前展示一下自己的能力,小w喜欢如样例所示的图形, 想让小t写一个程序来输出这样的图形,小t拿到后感觉有点困难,小t不想在 ...

  6. bzoj4665小w的喜糖 dp+容斥

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 72[Submit][Status][Discuss] ...

  7. bzoj4665 小w的喜糖(dp+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 130[Submit][Status][Discuss ...

  8. bzoj2441【中山市选】小W的问题

    题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...

  9. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

随机推荐

  1. shell-变量学习-01

    1.变量   1.1 变量赋值 > variable_zhou="hello world!" #等号两边不能有空格   1.2 使用变量 > echo $variabl ...

  2. RxJava操作符实践:8_算术和聚合操作之3_min

    发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...

  3. ES6下的Function.bind方法

    在JavaScript的使用中,this的指向问题始终是一个难点.不同的调用方式,会使this指向不同的对象.而使用call,apply,bind等方式,可改变this的指向,完成一些令人惊叹的黑魔法 ...

  4. SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理

    SpringMVC的异常处理,SimpleMappingExceptionResolver只能简单的处理异常 当发生异常的时候,根据发生的异常类型跳转到指定的页面来显示异常信息 ExceptionCo ...

  5. rancher1.6高可用集群搭建

    rancher高可用集群搭建 一.搭建环境 1.安装系统 下载centos最新版, http://mirrors.sohu.com/centos/7/isos/x86_64/CentOS-7-x86_ ...

  6. 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫

    爬虫抓取数据时有些数据是动态数据,例如是用js动态加载的,使用普通的urllib2 抓取数据是找不到相关数据的,这是爬虫初学者在使用的过程中,最容易发生的情况,明明在浏览器里有相应的信息,但是在pyt ...

  7. 如何进行Web服务的性能测试

         涉及到web服务的功能在不断的增加,对于我们测试来说,我们不仅要保证服务端功能的正确性,也要验证服务端程序的性能是否符合要求.那么性能测试都要做些什么呢?我们该怎样进行性能测试呢? 性能测试 ...

  8. 手工创建 efi,msr 分区 · Virgil Chan

    昨天在帮同学装 win10 的时候,不小心(不知道那是什么东西)把原系统的 efi 和 msr 盘删了,用 WinNTsetup 安装时 EFI PART 总显示红叉,安装后也进不去系统,想想应该是找 ...

  9. LISTAGG函数

    官网进入 该函数作用是可以实现对列值得拼接: 根据官网介绍,可以对列值排序进行拼接,也可以分组拼接 1.1运行结果 1.2运行结果 2运行结果 注意该函数提供的 over( partition by ...

  10. JMeter接口测试-计数器

    前言 在测试注册接口的时候,需要批量注册账号时,每注册一个并且需要随时去修改数据,比较繁琐,除了使用随机函数生成账号,我们还可以使用计数器来进行批量注册. 一:添加配置元件-计数器 二:注册10个账号 ...