传送门

首先考虑暴力M^2dp,考虑回文串是可以从回文中心每次在两边拓展的,设\(f_{i,j}\)为\(i\)到\(j\)的路径是否是回文串,bfs转移,枚举两点出边,如果两个新端点颜色相同就更新

然后这个大暴力可以优化到70',就是先枚举一端的相邻的点,然后注意到因为固定了那个相邻的点,对应的另一个用来拓展的端点个数是\(O(n)\)的,然后转移是\(O(m)\)的,所以总复杂度为\(O(nm)\)

然后考虑减少边数.对于一个同色的连通块,如果这个连通块是二分图,那么我们只要保留它的一个生成树就好了,因为对于一端在上面的子路径,在生成树上可以使用反复横跳走出同奇偶的子路径(另一边也同理),并且不会影响答案;如果不是二分图,那么就有奇环,有奇环就可以改变路径长度奇偶性,所以在生成树上加一个自环就行了.然后对于每条边两端颜色不同的连通块,显然是二分图,根据上面的道理,保留生成树就行了.然后在新图上跑dp,就是\(O(n^2)\)了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db doubleusing namespace std;
const int N=5000+10,M=500000+10;
int rd()
{int x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
struct graph
{int to[M<<1],nt[M<<1],hd[N],tot;void add(int x,int y){++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot;}
}e,ee;
int n,m,q,ff[N];
int findf(int x){return ff[x]==x?x:ff[x]=findf(ff[x]);}
bool ng[N][N],co[N],inq[N],bg[N];
int vc[N];
char cc[N];
struct node
{int x,y;
};
queue<int> qq;
queue<node> qu;int main()
{e.tot=ee.tot=1;n=rd(),m=rd(),q=rd();scanf("%s",cc+1);for(int i=1;i<=n;++i) ff[i]=i,bg[i]=1,co[i]=cc[i]-'0',ng[i][i]=1,qu.push((node){i,i});for(int i=1;i<=m;++i){int x=rd(),y=rd();e.add(x,y);if(co[x]==co[y]) ff[findf(y)]=findf(x),ng[x][y]=ng[y][x]=1,qu.push((node){x,y});}memset(vc,-1,sizeof(vc));for(int i=1;i<=n;++i)if(findf(i)==i) inq[i]=1,qq.push(i);while(!qq.empty()){int x=qq.front();qq.pop();bool v0=0,v1=0;for(int i=e.hd[x];i;i=e.nt[i]){int y=e.to[i];if(co[x]!=co[y]) continue;if(inq[y]) v0|=!vc[y],v1|=vc[y];else vc[y]=!vc[x],ee.add(x,y),inq[y]=1,qq.push(y);}if(v0&&v1) bg[findf(x)]=0;}for(int i=1;i<=n;++i)if(findf(i)==i&&!bg[i]) ee.add(i,i);for(int i=1;i<=n;++i) ff[i]=i;for(int i=2;i<=e.tot;i+=2){int x=e.to[i],y=e.to[i^1];if(co[x]!=co[y]&&findf(x)!=findf(y)) ee.add(x,y),ff[findf(y)]=findf(x);}while(!qu.empty()){int x=qu.front().x,y=qu.front().y;qu.pop();for(int i=ee.hd[x];i;i=ee.nt[i]){int xx=ee.to[i];for(int j=ee.hd[y];j;j=ee.nt[j]){int yy=ee.to[j];if(co[xx]==co[yy]&&!ng[xx][yy]) ng[xx][yy]=ng[yy][xx]=1,qu.push((node){xx,yy});}}}while(q--) ng[rd()][rd()]?puts("YES"):puts("NO");return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/10712932.html

luogu P5292 [HNOI2019]校园旅行相关推荐

  1. [HNOI2019]校园旅行

    题目 过于神仙啊,抄题解.jpg 首先\(n\)并不是很大啊,我们可以直接用\(f_{i,j}\)表示\(i\)到\(j\)是否存在一个回文路径 对于一条回文路径,如果在两端分别添加一个相同的字符,那 ...

  2. luogu P1027 Car的旅行路线

    题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...

  3. luogu P5286 [HNOI2019]鱼

    传送门 这题真的牛皮,还好考场没去刚( 这题口胡起来真的简单 首先枚举D点,然后对其他所有点按极角排序,同时记录到D的距离.然后按照极角序枚举A,那么鱼尾的两个点的极角范围就是A关于D对称的那个向量, ...

  4. Luogu P5416 [CTSC2016]时空旅行

    题目 简化题意:你需要维护\(n\)个集合,集合元素为二元组\((x,v)\).集合\(i\)的产生方式是以某个原有集合\(p_i\)为样本,扩展或删除一个元素后得到新集合.有\(q\)次询问,每次给 ...

  5. 【HNOI2019】部分题简要题解

    题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...

  6. 项目评测(共27组)

    第一组:生活日历 1.界面设计绿色和蓝色配比需要提升,界面风格不太统一 2.日历日程和账单功能基本实现 3.模拟机展示输入功能不太完善,其真机调试情况不明 4.可以仿照闹钟,设置事件提醒 第二组:计一 ...

  7. 星辰小组——第一阶段评分+各小组的意见反馈

    日期:2019.5.27 博客期:085 星期一 今天我们终于完成了对于冲刺第一阶段的小组成员评分! 评分结果如下: 用户评价 1. 第一组(oneteam,生活日历):app开发.以日历作为核心功能 ...

  8. pmp访谈法和焦点小组区别_时间,空间和访谈

    pmp访谈法和焦点小组区别 像大多数软件公司一样,Microsoft几乎所有的技术面试都涉及某种编码问题. 在那期间,我遇到了许多不同的问题. 它们通常都具有您可以很好地讨论一般问题空间,设计解决方案 ...

  9. 只有高中学历的我是怎样加入谷歌的?

    昨天谷歌 AlphaGo 战胜了围棋顶尖高手还是出乎很多人意料之外,相信大家都被刷屏了,朋友圈久久不能平复,今天就不谈围棋,谈人生.本文是讲了一个有趣的个人经历,一个高中生学历的人通过自己努力成为谷歌 ...

最新文章

  1. Java 高并发面试题
  2. Angular 富文本编辑之路的探索
  3. TensorFlow 1.13.0 正式发布,谷歌开源的机器学习框架
  4. SDUT—2054数据结构实验之链表九:双向链表 (基本建立)
  5. python中接口测试垃圾数据如何清理_接口测试---Python数据处理需要注意的细节
  6. cout、cerr、clog
  7. ES5数组一些常用的方法源码实现
  8. java基础学习(一)hashcode
  9. Python中的模块和包:模块的(动态)导入、__future__模块使用
  10. 流畅和稳定的API的Lambda
  11. 美团面试题 | JVM 堆内存溢出后,其他线程是否可继续工作?
  12. kali linux改中文_【亲测实验】kali linux 2020 设置为中文方法
  13. 联想打印机 linux驱动怎么安装步骤,如何在MAC系统下安装打印机驱动
  14. BOMRemover v2.0 去除代码中的UTF-8 BOM
  15. KMeans 算法(一)
  16. 多元线性模型的分位数回归
  17. 第二工业大学计算机应用大专录取分,二工大| 2018年上海第二工业大学专科层次依法自主招生各专业最低录取分数线...
  18. Apache端口被占用的解决方法
  19. 公众号运营的小伙伴们看过来啦!
  20. ubuntu更换源(清华、中科大、阿里)

热门文章

  1. pygame (1) 移动小乌龟
  2. eclipse 插件开发过程中遇到的一堆问题(急待解决)
  3. dbc2000找不到服务器控制台,控制面板没有BDE Administrator(安装好DBC2000找不到)
  4. mysql中Bname表示什么_《MY SQL实用教程》期末考试题
  5. DPDK pci驱动探测(十八)
  6. 常见网络加速技术浅谈(二)
  7. leetcode算法题--两两交换链表中的节点★
  8. leetcode算法题--整数拆分
  9. java商品搜索功能_利用solr实现商品的搜索功能(实例讲解)
  10. ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法