特殊四维偏序—星之河
特殊四维偏序-星之河
「DTOI-2」星之河
题目背景
星稀河影转,霜重月华孤。
题目描述
星之统治者有一个星盘,其可以被抽象为一棵根节点为
现在,星之统治者想要知道,对于每个节点
你需要按编号顺序依次输出每个节点的答案。为减少输出量,如果答案为
输入格式
第一行两个整数分别表示
接下来
接下来
输出格式
每个答案非
样例 #1
样例输入 #1
10
2 1
3 1
4 3
5 1
6 4
7 2
8 2
9 4
10 3
3 1
2 4
-3 3
4 -2
-2 3
-3 -6
-5 -1
-4 -7
-5 -1
-7 -7
样例输出 #1
5
2
3
1
提示
样例解释
对于节点
对于节点
对于节点
数据范围
特殊性质 | 总分数 | ||
---|---|---|---|
无 | |||
无 | |||
树的形态是链 | |||
无 |
对于所有数据,保证
题解
纪念我考场上想出了正解却不敢写
这玩意在树上貌似不好搞,DP之类的都不行,考虑转移到序列上,那么我们把这棵树拍一个DFS序,然后再看这个问题
假设我们定义一个结构体
struct node{
int le,ri,b,r,id;
}a[N<<1];
分别存节点的DFS序的两个出现位置的权值,蓝色权值,红色权值以及节点
的点的数量,假设我们记
小小差分一下就有
那么对于
所以说,这道题本质上就是一个拍成DFS序之后的特殊四维偏序,这个四维偏序可以转化为两个三维偏序,也可以在累计答案的时候直接差分掉
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200050
#define M 600050
#define re register
using namespace std;
struct node{
int le,ri,b,r,id;
}a[N<<1];
int ans[N],num,head[N],ver[M],nxt[M],tot,c[N],n,m;
inline void add(int u,int v){
nxt[++tot]=head[u],ver[head[u]=tot]=v;
}
void dfs(int u,int f){
a[u].le=++num;
for(int i=head[u];i;i=nxt[i]){
int v=ver[i];
if(v!=f)dfs(v,u);
}
a[u].ri=num;
}
inline bool cmp1(node a,node b){
if(a.b==b.b){
if(a.r==b.r)return a.le>b.le;;
return a.r<b.r;
}
return a.b<b.b;
}
inline bool cmp2(node a,node b){
if(a.r==b.r)return a.ri<b.ri;
return a.r<b.r;
}
inline void Add(int x,int k){while(x<=n)c[x]+=k,x+=x&-x;}
inline int ask(int x){int ans=0;while(x)ans+=c[x],x-=x&-x;return ans;}
inline void CDQ(int l,int r){
if(l==r)return ;
int mid=l+r>>1;
CDQ(l,mid);
CDQ(mid+1,r);
sort(a+l,a+mid+1,cmp2);
sort(a+mid+1,a+r+1,cmp2);
int j=l;
for(re int i=mid+1;i<=r;i++){
while(a[j].r<=a[i].r&&j<=mid)Add(a[j++].le,1);
ans[a[i].id]+=ask(a[i].ri)-ask(a[i].le-1);
}
for(int i=l;i<j;i++)Add(a[i].le,-1);
}
inline void init(){
scanf("%d",&n);
for(re int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs(1,0);
for(re int i=1;i<=n;i++)scanf("%d%d",&a[i].b,&a[i].r);
for(re int i=1;i<=n;i++)a[i].id=i;
sort(a+1,a+n+1,cmp1);
CDQ(1,n);
for(re int i=1;i<=n;i++)if(ans[i])printf("%d\n",ans[i]);
}
int main(){
init();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!