로곡 P4149 [IOI 2011] Race 포인트 치료 +dp
8581 단어 점수를 나누어 치료하다dp
낙곡P4149 [IOI2011]Race
k . -1.
시분치가 반드시 용납될 필요는 없다!!!중요한 얘기는 세 번!분명히 이 문제는 점분치이다.우리는 dpdp를 고려해서sumsum수 그룹 처리 경로의 길이가disdis인 두 점 사이의 최소 변수로 infinf가 존재하지 않는다면ans=min(ans,sum[k-dis[u]]+d[u])
로 이동합니다.매번 solve s o l v e 어떤 점 이후 폭력적으로 처리하지 않은 점의sum[dis] s u m[d i s]를 inf i n f로 직접 할당한다.마지막으로 매번sum[0]sum[0]에 00을 부여하면 됩니다.#include //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){
int x=0,f=1;char c=gc();
for (;!isdigit(c);c=gc()) f^=c=='-';
for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');
return f?x:-x;
}
template <typename mitsuha>
inline bool read(mitsuha &x){
x=0;int f=1;char c=gc();
for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';
if (!~c) return 0;
for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');
return x=f?x:-x,1;
}
template <typename mitsuha>
inline int write(mitsuha x){
if (!x) return 0&pc(48);
if (x<0) x=-x,pc('-');
int bit[20],i,p=0;
for (;x;x/=10) bit[++p]=x%10;
for (i=p;i;--i) pc(bit[i]+48);
return 0;
}
inline char fuhao(){
char c=gc();
for (;isspace(c);c=gc());
return c;
}
}using namespace chtholly;
using namespace std;
#define int ll
const int yuzu=2e6,mulu=1e7,inf=0x3f3f3f3f;
typedef int fuko[yuzu|10];
struct edge{int to,cost;};
vector lj[yuzu|10];
fuko sz,mxs,vis,d,dis;
int n,k,rt,nsz,xiao,ans=inf,sum[mulu|10];
/* 10 .*/
void grt(int u,int fa){
sz[u]=1,mxs[u]=0;
for (edge i:lj[u]){
int v=i.to,c=i.cost;
if (!vis[v]&&v^fa){
grt(v,u),sz[u]+=sz[v];
mxs[u]=max(mxs[u],sz[v]);
}
}
mxs[u]=max(mxs[u],nsz-mxs[u]);
if (mxs[u]void gdp(int u,int fa,int dep,int dist){
d[u]=dep,dis[u]=dist;
if (dis[u]>k) return;// RE.
ans=min(ans,sum[k-dis[u]]+d[u]);
for (edge i:lj[u]){
int v=i.to,c=i.cost;
if (v^fa&&!vis[v]) gdp(v,u,dep+1,dist+c);
}
}
void dfs(int u,int fa,bool nico){
sum[dis[u]]=nico?min(sum[dis[u]],d[u]):inf;
for (edge i:lj[u]){
int v=i.to;
if (!vis[v]&&v^fa) dfs(v,u,nico);
}
}
#define init(x) rt=0,nsz=x,xiao=inf
void solve(int u){
vis[u]=1,sum[0]=0;
for (edge i:lj[u]){
int v=i.to;
if (!vis[v]){
gdp(v,0,1,i.cost);//get u v .
dfs(v,0,true);
}
}
for (edge i:lj[u]){
int v=i.to;
if (!vis[v]) dfs(v,0,false);
}
for (edge i:lj[u]){
int v=i.to,c=i.cost;
if (!vis[v]){
init(sz[v]),grt(v,0);
solve(rt);
}
}
}
main(){
int i,j;n=read(),k=read();
for (i=1;iint u=read()+1,v=read()+1,c=read();// 0 .
lj[u].push_back(edge{v,c});
lj[v].push_back(edge{u,c});
}
fill(sum+1,sum+mulu+1,inf);
init(n),grt(1,0),solve(rt);
write(ans^inf?ans:-1);
}
/*
4 3
0 1 1
1 2 2
1 3 4
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 5977 Garden of Eden [에덴동산]시간이 촉박하면 가장 관건적인 고차원 접두사와 부분만 쓴다 사실 나도 처음에 이런 것을 몰랐지만 나도 해냈다. 나 자신은 그를 하나의 dp로 생각했다. 왜냐하면 접두사와 그 자체가 가장 짧은 dp이기 때문이다.dp의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.