考前挣扎
圆方树这么早就出现了嘛。。。
要求每个点必须被经过的次数 所以就是路径上的割点/端点++
由于圆方树上所有非叶子圆点都是割点 所以就是树上差分就可以辣。
实现的时候出了一点小问题。
就是这里
if(low[y] == dfn[x]){ int r = ++poi,w; do { w = stk.top(); stk.pop(); att(r,w);//printf("QAQ"); }while(w!=y); att(r,x);}
if(low[y] == dfn[x]){ int r = ++poi; while(stk.top()!=x) { int w = stk.top(); stk.pop(); att(r,w);//printf("QAQ"); } att(r,x);}
后面这个是错哒 因为x与y之间可以有别的未弹栈的点的qwq
要注意!
//Love and Freedom.#include#include #include #include #include #define ll long long#define inf 20021225#define mxn 210000using namespace std; struct edge{int to,lt;}e[mxn<<1],t[mxn<<2];int in[mxn],cnt,it[mxn<<1],tnt,poi;void add(int x,int y){ e[++cnt].to = y; e[cnt].lt=in[x]; in[x] = cnt; e[++cnt].to = x; e[cnt].lt=in[y]; in[y] = cnt;} void att(int x,int y){ t[++tnt].to = y; t[tnt].lt=it[x]; it[x] = tnt; t[++tnt].to = x; t[tnt].lt=it[y]; it[y] = tnt;} int dfn[mxn],low[mxn],tot;stack stk;void dfs(int x){ dfn[x] = low[x] = ++tot; stk.push(x); for(int i=in[x];i;i=e[i].lt) { int y = e[i].to; if(dfn[y]) low[x] = min(low[x],dfn[y]); else { dfs(y); if(low[y] == dfn[x]) { int r = ++poi,w; do { w = stk.top(); stk.pop(); att(r,w);//printf("QAQ"); }while(w!=y); att(r,x); } low[x] = min(low[x],low[y]); } }}int key[mxn<<1],ans[mxn<<1],fa[mxn][20];int dep[mxn<<1];void build(int x,int f){ dep[x] = dep[f]+1; for(int i=1;i<20;i++) fa[x][i] = fa[fa[x][i-1]][i-1]; for(int i=it[x];i;i=t[i].lt) { int y = t[i].to; if(y == f) continue; fa[y][0] = x;build(y,x); }} void dfs(int x,int f){ //if(x<=n) dis[x] = dis[f] +1; //else dis[x] = dis[f]; //int flag = 0; for(int i=it[x];i;i=t[i].lt) { int y = t[i].to; if(y==f) continue; dfs(y,x); ans[x] += ans[y]; } ans[x] += key[x]; //if(!flag) dis[x] --;} int lca(int x,int y){ if(dep[x] < dep[y]) swap(x,y); int del = dep[x] - dep[y]; for(int i=19;~i;i--) if(del&(1<