啥都想不出来的我是不是废了/dk

这道题考的主要是构造 而我想的主要是乱搞。

一个很假很假的做法:直接暴力4种颜色染色 我也不知道对不对。。 不过成功的话一定是对的。

然后考虑奇环的问题 一个很假很假的做法 建立出dfs树然后 然后利用返祖边+倍增做奇环的问题 主要考察环上所有的点的入度都>2。

显然 很多环都没有被便利到 所以这个做法是很假的。

好像多random几次能A?当然不行!接下来是否联通也存在问题 这个做法假死了 当然如果不嫌麻烦可以check且再次随机 暴力出奇迹嘛~!

然而水到了60

考虑正解 容易想到正解一定是两种解其中的一个 第一个解没有什么好的处理方法。

考虑奇环->二分图 那么其实我们可以先随便找到一棵树 然后先保证联通看剩下的东西是否是一个二分图。

如果不是 那么就存在奇环了 去掉且此时是联通的 如果不存在显然树可以用两个颜色染色 二分图也是如此 那么四颜色染色就派上用场了。

所以这个问题是一定有解的 至此问题得到解决。

考虑选取的树不同是否对答案造成影响 显然不会 因为这种构造方法使得什么情况都有解。

我也只能甘拜下风了。。

bf code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 10000000000000010ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-8
#define sq sqrt
#define S second
#define F first
#define mod 998244353
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=((ll)x*10+ch-'0')%mod;ch=getc();}
return x*f;
}
const int MAXN=300010,maxn=100010;
int n,m,ans,len,flag,cnt,top;
int vis[MAXN],c[MAXN],col[5],ans1[MAXN],dfn[MAXN],f[MAXN][20],Log[MAXN],g[MAXN][20],ru[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],d[MAXN];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
++ru[x];
}
inline void dfs(int x)
{
if(flag)return;
vis[x]=1;col[1]=col[2]=col[3]=col[4]=0;
go(x)++col[c[tn]];
int ww=1;while(ww<=4&&col[ww])++ww;
if(ww<=4)c[x]=ww;else {flag=1;return;}
go(x)if(!vis[tn])dfs(tn);
}
inline void dfs1(int x,int fa)//建立dfs树.
{
dfn[x]=++cnt;d[x]=d[fa]+1;
f[x][0]=fa;g[x][0]=ru[x];
rep(1,Log[d[x]],i)
{
f[x][i]=f[f[x][i-1]][i-1];
g[x][i]=min(g[x][i-1],g[f[x][i-1]][i-1]);
}
go(x)if(!dfn[tn])dfs1(tn,x);
}
inline int check(int x,int y)
{
int mx=ru[x];
fep(Log[d[x]],0,i)if(d[f[x][i]]>=d[y])mx=min(mx,g[x][i]),x=f[x][i];
return mx>2;
}
inline void dp(int x)
{
//if(top)return;
go(x)
{
if(dfn[tn]<dfn[x])
{
if(top)continue;
if((d[x]-d[tn]+1)&1)
{
if(check(x,tn))
{
int ww=x;
ans1[++top]=x;
while(ww!=tn)
{
ans1[++top]=f[ww][0];
ww=f[ww][0];
}
}
}
}
else if(dfn[tn]==dfn[x]+1)dp(tn);
}
}
int main()
{
freopen("g.in","r",stdin);
freopen("g.out","w",stdout);
get(n);get(m);
rep(1,m,i)
{
int get(x),get(y);
add(x,y);add(y,x);
}
dfs(1);
if(!flag)
{
printf("A");
rep(1,n,i)printf(" %d",c[i]);
return 0;
}
else
{
rep(2,n,i)Log[i]=Log[i>>1]+1;
dfs1(1,0);
dp(1);
if(top)
{
printf("B");printf(" %d",top);
rep(1,top,i)printf(" %d",ans1[i]);
return 0;
}
puts("wxh ak ioi2019");
}
return 0;
}
sol code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 10000000000000010ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-8
#define sq sqrt
#define S second
#define F first
#define mod 998244353
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=((ll)x*10+ch-'0')%mod;ch=getc();}
return x*f;
}
const int MAXN=300010,maxn=100010;
int n,m,ans,len=1,flag,cnt,top,A,B;
int vis[MAXN],c1[MAXN],c2[MAXN],mark[MAXN<<1];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],ans1[MAXN],f[MAXN];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void dfs(int x)
{
vis[x]=1;
go(x)
{
if(vis[tn])continue;
mark[i]=mark[i^1]=1;
c1[tn]=c1[x]^1;
dfs(tn);
}
}
inline void dfs1(int x)
{
vis[x]=1;
go(x)
{
if(mark[i])continue;
if(!vis[tn])
{
c2[tn]=c2[x]^1;
f[tn]=x;dfs1(tn);
}
else if(c2[tn]==c2[x]){A=tn,B=x;flag=1;}
}
}
int main()
{
freopen("g.in","r",stdin);
freopen("g.out","w",stdout);
get(n);get(m);
rep(1,m,i)
{
int get(x),get(y);
add(x,y);add(y,x);
}
dfs(1);
memset(vis,0,sizeof(vis));
rep(1,n,i)if(!vis[i])dfs1(i);
if(!flag)
{
printf("A");
rep(1,n,i)printf(" %d",c1[i]*2+c2[i]+1);
return 0;
}
else
{
printf("B");
for(int i=A;i!=B;i=f[i])ans1[++top]=i;
ans1[++top]=B;
printf(" %d",top);
rep(1,top,i)printf(" %d",ans1[i]);
return 0;
}
puts("wxh ak ioi2019");
return 0;
}

7.9 NOI模拟赛 A.图 构造 dfs树 二分图的更多相关文章

  1. 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径

    LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...

  2. CJOJ 1943 【重庆八中模拟赛】寻找代表元(二分图最大匹配)

    CJOJ 1943 [重庆八中模拟赛]寻找代表元(二分图最大匹配) Description 八中一共有n个社团,分别用1到n编号. 八中一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也 ...

  3. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  4. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  5. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  6. [NOIP10.6模拟赛]2.equation题解--DFS序+线段树

    题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)

    题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...

  9. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

随机推荐

  1. 20 个 CSS高级样式技巧汇总

    使用技巧会让人变的越来越懒,没错,我就是想让你变懒.下面是我收集的CSS高级技巧,希望你懒出境界. 1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate ...

  2. 聊聊Java

    聊聊Java 笔记源于 视频教程Bilibili:狂神说Java 关注公众号:狂神说 能干嘛? 热度 TIOBE 狂神计划 三高:高可用.高性能.高并发 全球几千万的程序员都会Java,真正精通的不到 ...

  3. mysql常用时间函数与类型转换

    一.用到的函数有: 1.时间格式化函数  DATE_FORMAT(date,format) 2.时间加减函数DATE_ADD(date,INTERVAL expr unit)DATE_SUB(date ...

  4. Report.Net 本地数据库、WebService、Socket报表

    本地.服务器的Access.Sql报表编辑.预览.打印. 可自定义预览界面,可方便嵌入到你的程序中去,提供接口函数,如有需要可自行添加接口. 预览采用单双面方式,因为如果页面过多,预览不能全部加载,所 ...

  5. 不会用Java Future,我怀疑你泡茶没我快, 又是超长图文!!

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  6. msyql事务的四种隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  7. scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器

    1 折叠 fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算,直到list中的所有元素被遍历. 1)可以把reduceLeft看做简化版的foldLeft. 如何理解: def redu ...

  8. python 并发专题(十一):基础部分补充(三)线程

    1. 背景 理论上来说:单个进程的多线程可以利用多核. 但是,开发Cpython解释器的程序员,给进入解释器的线程加了锁. 2. 加锁的原因: 当时都是单核时代,而且cpu价格非常贵. 如果不加全局解 ...

  9. Mysql and ORM

    本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...

  10. 手写简易SpringMVC

    手写简易SpringMVC 手写系列框架代码基于普通Maven构建,因此在手写SpringMVC的过程中,需要手动的集成Tomcat容器 必备知识: Servlet相关理解和使用,Maven,Java ...