题面:https://www.cnblogs.com/Juve/articles/11733280.html

表达式密码:

是个水题。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e5+;
int len,fh=;
char s[MAXN];
signed main(){
//freopen("expression.in","r",stdin);
//freopen("i.out","w",stdout);
scanf("%s",s+);
len=strlen(s+);
s[len+]='?';
if(s[]=='-') fh=;
else fh=;
for(int i=;i<=len;){
while(i<=len&&s[i]<''||s[i]>'') ++i;
if(fh==){
putchar('-');
putchar(s[i]);
++i;
if(s[i]=='-') fh=;
else fh=;
}else{
while(i<=len&&s[i]==''){
putchar('+');
putchar('');
++i;
}
if(s[i]=='-') fh=;
else if(s[i]=='+') fh=;
else if(s[i]!='?'){
if(i!=) putchar('+');
while(i<=len&&s[i]>=''&&s[i]<=''){
putchar(s[i]);
++i;
}
if(s[i]=='-') fh=;
else fh=;
}
}
}
puts("");
return ;
}

电压机制:

题目翻译:在一张无向图上,有多少边满足:在所有的奇环上但是不再任何一个偶环上

题目给了基环树的数据,启发我们想到正解

如过那个环是偶环,那么答案就是环外的,如果是奇环,答案就是环内的

考虑如何拓展到一般情况

我们dfs时会建出一个搜索树,我们把新树建出来,同时记录每一条边是否为树边

然后扫每一个不是树边的边,如果把它加进新图,就会形成环,因为是在树上,lca,两点间dis很好求,所以我们知道加入这条边会形成奇环还是偶环

暴力排除每一条边显然不可能,我们考虑差分

把每一条边放到点,统计每一个点被多少个奇环或偶环经过,打差分,最后dfs一遍就统计出了一个点在几个奇环,几个偶环中了

然后就统计出答案了,注意根节点不要统计,因为把边放到点,没有边被放到了根节点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
const int MAXN=1e5+5;
int n,m,ans=0,f[MAXN],g[MAXN],tot=0;
int to[MAXN<<1],nxt[MAXN<<1],id[MAXN<<1],pre[MAXN],cnt=0;
struct node{
int u,v;
bool flag;//shifoushishubian
}e[MAXN<<1];
inline void add(re int u,re int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
int fa[MAXN];
inline int find(re int x){
return fa[x]=(fa[x]==x?x:find(fa[x]));
}
int deep[MAXN],siz[MAXN],son[MAXN];
inline void dfs(re int x){
siz[x]=1;
for(re int i=pre[x];i;i=nxt[i]){
re int y=to[i];
if(y==fa[x]) continue;
fa[y]=x;deep[y]=deep[x]+1;
dfs(y);
siz[x]+=siz[y];
if(siz[son[x]]<siz[y]) son[x]=y;
}
}
int top[MAXN];
inline void DFS(re int x,re int topf){
top[x]=topf;
if(son[x]) DFS(son[x],topf);
for(re int i=pre[x];i;i=nxt[i]){
re int y=to[i];
if(y==fa[x]||y==son[x]) continue;
DFS(y,y);
}
}
inline int LCA(re int x,re int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=fa[x];
}
if(deep[x]>deep[y]) swap(x,y);
return x;
}
bool vis[MAXN];
void dfs1(int x,int rt){
vis[x]=1;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x]) continue;
dfs1(y,rt);
g[x]+=g[y],f[x]+=f[y];
}
if(f[x]==tot&&g[x]==0&&x!=rt) ++ans;
}
signed main(){
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;++i) fa[i]=i;
for(re int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);
e[i]=(node){u,v,0};
}
re int num=0;
for(re int i=1;i<=m;++i){
re int x=find(e[i].u),y=find(e[i].v);
if(x!=y){
fa[x]=y;
add(e[i].u,e[i].v),add(e[i].v,e[i].u);
e[i].flag=1;
++num;
if(num==n-1) break;
}
}
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;++i){
if(deep[i]) continue;
deep[i]=1;
dfs(i),DFS(i,i);
}
for(re int i=1;i<=m;++i){
if(e[i].flag) continue;
re int x=e[i].u,y=e[i].v;
re int lca=LCA(x,y);
re int dis=deep[x]+deep[y]-deep[lca]*2;
if(dis&1){//ouhuan
++g[x],++g[y],g[lca]-=2;
}else{
++tot;
++f[x],++f[y],f[lca]-=2;
}
}
for(int i=1;i<=n;++i){
if(vis[i]) continue;
dfs1(i,i);
}
if(tot==1) ++ans;
printf("%d\n",ans);
return 0;
}
 

括号密码:不会

最新文章

  1. 一种简单的CQRS架构设计及其实现
  2. sql基础大全
  3. .NET4.5 WFP中用WebBrowser获取/操作网页html代码
  4. Docker之Linux Cgroups
  5. java基础练习[一]
  6. HTML5-WebSocket技术学习(1)
  7. bzoj 2242: [SDOI2011]计算器
  8. ToggleButton与Switch
  9. 【多媒体封装格式详解】---MKV
  10. Codeforces Beta Round #9 (Div. 2 Only)D
  11. 经典union的使用
  12. 1-1hibernate数据库操作基础
  13. Quartz学习--二 Hello Quartz! 和源码分析
  14. 4.1 ORACLE DATAGUARD SWITCHOVER 步骤
  15. 一个applicationContext 加载错误导致的阻塞解决小结
  16. JS--dom对象:document object model文档对象模型
  17. QML学习笔记(四)-TabView-竖直方向
  18. Spring Boot 简单小Demo 转载!!!
  19. SQLServer、MySQL、Oracle如何查看所有表的条数
  20. Broadcast的类型

热门文章

  1. 项目中UX设计1到2的设计提升总结
  2. dell服务器 bios界面
  3. boost asio tcp 多线程异步读写,服务器与客户端。
  4. thrift 的一些相关知识
  5. mysql组合查询
  6. python的format函数是什么意思format是什么意思
  7. leetcode-52-N皇后②
  8. Dart编程数字Number
  9. NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)
  10. [转]WinForm DataGridView 绑定泛型List(List&lt;T&gt;)/ArrayList不显示的原因和解决