动态dp Tle on test1求教
查看原帖
动态dp Tle on test1求教
172370
fzj2007楼主2022/6/27 10:03

第一个点T了,后面全都WA了。 样例都能过。

#include<bits/stdc++.h>
using namespace std;
namespace IO{
	template<typename T>inline bool read(T &x){
		x=0;
		char ch=getchar();
		bool flag=0,ret=0;
		while(ch<'0'||ch>'9') flag=flag||(ch=='-'),ch=getchar();
		while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(),ret=1;
		x=flag?-x:x;
        return ret;
	}
	template<typename T,typename ...Args>inline bool read(T& a,Args& ...args){
	    return read(a)&&read(args...);
	}
	template<typename T>void prt(T x){
		if(x>9) prt(x/10);
		putchar(x%10+'0');
	}
	template<typename T>inline void put(T x){
		if(x<0) putchar('-'),x=-x;
		prt(x);
	}
	template<typename T>inline void put(char ch,T x){
		if(x<0) putchar('-'),x=-x;
		prt(x);
		putchar(ch);
	}
	template<typename T,typename ...Args>inline void put(T a,Args ...args){
	    put(a);
		put(args...);
	}
	template<typename T,typename ...Args>inline void put(const char ch,T a,Args ...args){
	    put(ch,a);
		put(ch,args...);
	}
	inline void put(string s){
		for(int i=0,sz=s.length();i<sz;i++) putchar(s[i]);
	}
	inline void put(const char* s){
		for(int i=0,sz=strlen(s);i<sz;i++) putchar(s[i]);
	}
}
using namespace IO;
#define N 200005
#define inf 0x3f3f3f3f3f3f3f3f3f
#define ll long long
int n,l,t,head[N],cnt=1;
struct matrix{
	ll mat[2][2];
	inline matrix(){memset(mat,0x3f,sizeof(mat));}
	inline matrix(ll a00,ll a01,ll a10,ll a11){
		mat[0][0]=a00,mat[0][1]=a01;
		mat[1][0]=a10,mat[1][1]=a11;
	}
	inline matrix operator*(const matrix &b)const{
		matrix c;
		for(int k=0;k<2;k++)
			for(int i=0;i<2;i++)
				for(int j=0;j<2;j++)
					c.mat[i][j]=min(c.mat[i][j],mat[i][k]+b.mat[k][j]);
		return c;
	}
};
struct edge{
	int v,nxt,c0,c1;	
}e[N<<1];
inline void add(int u,int v,int w0,int w1){
	e[++cnt]=(edge){v,head[u],w0,w1},head[u]=cnt;
}
matrix f[N][20],g[N][20];
int dep[N],fa[N][20],lg[N];
inline void dfs1(int x,int fat){
	dep[x]=dep[fat]+1,fa[x][0]=fat;
	for(int i=1;i<=lg[n];i++) fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==fat) continue;
		f[v][0]=matrix(e[i^1].c0,min(e[i^1].c0,e[i^1].c1)+t,min(e[i^1].c0,e[i^1].c1),e[i^1].c1);
		g[v][0]=matrix(e[i].c0,min(e[i].c0,e[i].c1)+t,min(e[i].c0,e[i].c1),e[i].c1);
		dfs1(v,x);
	}
}
inline void dfs2(int x){
	//1 2 3 4 5 6 7 8 9
	for(int i=1;i<=lg[n];i++){
		f[x][i]=f[x][i-1]*f[fa[x][i-1]][i-1],
		g[x][i]=g[fa[x][i-1]][i-1]*g[x][i-1];
	}
	for(int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==fa[x][0]) continue;
		dfs2(v);
	}
}
inline int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=lg[n];~i;i--)
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=lg[n];~i;i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int d[N],pos[N];
inline void solve(int x,int y){
	matrix ans=matrix(0,t,inf,inf);
	int k=lca(x,y),tp=0;
	for(int i=lg[n];~i;i--)
		if(dep[fa[x][i]]>=dep[k])
			ans=ans*f[x][i],x=fa[x][i];
	for(int i=lg[n];~i;i--)
		if(dep[fa[y][i]]>=dep[k]) pos[++tp]=y,d[tp]=i,y=fa[y][i];
	for(int i=tp;i;i--){
		ans=ans*g[pos[i]][d[i]];
	}
	put('\n',min(ans.mat[0][0],ans.mat[0][1]));
}
signed main(){
	for(int i=2;i<=200000;i++) lg[i]=lg[i>>1]+1;
	read(n,l,t);
	for(int i=1,u,v,w,a,tp;i<n;i++){
		read(u,v,w,a,tp);
		add(u,v,w,tp?w-a:w+a);
		add(v,u,w,!tp?w-a:w+a);
	}
	dfs1(1,0),dfs2(1);
	for(int i=1,x,y;i<=l;i++){
		read(x,y);
		solve(x,y);
	}
	return 0;
}
2022/6/27 10:03
加载中...