BZOJ4238 : 电压

如果一条边可行,那么删掉这条边后,剩下的图是二分图且该边的两端点颜色相同。

那么可行的边必然属于所有奇环的交集,且不属于任何偶环。

随便取一棵生成树,对于一条非树边,它形成了环:

若是偶环,则将环上的边都标记为不能选。

若是奇环,则将环上的边经过的奇环数都加一。

可以用树链剖分维护前缀和做到$O(m\log n)$。

对于其它的环,都可以由以下三种情况得到:

1.一个奇环异或一个偶环得到一个新的奇环,公共部分一定经过了偶环,即使不标记也会被舍去。

2.一个奇环异或一个奇环得到一个新的偶环,新环上的边一定不属于所有奇环的交,即使不标记也会被舍去。

3.一个偶环异或一个偶环得到一个新的偶环,公共部分一定经过了偶环且被标记过了,所以无需再次标记。

因此只需要考虑所有两两之间异或可以表示出所有环的基环即可。

#include<cstdio>
#define N 300010
int n,m,i,x,y,f[N],g[N],nxt[N<<1],v[N<<1],ed,son[N],size[N],d[N],dis[N],top[N],loc[N],dfn,s[2][N];
int e[N][2],need[N],ban[N],cnt,ans;
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline void add(int x,int y){
  v[++ed]=y;nxt[ed]=g[x];g[x]=ed;
  v[++ed]=x;nxt[ed]=g[y];g[y]=ed;
}
void dfs(int x,int y){
  size[x]=1,d[x]=d[f[x]=y]+1,dis[x]=dis[y]+(x<=n);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y){
    dfs(v[i],x);size[x]+=size[v[i]];
    if(size[v[i]]>size[son[x]])son[x]=v[i];
  }
}
void dfs2(int x,int y){
  top[x]=y;loc[x]=++dfn;
  if(son[x])dfs2(son[x],y);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);
}
inline void modify(int x,int y,int p){
  for(;top[x]!=top[y];x=f[top[x]]){
    if(d[top[x]]<d[top[y]]){int z=x;x=y;y=z;}
    s[p][loc[top[x]]]++,s[p][loc[x]+1]--;
  }
  if(d[x]<d[y]){int z=x;x=y;y=z;}
  s[p][loc[y]]++,s[p][loc[x]+1]--;
}
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
int main(){
  read(n),read(m);
  for(i=1;i<=n;i++)f[i]=i;
  for(i=1;i<=m;i++){
    read(x),read(y),e[i][0]=x,e[i][1]=y;
    if(F(x)!=F(y))f[f[x]]=f[y],add(x,i+n),add(y,i+n);else need[i]=1;
  }
  for(i=1;i<=n;i++)if(!d[i])dfs(i,0),dfs2(i,i);
  for(i=1;i<=m;i++)if(need[i]){
    x=e[i][0],y=e[i][1];
    if((dis[x]&1)^(dis[y]&1))ban[i]=1,modify(x,y,0);else modify(x,y,1),cnt++;
  }
  for(i=2;i<=dfn;i++)s[0][i]+=s[0][i-1],s[1][i]+=s[1][i-1];
  for(i=1;i<=m;i++)if(need[i]){
    if(!ban[i]&&cnt==1)ans++;
  }else{
    if(!s[0][loc[i+n]]&&s[1][loc[i+n]]==cnt)ans++;
  }
  return printf("%d",ans),0;
}

  

时间: 2024-10-10 07:38:05

BZOJ4238 : 电压的相关文章

BZOJ4238电压

Description 你知道Just Odd Inventions社吗?这个公司的业务是"只不过是奇妙的发明(Just Odd Inventions)".这里简称为JOI社. JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N 每个节点有一个可设定的状态[高电压]或者[低电压].每个电阻连接两个节点,只有一端是高电压,另一端是低电压的电阻才会有电流流过.两端都是高电压或者低电压的电阻不会有电流流过. 某天,JOI社为了维护电路,选择了一根电阻

bzoj-4238 电压

题意: 给出一个n个结点m条边的无向图,用两种颜色来对结点染色: 求图中有多少条边,可以存在一种方案,使这条边两段的颜色相同而其他边两端颜色不同: n<=100000,m<=200000: 题解: 这题感觉正解大框很容易想,但是最终写出来还是很难的似乎: 最简单的暴力就是枚举边然后给图染色: 然后还有n==m的基环树,搜个环讨论一下就又有一些分: 正解的话显然要找环,然而如何找环Tarjan早已给出了答案: 先搜一个DFS树,这样图中所有的边就分为了树边和非树边: 又因为DFS树的性质,这里的

【BZOJ4238】电压 DFS树

[BZOJ4238]电压 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)”.这里简称为JOI社. JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N 每个节点有一个可设定的状态[高电压]或者[低电压].每个电阻连接两个节点,只有一端是高电压,另一端是低电压的电阻才会有电流流过.两端都是高电压或者低电压的电阻不会有电流流过. 某天,JOI社为了维护电路

电压跟随器加电阻分压实现降压

实现分压最简单的方法就是用电阻进行分压,如下图: 但这样做有一个最大的问题:输出电阻很大,接入负载会改变分压值,也就是说,在任何分压电路需要一定电流的应用中都不能使用 加一个电压跟随器可以解决这个问题,运放的特点是高输入阻抗,几乎不从信号源汲取电流,运放还有个低输出阻抗的特点,负载电流几乎不会引起内部电压下降 为什么在系统供电电路中不使用这样的电路来提供所需电压呢?因为无法提供所需电流啊 此电路多用来为单电源运放提供偏置电压

总结2---万用表测量方波和正弦波的电压

万用表测出来的方波的电压是平均值,正弦波是有效值. 原因是:万用表采用的是积分ADC,得到的结果为平均值.  ……为什么是这样,查到的时候,再续!! ---------------------------------------------------------------------- 电流.某一截面上的电量叫做电流强度,简称电流,也至电荷在导体中的定向移动. 导体中的自由电荷在电场力的作用下做有规则的定向运动就形成了电流. 通过导体截面的电荷量Q跟通过这些电荷量所用时间t的比值成为电流.也

智能小车二十一 《电压检测模块设计》

小车经常出现一个问题:玩着玩着,操作它前后左右动,但它不动.这时候就不知道到底是那儿的问题,是线断了还是电压不够了.经过我很多次的经验得出,这是因为没电了.因为我每次这时候都会拿电压表去测一下,发现电池电压都在6v以下了.根据这个线索我设计了一个小电路来测电压. 我计划是用小led灯来报警,当电压不足时,灯就常亮.电压不够时(6v)一般小灯还是能够点亮的.经查资料,5mm小灯的工作电流是20ma,红.黄颜色电压是1.8-2.4之间,蓝.白.绿的电压则是3.0-3.6之间.我现在有一个白灯,那么需

彩扩机项目--死区,另辟蹊径使用即将导通的一路的电压得能量对需要关闭的一路的电容进行放电

另辟蹊径使用即将导通的一路的电压得能量对需要关闭的一路的电容进行放电. 因为马达的自感现象,需要在桥的四个三极管上面加上二极管.(具体为什么,以后马达章节在细说)

STM32 ADC 测电压

1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的通道1. 查看文档<STM32F103X.pdf>第13页,时钟树图: 得知ADC1可2,4,6,8分频,又ADC输入时钟不得超过14MHZ(参见STM32参考手册RM0008第11章ADC). //初始化ADC //这里我们仅以规则通道为例 //我们默认将开启通道0~3 void Adc_Ini

STM8l051,ADC读电压,电量计。(边写边记录)

项目要求使用STM8L051F3芯片实现ADC采集电压得到电量的功能,之前没有接触过STM8,便在这里记录一下这个过程. 1.搭建环境: STM8的软件开发环境似乎有很多,我这里使用的是IAR FOR STM8,具体的下载安装方法百度很多,我是参考的这个教程:http://blog.csdn.net/ybhuangfugui/article/details/52936636,里边提供有IAR注册机. 下载安装完毕后可以去ST官网下载库文件,链接:http://www.st.com/content