| 比赛 |
2026.4.11 |
评测结果 |
AAAAAAAAAAA |
| 题目名称 |
rldcot |
最终得分 |
100 |
| 用户昵称 |
RpUtl |
运行时间 |
2.264 s |
| 代码语言 |
C++ |
内存使用 |
21.02 MiB |
| 提交时间 |
2026-04-11 12:11:33 |
显示代码纯文本
#include <bits/stdc++.h>
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=1e5+10;
const int M=5e5+10;
int ver[N],to[N<<1],nxt[N<<1],val[N<<1],idx;
int siz[N],son[N],n,m,q,l[M],ans[M],pos[N];
long long c[N],b[N];
set<int>st;
vector<pii>p[N];
vector<int>Q[N];
struct BIT{
int c[N];
void add(int x,int y){
for(;x<=n;x+=(x&-x))c[x]+=y;
}
int ask(int x){
int cnt=0;
for(;x>0;x-=(x&-x))cnt+=c[x];
return cnt;
}
int qry(int l,int r){
return ask(r)-ask(l-1);
}
}tr;
void add(int x,int y,int z){
to[++idx]=y,nxt[idx]=ver[x],ver[x]=idx,val[idx]=z;
}
void dfs(int x,int fa){
siz[x]=1;
for(int i=ver[x],y;i;i=nxt[i]){
if(to[i]==fa)continue;
c[to[i]]=c[x]+val[i];
dfs(to[i],x);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]){
son[x]=to[i];
}
}
return;
}
int nxtx(int x){
auto it=st.upper_bound(x);
if(it==st.end())return -1;
else return *it;
}
int prex(int x){
if(x<*st.begin())return -1;
auto it=st.lower_bound(x);
return *(--it);
}
void ins(int x,int fa){
st.insert(x);
for(int i=ver[x];i;i=nxt[i]){
if(to[i]!=fa)ins(to[i],x);
}
return;
}
void find(int x,int col){
int u=prex(x),v=nxtx(x);
if(u!=-1)p[x].push_back(mp(u,col));
if(v!=-1)p[v].push_back(mp(x,col));
return;
}
void calc(int x,int fa,int col){
find(x,col);
for(int i=ver[x];i;i=nxt[i]){
if(to[i]!=fa)calc(to[i],x,col);
}
return;
}
void DFS(int x,int fa,int o){
for(int i=ver[x],y;i;i=nxt[i]){
if(to[i]!=fa&&to[i]!=son[x]){
DFS(to[i],x,0);
}
}
if(!son[x]){
if(o)st.insert(x);
return;
}
DFS(son[x],x,1);
find(x,c[x]);st.insert(x);
for(int i=ver[x];i;i=nxt[i]){
if(to[i]!=fa&&to[i]!=son[x]){
calc(to[i],x,c[x]);
ins(to[i],x);
}
}
if(!o)st.clear();
return;
}
int main(){
freopen("rldcot.in","r",stdin);
freopen("rldcot.out","w",stdout);
scanf("%d %d",&n,&q);
for(int i=1,u,v,w;i<n;i++){
scanf("%d %d %d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
dfs(1,0);
for(int i=1;i<=n;i++)b[i]=c[i];
sort(b+1,b+1+n);m=unique(b+1,b+1+n)-(b+1);
for(int i=1;i<=n;i++){
c[i]=lower_bound(b+1,b+1+m,c[i])-b;
p[i].push_back(mp(i,c[i]));
}
DFS(1,0,0);
for(int i=1,r;i<=q;i++){
scanf("%d %d",l+i,&r);
Q[r].push_back(i);
}
for(int i=1;i<=n;i++){
for(auto j:p[i]){
if(j.fi>pos[j.se]){
if(pos[j.se])tr.add(pos[j.se],-1);
pos[j.se]=j.fi;tr.add(pos[j.se],1);
}
}
for(auto j:Q[i]){
ans[j]=tr.qry(l[j],i);
}
}
for(int i=1;i<=q;i++){
printf("%d\n",ans[i]);
}
return 0;
}