Description

Input

Output

Sample Input

输入1:

5 3 1
1 4
4 2
1 5
4 3
1 3
1 4
2 4
3 2

输入2:

10 5 4
10 3
6 9
6 3
6 8
9 5
1 8
6 4
7 3
6 2
1 10
6 9
6 8
4 5
1 9
1 5
5 2
1 3
3 2

Sample Output

输出1:

3 1 2

输出2:

1 5 3 4 2

Data Constraint

Solution

  • 这题我打的是二维线段树(树上每个点代表一个矩形,将长割一半作为两个子节点)。

  • 每条路径 (x,y)(x,y)(x,y) 加入二维线段树的位置 (dfn[x],dfn[y])(dfn[x],dfn[y])(dfn[x],dfn[y]) 上,这里要保证 dfn[x]&lt;dfn[y]dfn[x]&lt;dfn[y]dfn[x]<dfn[y] 。

  • 那么我们要查询每条路径被哪些路径包含,就相当于在线段树上查询一个或两个矩形。

  • 注意查询的时候也要保证矩形的左下角 (x,y)(x,y)(x,y) 满足 x&lt;yx&lt;yx<y ,这样避免了很多讨论。

  • 线段树优化连边后跑拓扑排序即可。

  • 时间复杂度 O(nlog2n)O(n\ log^2n)O(n log2n) 。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const int N=1e5+5,M=20;
struct data
{int l,r;
}f[N*M+N];
int tot,cnt,qx,qy,qxx,qyy,qz,rt;
int first[N*M],nex[N*M*M/2],en[N*M*M/2],d[N*M];
int dfn[N],size[N],fa[N][17],dep[N];
int a[N],b[N],c[N],q[N*M];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline void insert(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void insert1(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;d[y]++;
}
void dfs(int x)
{dfn[x]=++tot;size[x]=1;dep[x]=dep[fa[x][0]]+1;for(int i=first[x];i;i=nex[i])if(en[i]^fa[x][0]){fa[en[i]][0]=x;dfs(en[i]);size[x]+=size[en[i]];}
}
void change(int &v,int pre,int xl,int xr,int yl,int yr)
{if(!v){if(xl==xr && yl==yr) v=qz; else v=++cnt;if(pre) insert1(v,pre);}if(xl==xr && yl==yr) return;if(xr-xl>yr-yl){int mid=xl+xr>>1;if(qx<=mid) change(f[v].l,v,xl,mid,yl,yr); elsechange(f[v].r,v,mid+1,xr,yl,yr);}else{int mid=yl+yr>>1;if(qy<=mid) change(f[v].l,v,xl,xr,yl,mid); elsechange(f[v].r,v,xl,xr,mid+1,yr);}
}
void find(int v,int xl,int xr,int yl,int yr)
{if(!v) return;if(qx<=xl && xr<=qy)if(qxx<=yl && yr<=qyy){if(qz^v) insert1(v,qz);return;}if(xr-xl>yr-yl){int mid=xl+xr>>1;if(qx<=mid) find(f[v].l,xl,mid,yl,yr);if(qy>mid) find(f[v].r,mid+1,xr,yl,yr);}else{int mid=yl+yr>>1;if(qxx<=mid) find(f[v].l,xl,xr,yl,mid);if(qyy>mid) find(f[v].r,xl,xr,mid+1,yr);}
}
inline int lca(int x,int y)
{for(int i=log2(dep[x]);i>=0;i--)if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];if(x==y) return x;for(int i=log2(dep[x]);i>=0;i--)if(fa[x][i]^fa[y][i]) x=fa[x][i],y=fa[y][i];return fa[x][0];
}
int main()
{freopen("stier.in","r",stdin);freopen("stier.out","w",stdout);int n=read(),m=read(),k=read();for(int i=1;i<n;i++){int x=read(),y=read();insert(x,y);insert(y,x);}tot=0;dfs(1);for(int j=1;j<17;j++)for(int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];tot=0;memset(first,0,sizeof(first));cnt=m;for(int i=1;i<=m;i++){a[i]=read(),b[i]=read();if(dep[a[i]]<dep[b[i]]) swap(a[i],b[i]);c[i]=lca(a[i],b[i]);qx=dfn[a[i]];qy=dfn[b[i]];if(qx>qy) swap(qx,qy);qz=i;change(rt,0,1,n,1,n);}for(int i=1;i<=k;i++){int x=read(),y=read();insert1(x,y);}for(int i=1;i<=m;i++){qz=i;if(c[i]==b[i]){int pos=a[i];for(int j=log2(dep[pos]);j>=0;j--)if(dep[fa[pos][j]]>dep[b[i]]) pos=fa[pos][j];qx=dfn[a[i]];qy=dfn[a[i]]+size[a[i]]-1;qxx=1;qyy=dfn[b[i]]-1;if(qx>qxx) swap(qx,qxx),swap(qy,qyy);if(qx<=qy && qxx<=qyy) find(rt,1,n,1,n);qx=dfn[a[i]]+1;qy=dfn[a[i]]+size[a[i]]-1;qxx=1;qyy=dfn[pos]-1;if(qx>qxx) swap(qx,qxx),swap(qy,qyy);if(qx<=qy && qxx<=qyy) find(rt,1,n,1,n);qx=dfn[a[i]];qy=dfn[a[i]]+size[a[i]]-1;qxx=dfn[b[i]]+1;qyy=dfn[pos]-1;if(qx>qxx) swap(qx,qxx),swap(qy,qyy);if(qx<=qy && qxx<=qyy) find(rt,1,n,1,n);qx=dfn[a[i]];qy=dfn[a[i]]+size[a[i]]-1;qxx=dfn[pos]+size[pos];qyy=n;if(qx>qxx) swap(qx,qxx),swap(qy,qyy);if(qx<=qy && qxx<=qyy) find(rt,1,n,1,n);}else{if(dfn[a[i]]>dfn[b[i]]) swap(a[i],b[i]);qx=dfn[a[i]]+1;qy=dfn[a[i]]+size[a[i]]-1;qxx=dfn[b[i]];qyy=dfn[b[i]]+size[b[i]]-1;if(qx<=qy) find(rt,1,n,1,n);qx=dfn[a[i]];qy=dfn[a[i]]+size[a[i]]-1;qxx=dfn[b[i]]+1;qyy=dfn[b[i]]+size[b[i]]-1;if(qxx<=qyy) find(rt,1,n,1,n);}}int l=0,r=0;for(int i=1;i<=cnt;i++)if(!d[i]) q[++r]=i;while(l<r){int x=q[++l];if(x<=m) write(x),putchar(' ');for(int i=first[x];i;i=nex[i])if(!--d[en[i]]) q[++r]=en[i];}return 0;
}

JZOJ 5982. 【WC2019模拟12.27】路径排序相关推荐

  1. 在PSP上玩《生化危机1-2-3 / Biohazard 1-2-3 / ResidentEvil 1-2-3》(Update:2007.12.27)

    在PSP上玩<生化危机 1-2-3 / Biohazard 1-2-3/ ResidentEvil 1-2-3> 不久前,索尼已经在PSP了推出官方的PS模拟器.(这应该是3.0版本增加的 ...

  2. 【Scrum】2010.12.27

    基本上从今天开始,各队员开始各司其职: 12.27队员的工作和将要做的工作 Hui, 作为leader, 主要从事developer: 解决一些BUG, 加入好友等功能,以及需要登陆才能获取的信息 L ...

  3. [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)

    [2021.1.31多校省选模拟12]随机变换的子串 对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理 ...

  4. 利用cesium模拟台风移动路径——以利奇马台风为例

    根据cesium官网示例(https://sandcastle.cesium.com/?src=Interpolation.html)改造为台风移动轨迹,台风数据从台风路径实时发布系统获取.模拟台风移 ...

  5. English Learning - Day21 作业打卡 2022.12.27 周二

    English Learning - Day21 作业打卡 2022.12.27 周二 引言 一.给出如下短语的汉语释义 1. vanished youth 2. faded flowers 3. o ...

  6. 九星连珠用c语言编程,王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级...

    原标题:王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级 个人观点:王者荣耀模拟战中要实现三星英雄九星连珠的梦想很难,原因是没有大量金币支持玩家抽卡升三星,而恰恰有天赋贪婪可以轻松实现这个梦 ...

  7. Python提取WRF模拟的台风路径

    WRF模式广泛应用于台风的模拟和预报,但是其并不能输出台风路径信息(除非编译的时候nesting选择vortex following选项,运行时会输出ATCF数据,不过这个不常用). 因此使用WRF模 ...

  8. 【链塔DApp日报】BDI指数增长10.19%,以太坊 24h交易额增长12.27%

    [链塔DApp日报]BDI指数增长10.19%,以太坊 24h交易额增长12.27% 时间:2月27日 根据链塔DApp数据分析,2月26日,链塔DApp行业指数BDI为227点,环比增长10.19% ...

  9. 【微语】第六周(12.21~12.27)

    12.21.总依赖别人,是这世界上最没有安全感又最危险的事. 12.22.吸引一个人的最好方式,是独立自主,而非刻意谄媚. 12.23.让你步入婚姻殿堂的不应该是年龄,而是两情相悦. 12.24.时间 ...

最新文章

  1. 人脸识别技术在支付场景的机遇与挑战
  2. Solid Converter PDF
  3. webplugin 没有画面_[问题记录] webpack devServer HtmlWebpackPlugin 没有加载 js、css
  4. 深度学习之卷积神经网络(13)DenseNet
  5. linux 按日期复制文件夹,Linux 按文件日期分类文件
  6. 1.3MB 的超轻YOLO算法!全平台通用,准确率接近YOLOv3,速度快上45%丨开源
  7. php pack方法,php pack()函数详解与示例
  8. 修正的判定条件覆盖例题_硬核:嵌入式代码覆盖率统计方法和经验
  9. javascript基础知识(6) 对象
  10. 【转】JAVA成长之路
  11. 人工智能基础(高中版)教材补充和资源分享之一 无限光明的未来、过去和现在
  12. 服务器装凤凰系统,凤凰系统装在云服务器
  13. 简单的Wifi网络概念
  14. C++程序设计:相邻数对
  15. Eclipes更改主题及字体
  16. 关于强化神兽(圣兽)DBC参数详解
  17. Linux各种打包和压缩文件命令
  18. 使用GraalVM实现java调用python脚本
  19. 拒绝忽悠——Python帮你来网购
  20. 球半比分,美职业:费城联合-华盛顿联 7月9日

热门文章

  1. Python基础入门一(2)
  2. JVM03Java代码执行流程
  3. C++去掉字符串首尾的特殊字符(比如空格)
  4. C++读取txt中数据的两种方法
  5. [云炬创业基础笔记]第一章创业环境测试6
  6. [云炬创业基础笔记]第五章创业计划评估16
  7. MATLAB粒子模拟代码注释
  8. 云炬VB开发笔记 5循环结构
  9. 台湾大学林轩田机器学习技法课程学习笔记12 -- Neural Network
  10. 算法导论-排序算法-分治法