仙人掌、圆方树、支配树、舞蹈链作业(上)

[APIO2018] Duathlon 铁人两项

求有多少个三元组 ( s , c , f ) (s,c,f) (s,c,f)满足 s , c , f s,c,f s,c,f互不相同,而且在给定的图上存在一条从 s s s经过 c c c到达 t t t的简单路径。

建出圆方树,两个圆点 s , f s,f s,f可以选择的 c c c为路径中所有的点双中的点,定义方点的权值为其所代表的点双的点数,圆点的权值为 − 1 -1 1,那么两个圆点可以选择的点数就是路径上的权值和(因为 s s s f f f是圆点,所以 c = s c=s c=s t t t的情况是被减去了的),反过来 d p dp dp每个点被多少条路径覆盖即可。

A C   C o d e \mathcal AC \ Code AC Code

#include<bits/stdc++.h>
#define maxn 200005
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(int i=(j),LIM=(k);i>=LIM;i--)
#define pb push_back
#define LL long long
using namespace std;

char cb[1<<16],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<16,stdin),cs==ct)?0:*cs++)
void read(int &res){
   
	char ch;
	for(;!isdigit(ch=getc()););
	for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0');
}

int n,m,tot;
vector<int>G[maxn],E[maxn];
int dfn[maxn],low[maxn],tim,sta[maxn],tp;
void dfs(int u,int ff){
   
	dfn[u] = low[u] = ++tim;
	sta[++tp] = u;
	for(int i=0,v;i<G[u].size();i++) if(!dfn[v=G[u][i]]){
   
		dfs(v,u),low[u]=min(low[u],low[v]);
		if(low[v] >= dfn[u]){
   
			++tot;
			for(int t=-1;t!=v;){
   
				E[t=sta[tp--]].pb(tot),
				E[tot].pb(t);
			}
			E[tot].pb(u) , E[u].pb(tot);
		}
	}else if(v != ff) low[u] = min(low[u] , dfn[v]);
}

bool vis[maxn];
LL ans;
int f[maxn];

void dfs2(int u,int ff){
   
	vis[u] = 1;
	f[u] = (u <= n);
	for(int i=0,v;i<E[u].size();i++) if((v=E[u][i]) ^ ff){
   
		dfs2(v,u);
		ans += 1ll * f[v] * f[u] * (u <= n ? -1ll : E[u].size());
		f[u] += f[v];
	}
}

void dfs3(int u,int ff,int tsz){
   
	ans += 1ll * f[u] * (tsz-f[u]) * (u <= n ? -1ll : E[u].size());
	for(int i=0,v;i<E[u].size();i++) if((v=E[u][i]) ^ ff)
		dfs3(v,u,tsz);
}

int main(){
   
	read(n),read(m);
	rep(i,1,m){
   
		int u,v;read(u),read(v);
		G[u].pb(v),G[v].pb(u);
	}
	tot = n;
	rep(i,1,n) if(!dfn[i]) dfs(i,0);
	rep(i,1,tot) if(!vis[i]){
   
		dfs2(i,0);
		dfs3(i,0,f[i]);
	}
	printf("%lld\n",ans << 1);
}

「POI2011 R2 Day1」垃圾运输 Garbage

无向图每条边非黑即白,求出若干个简单环使得依次将每个环上的所有边颜色取反后所有边的颜色都为目标颜色。

这题放圆方树是什么意思啊。
发现对于不用取反的边,如果有环经过,那么会有偶数个环经过,可以将这两个环合并为一个大环,具体是只保留经过了奇数次的边。
所以就是对需要取反的边求简单环覆盖。
判无解就判可不可以有多个欧拉回路即可。
所以这个题就是求欧拉回路,把回路分解成若干个简单环即可。

A C   C o d e \mathcal AC \ Code AC Code

#include<bits/stdc++.h>
#define maxm 2000005
using namespace std;
int n,m;
int in[maxm];
int info[maxm],Prev[maxm],to[maxm],cnt_e=1;
void Node(int u,int v){
    Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int ans[maxm],K,tp,L[maxm],R[maxm],ed[maxm];
void dfs(int u,int hd=1){
   
	for(int &i=info[u],v;i;i=Prev[i]) if((v=to[i]))
		to[i]=to[i^1]=0,dfs(v),hd=1;
	if(hd) ans[++tp] = u;
}

int main(){
   
	scanf("%d%d",&n,&m);
	for(int i=1,a,b,s,t;i<=m;i++){
   
		scanf("%d%d%d%d",&a,&b,&s,&t);
		if(s ^ t) Node(a,b),Node(b,a),in[a]++,in[b]++;
	}
	for(int i=1;i<=n;i++) if(in[i]&1) return puts("NIE"),0;
	for(int i=1;i<=n;i++) dfs(i,0) , ed[tp] = 1;
	int pr=1; 
	for(int i=2;i<=tp;i++) if(ans[i] == ans[pr]){
   
		L[++K] = pr , R[K] = i;
		i += ed[i];
		pr = i;
	}
	printf("%d\n",K);
	for(int i=1;i<=K;i++){
   
		printf("%d ",R[i]-L[i]);
		for(int j=L[i];j<=R[i];j++)
			printf("%d%c",ans[j]," \n"[j==R[i]]);
	}
}

【CF Round #278】Tourists

A C   C o d e \mathcal AC \ Code AC Code

#include<bits/stdc++.h>
#define maxn 200005
using namespace std;

int n,m,q;
int info[maxn],Prev[maxn],to[maxn],cnt_e;
void Node(int u,int v){
    Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int w[maxn],tot;
vector<int>G[maxn];
int dfn[maxn],low[maxn],dfsn;
int vis[maxn];
stack<pair<int,int> >sta;
void dfs(int now,int ff){
   
	dfn[now] = low[now] = ++dfsn;
	for(int i=info[now];i;i=Prev[i])
		if(!dfn[to[i]]){
   
			sta.push(make_pair(now,to[i]));
			dfs(to[i],now);
			low[now] = min(low[now] , low[to[i]]);
			if(low[to[i]] >= dfn[now]){
   
				++tot;
				for(;!sta.empty();){
   
					int u=sta.top().first,v=sta.top().second;sta.pop();
					if(vis[u] < tot) vis[u] = tot , G[tot].push_back(u) , G[u].push_back(tot);
					if(vis[v] < tot) vis[v] = tot , G[tot].push_back(v) , G[v].push_back(tot);
					if(u == now && v == to[i]) break;
				}
			}
		}
		else low[now]=min(low[now],dfn[to[i]]);
}

int siz[maxn],son[maxn],dep[maxn],fa[maxn],tp[maxn],id[maxn],pos[maxn],cnt;
void dfs2(int now,int ff){
   
	siz[now] = 1 , son[now] = -1 , dep[now] = dep[fa[now] = ff] + 1;
	for(int i=0,sz=G[now].size(),v;i<sz;i++)
		if((v=G[now][i])!=ff){
   
			dfs2(v,now);
			siz[now] += siz[v];
			if(son[now] == -1 || siz[son[now]] < siz[v])
				son[now] = v;
		}
}

void dfs3(int now,int ff){
   
	pos[id[now] = ++cnt] = now;
	if(son[now]!=-1) tp[son[now]]=tp[now],dfs3(son[now],now);
	for(int i=0,sz=G[now].size(),v;i<sz;i++)
		if((v=G[now][i])!=ff && v!=son[now]){
   
			tp[v] = v;
			dfs3(v,now);
		}
}

multiset<int>st[maxn];
#define lc now << 1
#define rc now << 1 | 1
int Min[maxn<<3];
void upd(int now){
    Min[now] = min(Min[lc],Min[rc]); }
void Build(int now,int l,int r){
   
	if(l == r){
    Min[now]=(pos[l]<=n?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业细分市场,横跨如半导体产业(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值