# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1064493 | anango | 휴가 (IOI14_holiday) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "friend.h"
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define mex max
int INF = 1LL<<60;
// Find out best sample
signed findSample(signed n,signed confidence[],signed host[],signed protocol[]){
int ans=10;
//let 0 denote i, 1 denote the friends of i
//let dp0[i] = answer if we are allowed 0 or 1
//dp1[i] = answer if we're only allowed 0
//dp2[i] = answer if we're only allowed 1
//dp3[i] = answer if we're allowed neither
//in the subtree of i
//actually,
//dp0[i] = answer if we didn't use any friends of i so far
//dp1[i] = answer if we did use some friend of i so far
//no it doesn't work
//dp0[i] = answer if we didn't use i
//dp1[i] = answer if we did use i
vector<int> dp0(n,0);
vector<int> dp1;
for (int i=0; i<n; i++) dp1.push_back(confidence[i]);
for (int i=n-1; i>=1; i--) {
int parent = host[i];
int jambloooooooooatautautau = protocol[i];
int x = dp0[parent];
int y = dp1[parent];
int z = dp0[i];
int w = dp1[i];
int newx = -INF;
int newy = -INF;
if (jambloooooooooatautautau==0) {
newx=x+w;
newy=y+z;
}
else if (jambloooooooooatautautau==1) {
newx=x+z;
newy=y+w;
}
else if (jambloooooooooatautautau==2) {
newx=x+z;
newy=max(y+z,x+w);
}
dp0[parent] = newx;
dp1[parent] = newy;
dp1[parent]=max(dp0[parent],dp1[parent]);
//cout << "transition " << jambloooooooooatautautau <<" " << i <<" " << x<< " " << y <<" " <<z <<" " << w <<" " << newx <<" " << newy << endl;
}
for (int i=0; i<n; i++) {
//cout << i <<" " << dp0[i] <<" " << dp1[i] << endl;
}
int mans = max(dp0[0],dp1[0]);
return mans;
}