QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#133119 | #6629. Travelling Trader | PCTprobability# | 0 | 184ms | 819032kb | C++14 | 12.2kb | 2023-08-01 15:55:07 | 2024-07-04 01:06:30 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#if __has_include(<atcoder/all>)
#include <atcoder/all>
using namespace atcoder;
#endif
using ll = int;
using ld = long double;
using ull = unsigned long long;
#define endl "\n"
typedef pair<int, int> Pii;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REP3(i, m, n) for (int i = (m); (i) < int(n); ++ (i))
#define rep(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define ALL(x) begin(x), end(x)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(s) (s).begin(),(s).end()
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define drep(i, n) drep2(i, n, 0)
#define rever(vec) reverse(vec.begin(), vec.end())
#define sor(vec) sort(vec.begin(), vec.end())
#define fi first
#define FOR_(n) for (ll _ = 0; (_) < (ll)(n); ++(_))
#define FOR(i, n) for (ll i = 0; (i) < (ll)(n); ++(i))
#define se second
#define pb push_back
#define P pair<ll,ll>
#define PQminll priority_queue<ll, vector<ll>, greater<ll>>
#define PQmaxll priority_queue<ll,vector<ll>,less<ll>>
#define PQminP priority_queue<P, vector<P>, greater<P>>
#define PQmaxP priority_queue<P,vector<P>,less<P>>
#define NP next_permutation
//const ll mod = 1000000009;
//const ll mod = 998244353;
const ll mod = 1000000007;
const ll inf = 4100000000000000000ll;
const ld eps = ld(0.00000000001);
static const long double pi = 3.141592653589793;
template<class T>void vcin(vector<T> &n){for(int i=0;i<int(n.size());i++) cin>>n[i];}
template<class T,class K>void vcin(vector<T> &n,vector<K> &m){for(int i=0;i<int(n.size());i++) cin>>n[i]>>m[i];}
template<class T>void vcout(vector<T> &n){for(int i=0;i<int(n.size());i++){cout<<n[i]<<" ";}cout<<endl;}
template<class T>void vcin(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cin>>n[i][j];}}}
template<class T>void vcout(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cout<<n[i][j]<<" ";}cout<<endl;}cout<<endl;}
void yes(bool a){cout<<(a?"yes":"no")<<endl;}
void YES(bool a){cout<<(a?"YES":"NO")<<endl;}
void Yes(bool a){cout<<(a?"Yes":"No")<<endl;}
void possible(bool a){ cout<<(a?"possible":"impossible")<<endl; }
void Possible(bool a){ cout<<(a?"Possible":"Impossible")<<endl; }
void POSSIBLE(bool a){ cout<<(a?"POSSIBLE":"IMPOSSIBLE")<<endl; }
#define FOR_R(i, n) for (ll i = (ll)(n)-1; (i) >= 0; --(i))
template<class T>auto min(const T& a){ return *min_element(all(a)); }
template<class T>auto max(const T& a){ return *max_element(all(a)); }
template<class T,class F>void print(pair<T,F> a){cout<<a.fi<<" "<<a.se<<endl;}
template<class T>bool chmax(T &a,const T b) { if (a<b) { a=b; return 1; } return 0;}
template<class T>bool chmin(T &a,const T b) { if (b<a) { a=b; return 1; } return 0;}
template<class T> void ifmin(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
template<class T> void ifmax(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
ll fastgcd(ll u,ll v){ll shl=0;while(u&&v&&u!=v){bool eu=!(u&1);bool ev=!(v&1);if(eu&&ev){++shl;u>>=1;v>>=1;}else if(eu&&!ev){u>>=1;}else if(!eu&&ev){v>>=1;}else if(u>=v){u=(u-v)>>1;}else{ll tmp=u;u=(v-u)>>1;v=tmp;}}return !u?v<<shl:u<<shl;}
ll modPow(ll a, ll n, ll mod) { if(mod==1) return 0;ll ret = 1; ll p = a % mod; while (n) { if (n & 1) ret = ret * p % mod; p = p * p % mod; n >>= 1; } return ret; }
vector<ll> divisor(ll x){ vector<ll> ans; for(ll i = 1; i * i <= x; i++){ if(x % i == 0) {ans.push_back(i); if(i*i!=x){ ans.push_back(x / ans[i]);}}}sor(ans); return ans; }
ll pop(ll x){return __builtin_popcountll(x);}
ll poplong(ll x){ll y=-1;while(x){x/=2;y++;}return y;}
P hyou(P a){ll x=fastgcd(abs(a.fi),abs(a.se));a.fi/=x;a.se/=x;if(a.se<0){a.fi*=-1;a.se*=-1;}return a;}
P Pplus(P a,P b){ return hyou({a.fi*b.se+b.fi*a.se,a.se*b.se});}
P Ptimes(P a,ll b){ return hyou({a.fi*b,a.se});}
P Ptimes(P a,P b){ return hyou({a.fi*b.fi,a.se*b.se});}
P Pminus(P a,P b){ return hyou({a.fi*b.se-b.fi*a.se,a.se*b.se});}
P Pgyaku(P a){ return hyou({a.se,a.fi});}
template<class T>
struct Sum{
vector<T> data;
Sum(const vector<T>& v):data(v.size()+1){
for(ll i=0;i<v.size();i++) data[i+1]=data[i]+v[i];
}
T get(ll l,ll r) const {
return data[r]-data[l];
}
};
template<class T>
struct Sum2{
vector<vector<T>> data;
Sum2(const vector<vector<T>> &v):data(v.size()+1,vector<T>(v[0].size()+1)){
for(int i=0;i<v.size();i++) for(int j=0;j<v[i].size();j++) data[i+1][j+1]=data[i][j+1]+v[i][j];
for(int i=0;i<v.size();i++) for(int j=0;j<v[i].size();j++) data[i+1][j+1]+=data[i+1][j];
}
T get(ll x1,ll y1,ll x2,ll y2) const {
return data[x2][y2]+data[x1][y1]-data[x1][y2]-data[x2][y1];
}
};
void cincout(){
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
cout<< fixed << setprecision(15);
}
vector<ll> g[200000];
vector<ll> ans;
ll use[200000];
ll p[200000];
ll dp[200000][2][3];
deque<ll> way[200000][2][3];
int dfs(int a,int b,int x){
for(auto e:g[a]){
if(e==b) continue;
if(x==0){
use[a]=1;
ans.pb(a);
x=3;
}
x=dfs(e,a,x-1);
x--;
}
if(use[a]==0){
use[a]=1;
ans.pb(a);
x=3;
}
return x;
}
bool dfs3(int a,int b,int idx){
if(a==idx){
ans.pb(a);
return true;
}
for(auto e:g[a]){
if(e==b) continue;
if(dfs3(e,a,idx)){
ans.pb(a);
return true;
}
}
return false;
}
void dfs2(int a,int b){
for(auto e:g[a]){
if(e==b) continue;
p[e]+=p[a];
dfs2(e,a);
}
}
void Merge(deque<ll> &a,deque<ll> b){
for(auto e:b) a.pb(e);
}
void solve(int i,int b){
vector<int> v;
for(auto e:g[i]){
if(e==b) continue;
solve(e,i);
v.pb(e);
}
dp[i][0][1]=p[i];
way[i][0][1]={i};
dp[i][0][0]=p[i];
ll idx=0,m=-inf;
for(auto e:v) if(chmax(m,dp[e][0][0]-dp[e][0][1])) idx=e;
dp[i][1][1]=p[i];
for(auto e:v){
if(e==idx) dp[i][1][1]+=dp[e][0][0];
else dp[i][1][1]+=dp[e][0][1];
}
dp[i][0][0]=dp[i][1][1];
for(auto e:v){
if(e!=idx) Merge(way[i][1][1],way[e][0][1]);
}
for(auto e:v){
if(e==idx) Merge(way[i][1][1],way[e][0][0]);
}
Merge(way[i][1][1],{i});
Merge(way[i][0][0],{i});
for(auto e:v){
if(e==idx) Merge(way[i][0][0],way[e][1][1]);
}
for(auto e:v){
if(e!=idx) Merge(way[i][0][0],way[e][0][1]);
}
ll sum=0;
for(auto e:v) sum+=dp[e][0][1];
dp[i][1][2]=p[i];
way[i][1][2]={i};
vector<P> A,B,C;
if(v.size()){
multiset<P> X,Y,Z;
for(int j=0;j<v.size();j++){
X.insert({dp[v[j]][0][0]-dp[v[j]][0][1],v[j]});
Y.insert({dp[v[j]][1][1]-dp[v[j]][0][1],v[j]});
Z.insert({dp[v[j]][0][2]-dp[v[j]][0][1],v[j]});
}
auto itr=X.end();
itr--;
for(int i=0;i<3;i++){
A.pb((*itr));
if(itr==X.begin()) break;
itr--;
}
auto itr2=Y.end();
itr2--;
for(int i=0;i<3;i++){
B.pb((*itr2));
if(itr2==Y.begin()) break;
itr2--;
}
auto itr3=Z.end();
itr3--;
for(int i=0;i<3;i++){
C.pb((*itr3));
if(itr3==Z.begin()) break;
itr3--;
}
sor(A);
sor(B);
sor(C);
rever(A);
rever(B);
rever(C);
}
for(int ii2=0;ii2<int(v.size())&&ii2<3;ii2++){
for(int j2=0;j2<int(v.size())&&j2<3;j2++){
for(int k2=0;k2<int(v.size())&&k2<3;k2++){
int ii=A[ii2].se,j=B[j2].se,k=C[k2].se;
if(ii==j||j==k||k==ii) continue;
ll sum2=sum;
sum2-=dp[ii][0][1]+dp[j][0][1]+dp[k][0][1];
sum2+=dp[ii][0][0]+dp[j][1][1]+dp[k][0][2];
sum2+=p[i];
chmax(dp[i][1][2],sum2);
}
}
}
for(int ii=0;ii<int(v.size());ii++){
for(int k=0;k<int(v.size());k++){
if(k==ii) continue;
ll sum2=sum;
sum2-=dp[v[ii]][0][1]+dp[v[k]][0][1];
sum2+=dp[v[ii]][0][0]+dp[v[k]][1][2];
sum2+=p[i];
chmax(dp[i][1][2],sum2);
}
}
for(int k=0;k<int(v.size());k++){
ll sum2=sum;
sum2-=dp[v[k]][0][1];
sum2+=dp[v[k]][1][2];
sum2+=p[i];
chmax(dp[i][1][2],sum2);
}
for(int ii2=0;ii2<int(v.size())&&ii2<3;ii2++){
for(int j2=0;j2<int(v.size())&&j2<3;j2++){
for(int k2=0;k2<int(v.size())&&k2<3;k2++){
int ii=A[ii2].se,j=B[j2].se,k=C[k2].se;
if(ii==j||j==k||k==ii) continue;
ll sum2=sum;
sum2-=dp[ii][0][1]+dp[j][0][1]+dp[k][0][1];
sum2+=dp[ii][0][0]+dp[j][1][1]+dp[k][0][2];
sum2+=p[i];
if(dp[i][1][2]==sum2&&way[i][1][2].size()==1){
way[i][1][2]={};
for(int l=0;l<v.size();l++){
if(v[l]!=ii&&v[l]!=j&&v[l]!=k) Merge(way[i][1][2],way[v[l]][0][1]);
}
Merge(way[i][1][2],way[ii][0][0]);
Merge(way[i][1][2],{i});
Merge(way[i][1][2],way[j][1][1]);
Merge(way[i][1][2],way[k][0][2]);
}
}
}
}
for(int ii=0;ii<int(v.size());ii++){
for(int k=0;k<int(v.size());k++){
if(k==ii) continue;
ll sum2=sum;
sum2-=dp[v[ii]][0][1]+dp[v[k]][0][1];
sum2+=dp[v[ii]][0][0]+dp[v[k]][1][2];
sum2+=p[i];
if(dp[i][1][2]==sum2&&way[i][1][2].size()==1){
if(i==3){
// cout<<"IIK"<<" "<<v[ii]<<" "<<v[k]<<endl;
}
way[i][1][2]={};
for(int l=0;l<v.size();l++){
if(l!=ii&&l!=k) Merge(way[i][1][2],way[v[l]][0][1]);
}
Merge(way[i][1][2],way[v[ii]][0][0]);
Merge(way[i][1][2],{i});
Merge(way[i][1][2],way[v[k]][1][2]);
}
}
}
for(int k=0;k<int(v.size());k++){
ll sum2=sum;
sum2-=dp[v[k]][0][1];
sum2+=dp[v[k]][1][2];
sum2+=p[i];
if(dp[i][1][2]==sum2&&way[i][1][2].size()==1){
way[i][1][2]={};
for(int l=0;l<int(v.size());l++){
if(l!=k) Merge(way[i][1][2],way[v[l]][0][1]);
}
Merge(way[i][1][2],{i});
Merge(way[i][1][2],way[v[k]][1][2]);
}
}
way[i][0][2]={i};
dp[i][0][2]=p[i];
for(int j=0;j<int(v.size());j++){
for(int k=0;k<int(v.size());k++){
if(j==k) continue;
ll sum2=sum;
sum2-=dp[v[j]][0][1]+dp[v[k]][0][1];
sum2+=dp[v[j]][1][1]+dp[v[k]][0][2];
sum2+=p[i];
chmax(dp[i][0][2],sum2);
}
}
for(int j=0;j<int(v.size());j++){
for(int k=0;k<int(v.size());k++){
if(j==k) continue;
ll sum2=sum;
sum2-=dp[v[j]][0][1]+dp[v[k]][0][1];
sum2+=dp[v[j]][1][1]+dp[v[k]][0][2];
sum2+=p[i];
if(dp[i][0][2]==sum2&&way[i][0][2].size()==1){
way[i][0][2]={i};
Merge(way[i][0][2],way[v[j]][1][1]);
for(int l=0;l<v.size();l++){
if(l!=j&&l!=k) Merge(way[i][0][2],way[v[l]][0][1]);
}
Merge(way[i][0][2],way[v[k]][0][2]);
}
}
}
for(int j=0;j<v.size();j++){
if(chmax(dp[i][0][2],dp[v[j]][1][2]+p[i])){
way[i][0][2]={i};
Merge(way[i][0][2],way[v[j]][1][2]);
}
}
/* cout<<i<<endl;
for(auto e:way[i][1][2]) cout<<e<<" ";
cout<<endl;
for(auto e:way[i][0][2]) cout<<e<<" ";
cout<<endl;
for(auto e:way[i][0][0]) cout<<e<<" ";
cout<<endl;
for(auto e:way[i][1][1]) cout<<e<<" ";
cout<<endl; */
}
int main() {
cincout();
ll n,k;
cin>>n>>k;
if(k==3){
for(int i=0;i<n-1;i++){
ll a,b;
cin>>a>>b;
a--;
b--;
g[a].pb(b);
g[b].pb(a);
}
ll sum=0;
for(int i=0;i<n;i++){
ll x;
cin>>x;
sum+=x;
}
dfs(0,-1,0);
cout<<sum<<endl;
cout<<n<<endl;
for(int i=0;i<n;i++) cout<<ans[i]+1<<" ";
cout<<endl;
return 0;
}
if(k==1){
for(int i=0;i<n-1;i++){
ll a,b;
cin>>a>>b;
a--;
b--;
g[a].pb(b);
g[b].pb(a);
}
for(int i=0;i<n;i++){
cin>>p[i];
}
dfs2(0,-1);
ll m=-inf,idx=0;
for(int i=0;i<n;i++) if(chmax(m,p[i])) idx=i;
cout<<p[idx]<<endl;
dfs3(0,-1,idx);
cout<<ans.size()<<endl;
rever(ans);
for(auto e:ans) cout<<e+1<<" ";
cout<<endl;
return 0;
}
if(k==2){
for(int i=0;i<n-1;i++){
ll a,b;
cin>>a>>b;
a--;
b--;
g[a].pb(b);
g[b].pb(a);
}
for(int i=0;i<n;i++){
cin>>p[i];
}
solve(0,-1);
cout<<dp[0][0][2]<<endl;
cout<<way[0][0][2].size()<<endl;
for(auto e:way[0][0][2]) cout<<e+1<<" ";
cout<<endl;
}
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 2
Accepted
time: 103ms
memory: 818696kb
input:
2 1 1 2 255959470 961356354
output:
1217315824 2 1 2
result:
ok correct!
Test #2:
score: -2
Wrong Answer
time: 112ms
memory: 818736kb
input:
1000 1 730 89 762 280 923 523 740 22 679 350 448 769 102 712 154 965 219 32 238 289 484 502 183 311 999 682 806 450 275 101 131 197 749 720 131 937 960 202 503 320 95 262 595 133 809 560 659 451 843 218 258 842 564 316 729 727 413 237 606 531 469 258 612 8 707 539 359 680 957 639 381 708 104 490 234...
output:
4395 1 1
result:
wrong answer your profit is 4395 but jury's plan is 95535, your plan is not optimal!
Subtask #2:
score: 0
Wrong Answer
Test #12:
score: 7
Accepted
time: 153ms
memory: 818960kb
input:
2 2 2 1 243296356 635616793
output:
878913149 2 1 2
result:
ok correct!
Test #13:
score: 0
Accepted
time: 120ms
memory: 818780kb
input:
10 2 6 4 3 7 5 10 6 10 8 2 3 9 3 5 4 2 1 4 2 4 2 5 5 4 2 3 4 2
output:
33 10 1 2 8 4 6 10 5 7 3 9
result:
ok correct!
Test #14:
score: -7
Wrong Answer
time: 184ms
memory: 819032kb
input:
200 2 150 170 21 33 96 152 143 26 136 70 92 159 34 164 163 182 74 115 93 61 151 83 81 119 10 146 114 170 39 83 139 4 173 41 193 96 87 57 14 164 107 51 45 15 157 17 43 183 96 30 11 137 55 18 138 81 87 12 112 122 159 82 195 185 75 71 16 191 33 88 70 195 149 114 106 160 96 118 92 44 9 141 107 143 151 2...
output:
972107044 1 1
result:
wrong answer your profit is 972107044 but jury's plan is 57921623677, your plan is not optimal!
Subtask #3:
score: 0
Skipped
Dependency #2:
0%
Subtask #4:
score: 0
Skipped
Dependency #3:
0%
Subtask #5:
score: 0
Wrong Answer
Test #83:
score: 0
Wrong Answer
time: 139ms
memory: 816868kb
input:
2000 3 1359 90 1703 163 158 188 360 1501 195 664 1414 215 1546 1756 536 1096 1726 1223 1150 104 1757 703 1982 282 1023 998 1180 419 576 1759 1496 1993 44 670 1703 952 855 849 1998 1399 1280 980 1533 1090 1270 678 1680 387 469 1734 1799 263 473 588 303 226 5 295 1489 1471 1094 1667 1912 210 1368 1360...
output:
-705863364 2000 1 379 1954 1539 605 1300 1823 1866 1840 867 709 88 916 1526 1238 773 1919 816 1788 832 297 1349 1808 1428 183 863 951 1522 301 775 1265 936 1087 1672 565 1963 1330 926 1325 524 1334 36 46 1231 240 665 1376 289 1427 1319 1076 1880 1668 81 1504 1561 1987 1404 1630 1809 1354 295 1084 74...
result:
wrong answer your claimed profit is -705863364 but the profit of your plan is 1008611451196
Subtask #6:
score: 0
Skipped
Dependency #5:
0%