非常妙的一道思博题啊,不愧是myy出的题

首先我们考虑一个暴力DP,直接开一个数组\(f_{i,j}\)表示\(i\to j\)的路径能否构成回文串

考虑直接拿一个队列来转移,队列里存的都是\(f_{i,j}=1\)的点对,然后每次枚举两边的边更新答案并扩展即可

但是这样的复杂度是\(O(m^2)\)的,不够优秀。我们发现其实这种方法的复杂度瓶颈在于有很多无用边导致我们浪费了复杂度,因此我们考虑删去一些边

我们首先在原图上把所有同色点间的边连起来,由于每个点可以经过任意次,因此我们只需要考虑奇偶性

那么什么时候能让到一个点的奇偶性改变呢?其实很简单,就是存在奇环

我们再进一步思考,如果一个图没有奇环,那么它就是二分图,而二分图的一个生成树显然也满足如上的性质

那么也就意味着,如果此时构成的图是二分图,那么我们求出它的生成树即可

但是如果不是呢,其实也很简单,我们考虑最简单的奇环是什么,其实就是自环

所以这种情况我们可以直接找一个点给它连一个自环帮助转移即可

那么剩下的只有异色点之间的边了,这个由于它都帮你染色好了,所以必然是二分图,直接求生成树即可

综上,此时的边数只有\(O(n)\)级别,因此总复杂度就是\(O(n^2)\)

CODE

#include<cstdio>
#include<utility>
#include<cstring>
#define RI register int
#define CI const int&
#define Ms(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=5005,M=500005;
typedef pair <int,int> pi;
struct edge
{
int to,nxt;
}e[M<<1],ne[M<<1]; bool f[N][N],flag; pi q[N*N];
char s[N]; int n,m,t,H,T,head[N],nhead[N],cnt,x,y,col[N];
inline void addedge(CI x,CI y)
{
e[++cnt]=(edge){y,head[x]}; head[x]=cnt;
e[++cnt]=(edge){x,head[y]}; head[y]=cnt;
}
inline void nadd(CI x,CI y)
{
ne[++cnt]=(edge){y,nhead[x]}; nhead[x]=cnt;
}
inline void push(CI x,CI y)
{
f[x][y]=f[y][x]=1; q[++T]=make_pair(x,y);
}
#define to e[i].to
inline void DFS(CI now,CI tp)
{
for (RI i=head[now];i;i=e[i].nxt) if ((s[now]==s[to])==tp)
{
if (~col[to]) { if (col[to]==col[now]) flag=0; }
else col[to]=col[now]^1,DFS(to,tp),nadd(now,to),nadd(to,now);
}
}
#undef to
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
RI i,j; for (scanf("%d%d%d%s",&n,&m,&t,s+1),i=1;i<=m;++i)
scanf("%d%d",&x,&y),addedge(x,y),s[x]==s[y]&&(push(x,y),0); cnt=0; Ms(col,-1);
for (i=1;i<=n;++i) if (!~col[i]&&(col[i]=flag=1,DFS(i,1),!flag)) nadd(i,i);
for (Ms(col,-1),i=1;i<=n;++i) if (!~col[i]) col[i]=1,DFS(i,0);
for (i=1;i<=n;++i) push(i,i); while (H<T)
{
++H; int x=q[H].first,y=q[H].second;
for (i=nhead[x];i;i=ne[i].nxt) for (j=nhead[y];j;j=ne[j].nxt)
if (s[ne[i].to]==s[ne[j].to]&&!f[ne[i].to][ne[j].to]) push(ne[i].to,ne[j].to);
}
while (t--) scanf("%d%d",&x,&y),puts(f[x][y]?"YES":"NO"); return 0;
}

Luogu P5292 [HNOI2019]校园旅行的更多相关文章

  1. 洛谷P5292 [HNOI2019]校园旅行(二分图+最短路)

    题面 传送门 题解 如果暴力的话,我们可以把所有的二元组全都扔进一个队列里,然后每次往两边更新同色点,这样的话复杂度是\(O(m^2)\) 怎么优化呢? 对于一个同色联通块,如果它是一个二分图,我们只 ...

  2. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  3. [HNOI2019]校园旅行(构造+生成树+动规)

    题目 [HNOI2019]校园旅行 做法 最朴素的做法就是点对扩展\(O(m^2)\) 发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的 单独看一个颜色的联通块,如果是二分图,我们 ...

  4. [HNOI2019]校园旅行

    题意 https://www.luogu.org/problemnew/show/P5292 思考 最朴素的想法,从可行的二元组(u,v)向外拓展,及u的出边所指的颜色与v的出边所指的颜色若相同,继续 ...

  5. [LOJ3057] [HNOI2019] 校园旅行

    题目链接 LOJ:https://loj.ac/problem/3057 洛谷:https://www.luogu.org/problemnew/show/P5292 Solution 先膜一发\(m ...

  6. 【洛谷5292】[HNOI2019] 校园旅行(思维DP)

    点此看题面 大致题意: 给你一张无向图,每个点权值为\(0\)或\(1\),多组询问两点之间是否存在一条回文路径. 暴力\(DP\) 首先,看到\(n\)如此之小(\(n\le5000\)),便容易想 ...

  7. bzoj5492:[Hnoi2019]校园旅行

    传送门 %%%myy 考虑30分做法:暴力bfs,\(f[i][j]\)表示\(i\)到\(j\)可以形成回文串 然而为什么我场上只想到了70分做法,完全没想到30分怎么写.. 100分: 考虑缩边, ...

  8. [HNOI2019]校园旅行(建图优化+bfs)

    30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...

  9. Loj #3057. 「HNOI2019」校园旅行

    Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...

随机推荐

  1. javascript中的"x != x"

    在javascript的运用中,经常遇到判断两个 对象/值 是否相等的情况.有些表明上看着一样,其实他们不一样.有些特殊情况,需要我们辨别. 引用类型 他们都是引用类型,存储的空间将从堆中分配.变量处 ...

  2. JS中清空字符串前后空格

    在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 .  所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ...

  3. posix,perl正则表达式区别

    1.正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用来描述或者匹配一系列符合 ...

  4. xp开机黑屏故障分析

    今天装完xp系统之后,重启开机发现竟然黑屏了,查资料发现有很多用户在修改分辨率后,因显示器不支持修改后的分辨率,会出现电脑黑屏的情况.分辨率调高了,超出了屏幕的范围,肯定会黑屏,而且这个问题还挺麻烦, ...

  5. 深入css布局篇(1) — 盒模型 & 元素分类

    深入css布局(1)-- 盒模型 & 元素分类     " 在css知识体系中,除了css选择器,样式属性等基础知识外,css布局相关的知识才是css比较核心和重要的点.今天我们来深 ...

  6. 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署

    前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: PostgreSQL. 虽然centos自带版本9.2也可以用,但是最近的几次 ...

  7. 单例模式--java代码实现

    单例模式 单例模式,顾名思义,在程序运行中,实例化某个类时只实例化一次,即只有一个实例对象存在.例如在古代,一个国家只能有一个皇帝,在现代则是主席或总统等. 在Java语言中单例模式有以下实现方式 1 ...

  8. java 理解如何实现图片验证码 傻瓜都能看懂。

    先代码后解释: 只要把代码复制到你的项目中就可以了. 代码: 验证码工具类: package cn.happy.util.imagesVerTion; /** * Author: SamGroves ...

  9. (翻译)W3C的Turtle文档

    主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助. 1 简介 2 Turtle语言 2.1 ...

  10. 女皇武则天:我不愿被 extends

    01. 利用继承,我们可以基于已存在的类构造一个新类.继承的好处在于,子类可以复用父类的非 private 的方法和非 private 成员变量. is-a 是继承的一个明显特征,就是说子类的对象引用 ...