QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#620850 | #8235. Top Cluster | Soestx | WA | 0ms | 12140kb | C++23 | 2.8kb | 2024-10-07 21:47:15 | 2024-10-07 21:47:16 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pll pair<int,int>
#define lowbit(x) (x&(-x))
typedef long long ll;
//typedef unsigned long long ull;
const int N = 1e6 + 10, M = 5e5, mod = 1e9+7;
const double eps=1e-11;
int n, m, k;
int res,ans;
int num[N],mp[N];
namespace Gra
{
vector<pll> vt[N];
int fa[N][30],dep[N],dp[N];
void dfs(int id,int f)
{
cout<<id<<" "<<dp[id]<<endl;
for(int i=1;(1<<i)<dep[id];i++)
{
fa[id][i]=fa[fa[id][i-1]][i-1];
}
for(auto it:vt[id])
{
int j=it.fi;
if(j==f) continue;
fa[j][0]=id;
dep[j]=dep[id]+1;
dp[j]=dp[id]+it.se;
dfs(j,id);
}
}
int lca(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
if(dep[a]!=dep[b])
{
int k=log2(dep[a]-dep[b]);
for(int i=k;i>=0;i--)
{
if(dep[fa[a][i]]>=dep[b]) a=fa[a][i];
}
}
if(a==b) return a;
int k=log2(dep[a]);
for(int i=k;i>=0;i--)
{
if(fa[a][i]==fa[b][i]) continue;
a=fa[a][i];
b=fa[b][i];
}
return fa[a][0];
}
void run()
{
fa[1][0]=1;
dep[1]=1;
dfs(1,-1);
}
int get(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
int d=lca(a,b);
if(b==d) return dp[a]-dp[d];
return dp[a]+dp[b]-2*dp[d];
}
}
int L[N],R[N];
bool check(int mid,int x,int k)
{
if(mid==0) return 1;
int dl=Gra::get(x,L[mid]),dr=Gra::get(x,R[mid]);
//cout<<mid<<" "<<x<<" "<<k<<" "<<L[mid]<<" "<<R[mid]<<" "<<dl<<" "<<dr<<endl;
return (dl<=k&&dr<=k);
}
void solve() {
cin>>n>>m;
vector<pll> vt;
vt.push_back({-1,-1});
int lim=m;
for(int i=1;i<=n;i++)
{
cin>>num[i];
vt.push_back({num[i],i});
}
sort(vt.begin(),vt.end());
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
Gra::vt[u].push_back({v,w});
Gra::vt[v].push_back({u,w});
}
Gra::run();
for(int i=1;i<=m;i++)
{
if(vt[i].first!=vt[i-1].first+1)
{
lim=i-1;
break;
}
if(i==1)
{
L[i]=R[i]=vt[i].se;
continue;
}
int u=L[i-1],v=R[i-1];
int dis=Gra::get(u,v);
int dl=Gra::get(u,vt[i].se),dr=Gra::get(v,vt[i].se);
//cout<<u<<" "<<v<<" "<<dis<<" "<<dl<<" "<<dr<<" "<<vt[i].se<<endl;
if(dl>=dr&&dl>dis) L[i]=L[i-1],R[i]=vt[i].se;
else if(dr>=dl&&dr>dis) L[i]=vt[i].se,R[i]=R[i-1];
else L[i]=L[i-1],R[i]=R[i-1];
}
//cout<<lim<<"---"<<endl;
//for(int i=1;i<=lim;i++) cout<<i<<" "<<vt[i].fi<<" "<<L[i]<<" "<<R[i]<<endl;
while(m--)
{
int x,k;
cin>>x>>k;
int l=0,r=lim;
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid,x,k)) l=mid;
else r=mid-1;
}
cout<<vt[l].fi+1<<endl;
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
T = 1;
//cin >> T;
while (T--) solve();
return 0;
}
/*
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 12140kb
input:
5 4 3 9 0 1 2 1 2 10 3 1 4 3 4 3 3 5 2 3 0 1 0 4 6 4 7
output:
1 0 2 10 3 4 4 7 5 6 1 0 3 4
result:
wrong answer 3rd numbers differ - expected: '3', found: '2'