QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#87184 | #5439. Meet in the Middle | ExplodingKonjac | WA | 42ms | 15980kb | C++17 | 6.6kb | 2023-03-11 21:18:48 | 2023-03-11 21:18:51 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
//#define OPENIOBUF
namespace FastIO
{
class FastIOBase
{
protected:
#ifdef OPENIOBUF
static const int BUFSIZE=1<<22;
char buf[BUFSIZE+1];
int buf_p=0;
#endif
FILE *target;
public:
#ifdef OPENIOBUF
virtual void flush()=0;
#endif
FastIOBase(FILE *f): target(f){}
~FastIOBase()=default;
};
class FastOutput: public FastIOBase
{
#ifdef OPENIOBUF
public:
inline void flush()
{ fwrite(buf,1,buf_p,target),buf_p=0; }
#endif
protected:
inline void __putc(char x)
{
#ifdef OPENIOBUF
if(buf[buf_p++]=x,buf_p==BUFSIZE)flush();
#else
putc(x,target);
#endif
}
template<typename T>
inline void __write(T x)
{
static char stk[64],*top;top=stk;
if(x<0) return __putc('-'),__write(-x);
do *(top++)=x%10,x/=10; while(x);
for(;top!=stk;__putc(*(--top)+'0'));
}
public:
FastOutput(FILE *f=stdout): FastIOBase(f){}
#ifdef OPENIOBUF
inline void setTarget(FILE *f) { this->flush(),target=f; }
~FastOutput(){ flush(); }
#else
inline void setTarget(FILE *f) { target=f; }
#endif
template<typename ...T>
inline void writesp(const T &...x)
{ initializer_list<int>{(this->operator<<(x),__putc(' '),0)...}; }
template<typename ...T>
inline void writeln(const T &...x)
{ initializer_list<int>{(this->operator<<(x),__putc('\n'),0)...}; }
inline FastOutput &operator <<(char x)
{ return __putc(x),*this; }
inline FastOutput &operator <<(const char *s)
{ for(;*s;__putc(*(s++)));return *this; }
inline FastOutput &operator <<(const string &s)
{ return (*this)<<s.c_str(); }
template<typename T,typename=typename enable_if<is_integral<T>::value>::type>
inline FastOutput &operator <<(const T &x)
{ return __write(x),*this; }
}qout;
class FastInput: public FastIOBase
{
#ifdef OPENIOBUF
public:
inline void flush()
{ buf[fread(buf,1,BUFSIZE,target)]='\0',buf_p=0; }
#endif
protected:
inline char __getc()
{
#ifdef OPENIOBUF
if(buf_p==BUFSIZE) flush();
return buf[buf_p++];
#else
return getc(target);
#endif
}
public:
#ifdef OPENIOBUF
FastInput(FILE *f=stdin): FastIOBase(f){ buf_p=BUFSIZE; }
inline void setTarget(FILE *f) { this->flush(),target=f; }
#else
FastInput(FILE *f=stdin): FastIOBase(f){}
inline void setTarget(FILE *f) { target=f; }
#endif
inline char getchar() { return __getc(); }
template<typename ...T>
inline void read(T &...x)
{ initializer_list<int>{(this->operator>>(x),0)...}; }
inline FastInput &operator >>(char &x)
{ while(isspace(x=__getc()));return *this; }
template<typename T,typename=typename enable_if<is_integral<T>::value>::type>
inline FastInput &operator >>(T &x)
{
static char ch,sym;x=sym=0;
while(isspace(ch=__getc()));
if(ch=='-') sym=1,ch=__getc();
for(;isdigit(ch);x=(x<<1)+(x<<3)+(ch^48),ch=__getc());
return sym?x=-x:x,*this;
}
inline FastInput &operator >>(char *s)
{
while(isspace(*s=__getc()));
for(;!isspace(*s) && *s && ~*s;*(++s)=__getc());
return *s='\0',*this;
}
inline FastInput &operator >>(string &s)
{
char str_buf[(1<<8)+1],*p=str_buf;
char *const buf_end=str_buf+(1<<8);
while(isspace(*p=__getc()));
for(s.clear(),p++;;p=str_buf)
{
for(;p!=buf_end && !isspace(*p=__getc()) && *p && ~*p;p++);
*p='\0',s.append(str_buf);
if(p!=buf_end) break;
}
return *this;
}
}qin;
} // namespace FastIO
using namespace FastIO;
using LL=long long;
using LD=long double;
using UI=unsigned int;
using ULL=unsigned long long;
#ifndef DADALZY
#define FILEIO(file) freopen(file".in","r",stdin),freopen(file".out","w",stdout)
#else
#define FILEIO(file)
#endif
int n,q;
vector<pair<int,int>> g1[100005],g2[100005];
LL d1[100005],d2[100005];
int dfn,lb[100005],rb[100005],ord[100005];
int nn,dep[100005],pos[100005],eul[200005],f[200005][20];
void dfs1(int u,int fa=0)
{
ord[++dfn]=u,lb[u]=dfn;
for(auto &[v,w]: g1[u])
{
if(v==fa) continue;
d1[v]=d1[u]+w;
dfs1(v,u);
}
rb[u]=dfn;
}
void dfs2(int u,int fa=0)
{
dep[u]=dep[fa]+1;
eul[pos[u]=++nn]=u;
for(auto &[v,w]: g2[u])
{
if(v==fa) continue;
d2[v]=d2[u]+w;
dfs2(v,u),eul[++nn]=u;
}
}
inline bool cmpd(int x,int y) { return dep[x]<dep[y]; }
void prework()
{
for(int i=1;i<=nn;i++) f[i][0]=i;
for(int j=1;(1<<j)<=nn;j++)
for(int i=1;i+(1<<j)-1<=nn;i++)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1],cmpd);
}
inline int lca(int u,int v)
{
tie(u,v)=minmax(pos[u],pos[v]);
int s=__lg(v-u+1);
return min(f[u][s],f[v-(1<<s)+1][s],cmpd);
}
inline LL dis(int u,int v)
{
int l=lca(u,v);
return d2[u]+d2[v]-2*d2[l];
}
struct TreeNode{ array<LL,2> u,w;LL mx,tag; }t[400005];
#define LC (i<<1)
#define RC (i<<1|1)
inline void pushTag(int i,LL x)
{
t[i].tag+=x;
t[i].mx+=(x<<1);
t[i].w[0]+=x,t[i].w[1]+=x;
}
inline void pushdown(int i)
{
if(!t[i].tag) return;
pushTag(LC,t[i].tag);
pushTag(RC,t[i].tag);
t[i].tag=0;
}
inline void pushup(int i)
{
if(t[LC].mx<t[RC].mx) t[i].u=t[LC].u,t[i].w=t[LC].w,t[i].mx=t[LC].mx;
else t[i].u=t[RC].u,t[i].w=t[RC].w,t[i].mx=t[RC].mx;
for(int i: {0,1}) for(int j: {0,1})
{
int tmp=dis(t[LC].u[i],t[RC].u[j])+t[LC].w[i]+t[RC].w[j];
if(tmp<=t[i].mx) continue;
t[i].mx=tmp;
t[i].u={t[LC].u[i],t[RC].u[j]};
t[i].w={t[LC].w[i],t[RC].w[j]};
}
}
void build(int l,int r,int i=1)
{
if(l==r)
{
int x=ord[l];
t[i].u={x,x},t[i].mx=d1[x]<<1;
t[i].w={d1[x],d1[x]};
return;
}
int mid=(l+r)>>1;
build(l,mid,LC),build(mid+1,r,RC);
pushup(i);
}
void modify(int lq,int rq,LL x,int i=1,int l=1,int r=n)
{
if(l>=lq && r<=rq) return pushTag(i,x);
int mid=(l+r)>>1;
pushdown(i);
if(mid>=lq) modify(lq,rq,x,LC,l,mid);
if(mid<rq) modify(lq,rq,x,RC,mid+1,r);
pushup(i);
}
vector<pair<int,int>> ask[100005];
LL ans[500005];
void solve(int u,int fa=0)
{
for(auto &[v,id]: ask[u])
ans[id]=max(dis(t[1].u[0],v)+t[1].w[0],
dis(t[1].u[1],v)+t[1].w[1]);
for(auto &[v,w]: g1[u])
{
if(v==fa) continue;
modify(lb[v],rb[v],-w);
if(lb[v]>1) modify(1,lb[v]-1,w);
if(rb[v]<n) modify(rb[v]+1,n,w);
solve(v,u);
modify(lb[v],rb[v],w);
if(lb[v]>1) modify(1,lb[v]-1,-w);
if(rb[v]<n) modify(rb[v]+1,n,-w);
}
}
int main()
{
qin>>n>>q;
for(int i=1,u,v,w;i<n;i++)
{
qin>>u>>v>>w;
g1[u].emplace_back(v,w);
g1[v].emplace_back(u,w);
}
for(int i=1,u,v,w;i<n;i++)
{
qin>>u>>v>>w;
g2[u].emplace_back(v,w);
g2[v].emplace_back(u,w);
}
dfs1(1),dfs2(1);
prework(),build(1,n);
for(int i=1,u,v;i<=q;i++)
{
qin>>u>>v;
ask[u].emplace_back(v,i);
}
solve(1);
for(int i=1;i<=q;i++) qout<<ans[i]<<'\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 10416kb
input:
3 4 1 2 1 2 3 2 1 2 2 2 3 1 1 1 1 2 2 1 2 2
output:
6 4 5 3
result:
ok 4 number(s): "6 4 5 3"
Test #2:
score: 0
Accepted
time: 2ms
memory: 10376kb
input:
2 1 1 2 1 1 2 1 1 1
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: 0
Accepted
time: 1ms
memory: 10412kb
input:
2 1 1 2 1 1 2 1 1 2
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: -100
Wrong Answer
time: 42ms
memory: 15980kb
input:
10000 50000 8101 5996 108427744 5996 7605 870838849 5996 5599 603303696 8101 3006 339377417 8101 6463 442516687 6463 5560 109174079 5560 4063 127596224 3006 1682 947915262 5996 1986 130416311 6463 5455 279771516 6463 2634 516688796 4063 3034 217886863 7605 5092 742375061 5599 2266 193804402 5092 140...
output:
184665389669 286644449644 254554914642 286504800401 99606023919 213853609411 228337113956 277740251564 229749495044 470724746150 330277274645 311061873692 274636332207 132028979357 241418835257 212753189275 169790101825 264778718626 196951658811 393660732844 171350222840 306765917921 169871566118 24...
result:
wrong answer 1st numbers differ - expected: '647838384844', found: '184665389669'