MLE on 9,10
查看原帖
MLE on 9,10
400057
Jie_Xu_Sheng楼主2023/11/25 16:38

rt

#include<bits/stdc++.h>
using namespace std;
const int N=50010;
map<int,map<int,int>> mp;
int n,m,k,Q,num,len,dp[N],dis[N],dl[N],vis[N],vv[N],a[N],b[N],dfn[N],tot,dep[N],fa[N][20];
vector<int> ee[N],ww[N],e[N],w[N],ve[N],vw[N];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
struct node{
	int lst,dis,x;
	bool operator<(const node b)const{
		if(dis!=b.dis) return dis>b.dis;
		else return lst>b.lst;
	}
};
priority_queue<node> q;
void dij(){
	dis[k]=0;
	q.push({0,0,k});
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int x=tmp.x;
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=0;i<ee[x].size();i++){
			int y=ee[x][i],W=ww[x][i];
			if(dis[y]>dis[x]+W){
				if(mp[x][y]==0){
					mp[x][y]=mp[y][x]=1;
					e[y].push_back(x);
					e[x].push_back(y);
					w[x].push_back(W);
					w[y].push_back(W);
				}
				dis[y]=dis[x]+W;
				q.push({x,dis[x]+W,y});
			}
		}
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=19;i>=0;i--){
		if((dep[x]-dep[y])>=(1<<i)){
			x=fa[x][i];
		}
	}
	if(x==y) return x;
	for(int i=19;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		}
	}
	return fa[x][0];
}
void dfs(int x,int f,int dp,int siz){
	dep[x]=dp,fa[x][0]=f,dfn[x]=++tot,dl[x]=siz;
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		if(y==f) continue;
		dfs(y,x,dp+1,siz+w[x][i]);
	}
}
inline int Dis(int x,int y){
	int lc=lca(x,y);
	return dl[x]+dl[y]-2*dl[lc];
}
int tt;
void work_change(){
	num=read();
	for(int i=1;i<=num;i++){
		int xx=read();
		if(vis[xx]==1) tt--;
		else tt++;
		vis[xx]=1-vis[xx];
	}
}
bool cmp_dfn(int x,int y){
	return dfn[x]<dfn[y];
}
void add_edge(int x,int y){
	ve[x].push_back(y);
	ve[y].push_back(x);
	int ds=Dis(x,y);
	vw[x].push_back(ds);
	vw[y].push_back(ds);
}
void build_virtual_tree(){
	tot=0;
	sort(a+1,a+num+1,cmp_dfn);
	for(int i=1;i<num;i++){
		b[++tot]=a[i];
		b[++tot]=lca(a[i],a[i+1]);
		vv[a[i]]=1;
	}
	vv[a[num]]=1;
	b[++tot]=a[num];
	sort(b+1,b+tot+1,cmp_dfn);
	len=unique(b+1,b+tot+1)-b-1;
	for(int i=1;i<len;i++){
		add_edge(b[i+1],lca(b[i],b[i+1]));
	}
}
void clear(int x){
	ve[x].clear();
	vw[x].clear();
}
void clear_virtual_tree(){
	for(int i=1;i<len;i++){
		clear(b[i+1]),clear(lca(b[i],b[i+1]));
	}
	for(int i=1;i<=k;i++){
		vv[a[i]]=0;
	}
}
void dfs_dp(int x,int f){
	dp[x]=0;
	for(int i=0;i<ve[x].size();i++){
		int y=ve[x][i];
		if(y==f) continue;
		dfs_dp(y,x);
		if(vis[y]==1) dp[x]+=vw[x][i];
		else dp[x]+=min(vw[x][i],dp[y]);
	}
}
void work_output(){
	num=read();
	for(int i=1;i<=num;i++){
		a[i]=read();
	}
	num++,a[num]=k;
	build_virtual_tree();
	dfs_dp(k,0);
	if(dp[k]==0) dp[k]=-1; 
	cout<<dp[k]<<endl;
/*	for(int i=1;i<=n;i++){
		cout<<vis[i]<<" ";
	}
	cout<<endl;
	for(int i=1;i<=n;i++){
		cout<<dp[i]<<" ";
	}
	cout<<endl;*/
	clear_virtual_tree();
}
void init_fa(){
	for(int i=1;i<=19;i++){
		for(int j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
}
signed main(){
//	freopen("P5680_7.in","r",stdin);
//	freopen("1.out","w",stdout);
	n=read(),m=read(),k=read(),Q=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),len=read();
		ee[u].push_back(v);
		ee[v].push_back(u);
		ww[u].push_back(len);
		ww[v].push_back(len);
	}
	for(int i=1;i<=n;i++) dis[i]=2e9;
	dij();
/*	for(int i=1;i<=n;i++){
		cout<<"i "<<i<<" "<<dis[i]<<endl;
	}*/
	memset(vis,0,sizeof(vis));
	dfs(k,0,1,0);
	init_fa();
/*	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			cout<<"i j lca "<<i<<" "<<j<<" "<<lca(i,j)<<endl;
		}
	}*/
	while(Q--){
		int op=read();
		if(op==0) work_change();
		else work_output();
	}
	return 0;
}

不知道为啥 MLE on 9,10

2023/11/25 16:38
加载中...