西瓜树之二
题目描述
给定一棵
有
提示,给出
解法
一道树状数组的题,鬼知道这个华强专题的测试为什么那么喜欢考树(话说华强的西瓜为什么会长在树上,以及萨日朗到底是什么梗)。
询问之间互相独立且不带修改,考虑离线。
首先有一个结论就是,假如对于一堆树上的节点,每在它们任意两个之间连一条边,连通块就会减少一个,原因很简单。树的特性决定了任意一条边都只会连接两个不同的连通块(不然就会出现环,那就不是树了,毕竟西瓜树它也是树啊)。
于是做如下考虑:假如只保留点不保留边,那么会得到
可以给予每条边三个参数
树状数组离线处理即可。
#include<cstdio>
#include<algorithm>
//#define zczc
using namespace std;
const int N=1000010;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar(); }
wh*=f;return;
}
inline int min(int s1,int s2){
return s1<s2?s1:s2;
}
inline int max(int s1,int s2){
return s1<s2?s2:s1;
}
int m,n,s[N],an[N];
namespace g{
struct no{
int x,y,pl;
bool change,add;
}b[N*6];
inline bool cmp(no s1,no s2){
if(s1.x==s2.x){
if(s1.y==s2.y)return s1.change;
else return s1.y<s2.y;
}
else return s1.x<s2.x;
}
int cnt;
#define lowbit (wh&-wh)
int t[N];
void change(int wh){
for(;wh<=m;wh+=lowbit)t[wh]++;
return;
}
int work(int wh){
int an=0;
for(;wh;wh-=lowbit)an+=t[wh];
return an;
}
#undef lowbit
void add(int pl,int s1,int s2,bool change,bool add){
cnt++;
b[cnt].pl=pl;
b[cnt].x=s1;
b[cnt].y=s2;
b[cnt].change=change;
b[cnt].add=add;
return;
}
void solve(){
sort(b+1,b+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
if(b[i].change){
change(b[i].y);
continue;
}
int now=work(b[i].y);
an[b[i].pl]+=now*(b[i].add?1:-1);
}
return;
}
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
int s1,s2;
read(m);read(n);
for(int i=1;i<m;i++){
read(s1);read(s2);
g::add(0,min(min(s1,s2),i),max(max(s1,s2),i),true,false);
}
for(int i=1;i<=n;i++){
read(s1);read(s2);
s[i]=s2-s1+1;
g::add(i,s2,s2,false,true);
g::add(i,s1-1,s1-1,false,true);
g::add(i,s1-1,s2,false,false);
g::add(i,s2,s1-1,false,false);
}
g::solve();
for(int i=1;i<=n;i++)printf("%d\n",s[i]-an[i]);
return 0;
}
一如既往,万事胜意
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具