BZOJ2278 : [Poi2011]Garbage
如果两个环相交,那么相交的部分相当于没走。
因此一定存在一种方案,使得里面的环都不相交。
把不需要改变状态的边都去掉,剩下的图若存在奇点则无解。
否则,每找到一个环就将环上的边都删掉,时间复杂度$O(n+m)$。
#include<cstdio>
const int N=2000010,BUF=20000000;
int n,_m,m,i,j,k,x,y,d[N],s[N],e[N][3],a[N],v[N],q[N],t;
int cnt,now,tmp[N],ans[N],pos;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
void write(int x){if(x>9)write(x/10);putchar(x%10+48);}
int main(){
for(fread(Buf,1,BUF,stdin),read(n),read(_m);_m--;){
read(i),read(j),read(x),read(y);
if(x^y)d[e[++m][0]=i]++,d[e[m][1]=j]++;
}
for(i=1;i<=n;i++)if(d[i]&1)return puts("NIE"),0;
for(i=1;i<=n;i++)s[i+1]=s[i]+d[i],d[i]=0;
for(i=1;i<=m;a[s[x]+d[x]]=a[s[y]+d[y]]=i++)d[x=e[i][0]]++,d[y=e[i][1]]++;
for(i=1;i<=n;i++)for(q[t=1]=x=i;x;x=y){
for(v[x]=1,y=0;d[x];d[x]--)if(!e[j=a[s[x]+d[x]]][2]){
e[j][2]=1;
if(v[k=e[j][x==e[j][0]]]){
for(cnt++,now=0,y=k;q[t]!=k;v[q[t--]]=0)tmp[++now]=q[t];
for(tmp[++now]=k,ans[++pos]=now,k=1;k<=now;k++)ans[++pos]=tmp[k];
ans[++pos]=tmp[1];
}else y=q[++t]=k;
break;
}
if(!y&&t)y=q[t--];
}
for(write(cnt),putchar(10),i=1;i<=pos;i=j+1){
write(ans[i]),putchar(32);
for(j=i+1;j<=i+ans[i];j++)write(ans[j]),putchar(32);
write(ans[j]),putchar(10);
}
return 0;
}
BZOJ2278 : [Poi2011]Garbage的更多相关文章
- BZOJ2278 [Poi2011]Garbage[欧拉回路求环]
首先研究环上性质,发现如果状态不变的边就不需要动了,每次改的环上边肯定都是起末状态不同的边且仅改一次,因为如果有一条边在多个环上,相当于没有改,无视这条边之后,这几个环显然可以并成一个大环.所以,我们 ...
- [POI2011]Garbage 欧拉回路
[POI2011]Garbage 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2278 https://loj.ac/problem/216 ...
- POI2011题解
POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POI做题笔记
POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...
- 【LOJ#2162】【POI2011】Garbage(欧拉回路)
[LOJ#2162][POI2011]Garbage(欧拉回路) 题面 LOJ 题解 首先有一个比较显然的结论,对于不需要修改颜色的边可以直接删掉,对于需要修改的边保留.说白点就是每条边要被访问的次数 ...
- [LOJ #2162]「POI2011」Garbage
题目大意:给一张$n$个点$m$条边的无向图,每条边是黑色的或白色的,要求变成一个目标颜色.可以从任意一个点开始,走一个简单环,回到开始的点,所经过的边颜色翻转.可以走无数次.问是否有一个方案完成目标 ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
随机推荐
- PHP使用数据库的并发问题
在并行系统中并发问题永远不可忽视.尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的.尤其是在操作诸如订单.支付等业务系统中,更需要注意操作数据库的并发问题. 接下来我通过一个 ...
- 线性筛的同时得到欧拉函数 (KuangBin板子)
线性筛的思想:每个被筛的数是通过它最小的质因子所筛去的. 这种思想保证了每个数只会被筛一次,从而达到线性.并且,这个思想实现起来非常巧妙(见代码注释)! 因为线性筛的操作中用到了倍数的关系去实现,因此 ...
- 第5月第27天 cocos2d
1. 流程是这样的: 在CCApplication的run函数中,显示设备链调用相应的场景显示函数drawScene来绘制场景,然后调用了CCScheduler的update函数,在这个函数里,对所有 ...
- 【干货】已Window7 系统为例,谈谈boot引导程序-------附带看看数据隐藏
来源:Unit 3: Unix/Linux File System 3.1 Unix/Linux File System Booting Process 使用工具:EnCase Forensic 学习 ...
- 基于滑动窗口协议写的程序(UDP实现) .
正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...
- vim助手
移动光标 hjkl 2w 向前移动两个单词 3e 向前移动到第 3 个单词的末尾 0 移动到行首 $ 当前行的末尾 gg 文件第一行 G 文件最后一行 行号+G 指定行 <ctrl>+o ...
- Linux内核中的printf实现【转】
转自:http://www.cnblogs.com/chenglei/archive/2009/08/06/1540702.html 从main.c中的printf开始读这个函数. 首先看printf ...
- 几种list排序方法
package com.lgx.jdk8.part02; import java.util.*; import java.util.stream.Collectors; /** * Comparato ...
- TcxGrid标题头 字体加粗
- Laravel中使用自己的类库三种方式
虽然Composer使得我们可以重用很多现有的类库(例如packagist.org中的),但是我们仍然可能用到一些不兼容composer的包或者类库.另外在某一项目中,我们也可能会创建某一类库,而且可 ...