題面:https://www.cnblogs.com/Juve/articles/11733280.htmlhtml
表達式密碼:node
是個水題。。。ios
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1e5+5; 7 int len,fh=0; 8 char s[MAXN]; 9 signed main(){ 10 //freopen("expression.in","r",stdin); 11 //freopen("i.out","w",stdout); 12 scanf("%s",s+1); 13 len=strlen(s+1); 14 s[len+1]='?'; 15 if(s[1]=='-') fh=2; 16 else fh=1; 17 for(int i=1;i<=len;){ 18 while(i<=len&&s[i]<'0'||s[i]>'9') ++i; 19 if(fh==2){ 20 putchar('-'); 21 putchar(s[i]); 22 ++i; 23 if(s[i]=='-') fh=2; 24 else fh=1; 25 }else{ 26 while(i<=len&&s[i]=='0'){ 27 putchar('+'); 28 putchar('0'); 29 ++i; 30 } 31 if(s[i]=='-') fh=2; 32 else if(s[i]=='+') fh=1; 33 else if(s[i]!='?'){ 34 if(i!=1) putchar('+'); 35 while(i<=len&&s[i]>='0'&&s[i]<='9'){ 36 putchar(s[i]); 37 ++i; 38 } 39 if(s[i]=='-') fh=2; 40 else fh=1; 41 } 42 } 43 } 44 puts(""); 45 return 0; 46 }
電壓機制:express
題目翻譯:在一張無向圖上,有多少邊知足:在全部的奇環上可是再也不任何一個偶環上ide
題目給了基環樹的數據,啓發咱們想到正解spa
如過那個環是偶環,那麼答案就是環外的,若是是奇環,答案就是環內的翻譯
考慮如何拓展到通常狀況code
咱們dfs時會建出一個搜索樹,咱們把新樹建出來,同時記錄每一條邊是否爲樹邊htm
而後掃每個不是樹邊的邊,若是把它加進新圖,就會造成環,由於是在樹上,lca,兩點間dis很好求,因此咱們知道加入這條邊會造成奇環仍是偶環blog
暴力排除每一條邊顯然不可能,咱們考慮差分
把每一條邊放到點,統計每個點被多少個奇環或偶環通過,打差分,最後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; }
括號密碼:不會