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;
}

  

时间: 2024-09-20 20:50:52

BZOJ2278 : [Poi2011]Garbage的相关文章

bzoj-2278 Garbage

题意: 给出一个n个点m条边无向图,每个边有一个01状态: 现在可以选择一些环,使环上的所有状态取反: 给出初始与结束状态,求一个方案: 1<=n<=100000,1<=m<=1000000: 题解: 做完这题深刻的体会到自己的too young too naive: 首先有一个性质,如果有解,一定存在一种方案使选择的所有环不重复经过一条边: 这个性质也说明了,所有不需要更改的边是可以忽视的: 因为如果将其选了偶数次,也可以构造出另一种方案不选它: 所以问题转化成从原图选出状态不同

[Java] 垃圾回收机制 ( Garbage Collection ) 简介

自动垃圾回收( Automatic Garbage Collection ) 自动垃圾回收,是指在堆(Heap)内存上分辨哪些对象还在被使用,哪些对象没有被使用,并清除没有被使用的对象.所以,这里的垃圾实际上是指,在内存中,无法再被使用没有存在的价值的但还占据内存空间的对象. C 语言的内存分配.回收是需要手动完成的,但在 Java 中,回收内存是由垃圾回收器自动完成的. 垃圾回收分为两步骤:1.标记,2.删除.删除垃圾有两种情况,a. 常规删除,b. 带压缩的删除. 第 1 步. 标记 ( M

Understanding .net CLR garbage collection--(踏踏实实学好.Net系列)

引言 内存管理是计算机科学中一个相当复杂而有趣的领域.在计算机诞生的这几十年间,内存的管理的技术不断进步,使系统能够更加有效地利用内存这一计算机必不可少的资源. 一般而言,内存管理可以分为三类:硬件管理(如TLB),操作系统管理(如Buddy System,Paging,Segmentation),应用程序管理(如C++,Java,.net的内存管理机制).鉴于篇幅和笔者水平的限制,本文只涉及了内存管理的很小一部分,即.net中的内存管理方法..net是一个当代的应用程序框架,采用了内存自动管理

c++ simple &quot;Garbage Collector&quot;

The idea is to create a Ptr type that acts like a reference in Java. And A Garbage Collector (MemMgr) type that acts like a garbage collector in Java. Just a toy. :D main.cpp 1 #include "MemMgr.h" 2 3 #include <iostream> 4 5 using namespac

Advanced .NET Debugging: Managed Heap and Garbage Collection(转载,托管堆查内存碎片问题解决思路)

原文地址:http://www.informit.com/articles/article.aspx?p=1409801&seqNum=4 Debugging Managed Heap Fragmentation Earlier in the chapter, we described a phenomenon known as heap fragmentation, in which free and busy blocks are arranged and interleaved on th

UVA 11637 - Garbage Remembering Exam(组合概率)

UVA 11637 - Garbage Remembering Exam 题目链接 题意:大概意思是,有n个单词,分别打乱放在一个环形的,一个非环形里面,环形的两个单词距离为顺时针逆时针的最小值,非环形的就是位置的差的绝对值,如果有一对单词,在两个里面的距离都是不大于k,那么这单词为无效单词,问平均会出现多少个无效单词 思路:组合概率,假设在非环形形成了一个随机序列,那么我们给它标号1-n,如果我们能分别算出1-n的有效概率,那么就等于算出了无效概率,那么有效概率等于和它距离大于k的那些位置的所

GC(Garbage Collection)垃圾回收机制

1.在垃圾回收器中,程序员没有执行权,只有通知它的权利. 2.程序员可以通过System.gc().通知GC运行,但是Java规范并不能保证立刻运行. 3.finalize()方法,是java提供给程序员用来释放对象或资源的办法,但是尽量少用. 一.GC的介绍 GC的全称是Garbage Collection (垃圾收集) 在GC中,垃圾所指的是程序在运行过程中,会产生出一些无用的对象,或者说是已经被弃用的对象,而这些对象会占用着一部分的内存空间,如果长时间不去回收这些内存空间,那么最终会导致O

garbage collection - 垃圾收集

Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected language, meaning that the execution environment is responsible for managing the memory required during code execution. In languages like C and C++, kee

[Java] 垃圾回收 ( Garbage Collection ) 的步骤演示

关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介 上一篇博客,介绍了堆的内存被分为三个部分:年轻代.老年代.永生代.这篇博文将演示这三个部分如何交互,实际也演示了垃圾回收. 1. 首先,所有新创建的对象都会陪分配到年轻代的 Eden 空间,而两个 survior 空间一开始都为空. 下图表示的是运行一段实际后的年轻代内存情况,新创建的对象会被放在 Eden 空间,"from" survior space 里面的数字