Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
32793 LYLAKIOI 【BJ】T3 C++ 通过 100 1269 MS 104336 KB 4421 2024-10-01 08:55:48

Tests(26/26):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int maxn=2e5+10; int tim;vector<pair<pi,int> >vec[maxn]; void Ins(int l,int r,int k){ vec[l].p_b(m_p(m_p(l,r),k)); vec[r+1].p_b(m_p(m_p(l,r),-k)); } struct ODT { set<pair<pi,int> >st; void ins(int x){ auto it=st.lower_bound(m_p(m_p(x,x),0)); pi S=m_p(x,x); if(it!=st.end()&&(*it).p1.p1==x+1){ Ins((*it).p1.p1,(*it).p1.p2,tim-(*it).p2);S.p2=(*it).p1.p2; st.erase(*it); }it=st.lower_bound(m_p(m_p(x,x),0)); if(it!=st.begin()){--it; if((*it).p1.p2==x-1){ Ins((*it).p1.p1,(*it).p1.p2,tim-(*it).p2);S.p1=(*it).p1.p1; st.erase(*it); } }st.insert(m_p(S,tim)); }void del(int x){ auto it=st.lower_bound(m_p(m_p(x+1,0),0)); --it; Ins((*it).p1.p1,(*it).p1.p2,tim-(*it).p2); auto jt=*it;st.erase(it); pi S1,S2; S1.p1=jt.p1.p1,S1.p2=x-1; S2.p1=x+1,S2.p2=jt.p1.p2; if(S1.p1<=S1.p2)st.insert(m_p(S1,tim)); if(S2.p1<=S2.p2)st.insert(m_p(S2,tim)); }void clear(){ for(auto it:st)Ins(it.p1.p1,it.p1.p2,tim-it.p2);st.clear(); } }T[2]; int n,fa[maxn],dfn[maxn],siz[maxn],son[maxn],rnk[maxn],ct; vector<int>v[maxn]; void dfs(int u){ dfn[u]=++ct,siz[u]=1;rnk[ct]=u; for(int x:v[u])if(x!=fa[u]){ fa[x]=u;dfs(x),siz[u]+=siz[x]; if(siz[x]>siz[son[u]])son[u]=x; } } void Ins(int u){ T[0].del(u),T[1].ins(u); } void ins(int u){ up(i,dfn[u],dfn[u]+siz[u]-1)Ins(rnk[i]); } void dfs2(int u){ for(int x:v[u])if(x!=fa[u]&&x!=son[u])dfs2(x); if(son[u])dfs2(son[u]); for(int x:v[u])if(x!=fa[u]&&x!=son[u])ins(x); Ins(u);++tim; if(son[fa[u]]^u){ T[0].clear();T[1].clear(); T[0].st.insert(m_p(m_p(1,n),tim)); } } ll res[maxn]; struct Qu { int l,r,sgn,id; }; vector<Qu>Q[maxn]; struct nd { ll k,b; nd(){k=b=0;} nd(ll _k,ll _b){k=_k,b=_b;} }; nd operator+(nd a,nd b){ return nd(a.k+b.k,a.b+b.b); }nd operator*(nd a,int b){ return nd(a.k*b,a.b*b); }struct SegTree { struct node { nd sm,lz;int len; }d[maxn<<2]; #define sm(p) d[p].sm #define lz(p) d[p].lz #define len(p) d[p].len #define ls(p) (p<<1) #define rs(p) (p<<1|1) void pu(int p){sm(p)=sm(ls(p))+sm(rs(p));} void cl(int p,nd x){ lz(p)=lz(p)+x,sm(p)=sm(p)+x*len(p); }void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=nd(0,0);} void modify(int l,int r,int s,int t,int p,nd k){ if(l<=s&&t<=r){cl(p,k);return;}pd(p); int mid=s+t>>1; if(l<=mid)modify(l,r,s,mid,ls(p),k);if(r>=mid+1)modify(l,r,mid+1,t,rs(p),k);pu(p); }nd qry(int l,int r,int s,int t,int p){ if(l<=s&&t<=r)return sm(p);pd(p); int mid=s+t>>1;nd res(0,0); if(l<=mid)res=res+qry(l,r,s,mid,ls(p));if(r>=mid+1)res=res+qry(l,r,mid+1,t,rs(p)); return res; } void bd(int l,int r,int p){ len(p)=r-l+1;if(l==r)return; int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p)); } }Tree; void slv(){ n=read(); up(i,1,n-1){ int x=read(),y=read(); v[x].p_b(y),v[y].p_b(x); }dfs(1);T[0].st.insert(m_p(m_p(1,n),tim));dfs2(1); int q=read();up(i,1,q){ int l=read(),r=read(); Q[r].p_b((Qu){l,r,1,i}); Q[l-1].p_b((Qu){l,r,-1,i}); }Tree.bd(1,n,1); Tree.modify(1,n,1,n,1,nd(n,0)); up(i,1,n){ for(auto it:vec[i])Tree.modify(it.p1.p1,it.p1.p2,1,n,1,nd(-it.p2,it.p2*1ll*(i-1))); for(auto it:Q[i]){ nd w=Tree.qry(it.l,it.r,1,n,1); res[it.id]+=(i*1ll*w.k+w.b)*1ll*it.sgn; } }up(i,1,q)printf("%lld\n",res[i]/2); }int main(){ //freopen("tree.in","r",stdin); //freopen("tree.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }


测评信息: