当前位置: 首页 > news >正文

Imbalance

Background

Special for beginners, _

Description

上周 DB(Dream Bear) 做了均衡区间,但是它没过。

于是 DB 急了,就打算出一道 《非均衡区间》,但是求非均衡区间只要 \(n^2 − ans\) (均衡区间数) 即可。

出了一个原题, DB 更急了,于是 DB 就打算做完全非均衡区间。DB 一下子就想出了完全非均衡区间的解法,并开始嘲讽你。

但是你比 DB 强多了,所以你不用做完全非均衡区间,你直接做完全非均衡路径,直接薄纱 DB。

如果树上一条简单路径满足:路径上点权最大值和最小值都在路径的端点上,并且路径的两个端点不相同;那么称之为完全非均衡路径。

给定一棵树,点权就是点的编号(是 \(1\)\(n\) 的排列)。

求这颗树上的完全非均衡路径数量。

Format

Input

第一行 \(n\) 表示点数。

接下来 \(n−1\) 行,每行两个整数 \(u,v\) 表示一条边 \((u,v)\)

Output

一行一个整数表示答案。

Samples

输入数据 1

3  
1 2
2 3

输出数据 1

3

其他样例见下发文件。

Limitation

无捆绑测试

对于所有数据,\(1 \le n \le 5 \times 10 ^ 5\)

淀粉质 + 二维偏序

考虑到是不简单树上路径问题。所以直接上淀粉质。

对目前所处点的所有子树跑一遍根链最值(将淀粉质所处点当做根)。

然后发现每个点有一个二元组 \((x,y)\)

对于一条合法的路径,要考虑合法条件为两个二元组满足

\(x_1 < x_2\) && \(y1 < y2\)

但是这样会算上两端点都在同一子树(根链)上的路径。

所以要容斥一下,之后就做完了。

终于调出来一道 淀粉质 & CDQ。

不容易啊qwq。

#include <stdio.h>
#include <string.h>
#include <bitset>
#include <algorithm>
#define lowbit(x) (x & (-x))
#define con putchar_unlocked(' ')
#define ent putchar_unlocked('\n')
#define add(u,v) to[++ tot] = v,nxt[tot] = h[u],h[u] = tot
#define int long long 
#define Blue_Archive return 0
using namespace std;
constexpr int N = 5e5 + 3;
constexpr int M = 1e6 + 3;
constexpr int INF = 2e9;int T;
int n;
int rt;
int tot;
int ans;
int sum;
int top1;
int top2;
int h[N];
int to[M];
int mx[N];
int tr[N];
int siz[N];
int nxt[M];bitset<N> vis;struct miku
{int mx,mn;friend bool operator < (miku a,miku b){return a.mx == b.mx ? a.mn > b.mn : a.mx < b.mx;}
}lmx[N],lmn[N];inline int read()
{int x = 0;int c = getchar_unlocked();while(c < '0' || c > '9') c = getchar_unlocked();while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48),c = getchar_unlocked();return x;
}inline void write(int x)
{if(x < 0) x = -x,putchar_unlocked('-');if(x > 9) write(x / 10);putchar_unlocked(x % 10 + '0');
}inline int max(int x,int y){return x > y ? x : y;}
inline int min(int x,int y){return x < y ? x : y;}inline void ins(int pos,int val){for(int i = pos;i <= n;i += lowbit(i)) tr[i] += val;}inline int query(int pos){int res = 0;for(int i = pos;i;i -= lowbit(i)) res += tr[i];return res;}inline void get(int x,int f)
{siz[x] = 1;mx[x] = 0;for(int i = h[x];i;i = nxt[i]){if(to[i] == f || vis[to[i]]) continue;get(to[i],x);siz[x] += siz[to[i]];mx[x] = max(mx[x],siz[to[i]]);}mx[x] = max(mx[x],sum - siz[x]);if(mx[x] < mx[rt]) rt = x;
}inline void dfs1(int x,int f,int rt,int mxx,int mnn)
{if(x > mxx){lmx[++ top1] = miku{mxx = x,mnn};ans += (mnn == rt);}if(x < mnn){lmn[++ top2] = miku{mxx,mnn = x};ans += (mxx == rt);}for(int i = h[x];i;i = nxt[i]) if(!vis[to[i]] && to[i] != f) dfs1(to[i],x,rt,mxx,mnn);
}inline void dfs2(int x,int f,int rt,int mxx,int mnn)
{if(x > mxx) lmx[++ top1] = miku{mxx = x,mnn};if(x < mnn) lmn[++ top2] = miku{mxx,mnn = x};for(int i = h[x];i;i = nxt[i]) if(!vis[to[i]] && to[i] != f) dfs2(to[i],x,rt,mxx,mnn);
}inline void dfz(int x) // 淀粉质
{vis[x] = 1;top1 = top2 = 0;for(int i = h[x];i;i = nxt[i]) if(!vis[to[i]]) dfs1(to[i],x,x,x,x);sort(lmx + 1,lmx + top1 + 1);sort(lmn + 1,lmn + top2 + 1);int itl = 1,itr = 1;while(itl <= top1 && itr <= top2) // 端点在其子树的两条链上的合法四元组个数(直接上二维偏序){if(lmn[itr].mx < lmx[itl].mx) ins(lmn[itr ++].mn,1);else ans += query(lmx[itl ++].mn - 1);}while(itl <= top1){if(lmx[itl].mn > 1) ans += query(lmx[itl].mn - 1);itl ++;} while(-- itr) ins(lmn[itr].mn,-1);for(int i = h[x];i;i = nxt[i]) // 容斥子树的贡献{if(vis[to[i]]) continue;top1 = top2 = 0;dfs2(to[i],x,x,x,x);sort(lmx + 1,lmx + top1 + 1);sort(lmn + 1,lmn + top2 + 1);int itl = 1,itr = 1;while(itl <= top1 && itr <= top2) // 端点在其子树的两条链上的合法四元组个数(直接上二维偏序){if(lmn[itr].mx < lmx[itl].mx) ins(lmn[itr ++].mn,1);else ans -= query(lmx[itl ++].mn - 1);}while(itl <= top1){if(lmx[itl].mn > 1) ans -= query(lmx[itl].mn - 1);itl ++;} while(-- itr) ins(lmn[itr].mn,-1);}for(int i = h[x];i;i = nxt[i]){if(vis[to[i]]) continue;sum = siz[to[i]];mx[rt = 0] = INF;get(to[i],x);get(rt,0);dfz(rt);}vis[x] = 0;
}inline void solve()
{n = read();for(int i = 1,u,v;i < n;i ++){u = read();v = read();add(u,v);add(v,u);}mx[rt = 0] = INF;sum = n;get(1,0);get(rt,0);dfz(rt);write(ans);ent;
}signed main()
{freopen("imbalance.in","r",stdin);freopen("imbalance.out","w",stdout);// freopen("data.in","r",stdin);freopen("data.out","w",stdout);solve();Blue_Archive;
}
http://www.jsqmd.com/news/39600/

相关文章:

  • (八大排序)堆排序
  • 2025 年 11 月展厅设计公司权威推荐榜:企业展厅、校史馆、博物馆、多媒体数字及VR线上虚拟展厅设计厂家精选
  • 点赞!开幕式背后的云力量!
  • #20232329 2025-2026-1 《网络与系统攻防技术》 实验六实验报告
  • 易路AI人才罗盘:点亮组织内部的人才“星空”,让每一次人才决策都精准有据
  • (八大排序)基数排序
  • (八大排序)希尔排序
  • 11.13 比赛总结
  • 壅土(拼音:yōng tǔ)
  • 2025-11-13 早报新闻
  • P14463 【MX-S10-T4】『FeOI-4』呼吸之野
  • 业务用例的四个核心要素 - f
  • 20232322 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 网易梦幻事业部游戏测试开发外包面经(一面)
  • win7 如何运行cherry studio
  • 《密码系统设计》第十一周预习
  • 深入解析:Flink 状态和 CheckPoint 的区别和联系(附源码)
  • 抚州0.5mm镜面铝板无压痕模厂家优选,品质稳定采购无忧
  • 松原西林瓶灌装加塞机推荐,适配冻干机半加塞功能
  • XCPC 竞赛 Ubuntu 环境 DOMjudge Server 完整配置指南
  • v模型按开发阶段分为四阶段:单元测试、集成测试、系统测试验收测试
  • Python迭代器_高级
  • Python迭代器_迭代器对象可迭代对象必须分开场景
  • 251113
  • H模型流程
  • 集合框架、io流、多线程
  • Ubuntu 22.04 x86_64 cron不执行原因 - whitesky
  • 为啥要搞utf-8等,直接存储Unicode码点不行吗?
  • 2025 年 11 月闸阀厂家推荐排行榜,美标闸阀,国标闸阀,锻钢闸阀,高压闸阀,碳钢闸阀,高温闸阀,焊接闸阀,法兰闸阀公司推荐
  • 2025年国内商标注册机构综合实力排行榜:专业服务商深度解析