题意

描述

现在有一颗树形状的双向铁路,每条边的行驶时间是\(1\);

给出\(m\)条列车行驶的路径\(s_{i}\to t_{i}\),问列车相遇的对数(无序对);

\(i和j\)号列车相遇当且仅当存在某个时刻使得\(i\)和\(j\)在同一个位置,注意这个位置可能在点上,也可能在边上;

范围

$0 \le n ,m \le 10^5 $

题解

  • 相遇只有两种,同向和逆向;

  • 把边也拆成点可以解决在边上相遇的问题;

  • 考虑把每条路径按深度的大小关系划分成上行和下行(lca在上行);

  • 这样就只需要考虑上行和上行相交,上行和下行分别相交;

  • 上行和上行相加直接统计子树内出发深度相同的路径的个数;

  • 上行和下行相交树剖后变为一次函数\(x+c\)和\(-x+c\)的交点个数;

  • 逆时针旋转\(45^{\circ}\) 之后做扫描线+\(BIT\)即可;

    #include<bits/stdc++.h>
    #define pb push_back
    #define ll long long
    using namespace std;
    const int N=200100,M=20;
    int n,m,o=1,hd[N];
    int size[N],sn[N],tp[N],fa[N],idx,st[N],id[N],dep[N];
    int sz,rt[N],ls[N*M],rs[N*M],sum[N*M],cnt1,cnt2,c[N<<1];
    struct Edge{int v,nt;}E[N<<1];
    vector<int>vec[N];
    struct data{int x,p,typ;data(int _x=0,int _p=0,int _typ=0):x(_x),p(_p),typ(_typ){};bool operator <(const data&A)const{return p<A.p;}
    }l1[N*M],l2[N*M];
    ll ans;
    char gc(){static char*p1,*p2,s[1000000];if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);return(p1==p2)?EOF:*p1++;
    }
    int rd(){int x=0;char c=gc();while(c<'0'||c>'9')c=gc();while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();return x;
    }
    void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;E[o]=(Edge){u,hd[v]};hd[v]=o++;
    }
    void dfsA(int u,int F){size[u]=1;sn[u]=0;dep[u]=dep[fa[u]=F]+1;for(int i=hd[u];i;i=E[i].nt){int v=E[i].v;if(v==F)continue;dfsA(v,u);size[u]+=size[v];if(size[v]>size[sn[u]])sn[u]=v;}
    }
    void dfsB(int u,int T){st[++idx]=u;id[u]=idx;tp[u]=T; if(sn[u])dfsB(sn[u],T);for(int i=hd[u];i;i=E[i].nt){int v=E[i].v;if(v==fa[u]||v==sn[u])continue;dfsB(v,v);}
    }
    int lca(int u,int v){int tu=tp[u],tv=tp[v];while(tu!=tv){if(dep[tu]<dep[tv])swap(u,v),swap(tu,tv);u=fa[tu],tu=tp[u];}return dep[u]<dep[v]?u:v;
    }
    int go(int u,int d){if(d<0)return 0;int tu=tp[u];while(dep[u]-dep[tu]<d){d-=dep[u]-dep[tu]+1;u=fa[tu],tu=tp[u];}return st[id[u]-d];
    }
    void update(int&k,int l,int r,int x,int y){if(!k)k=++sz;sum[k]+=y;if(l==r)return;int mid=l+r>>1;if(x<=mid)update(ls[k],l,mid,x,y);else update(rs[k],mid+1,r,x,y);
    }
    void merge(int&x,int&y){if(!x||!y){x=x+y;return;}if(!ls[x]&&!rs[x]){sum[x]=sum[x]+sum[y];return ;}merge(ls[x],ls[y]);merge(rs[x],rs[y]);sum[x]=sum[ls[x]]+sum[rs[x]];
    }
    int query(int k,int l,int r,int x){--sum[k];if(l==r)return sum[k];int mid=l+r>>1;if(x<=mid)return query(ls[k],l,mid,x);else return query(rs[k],mid+1,r,x);
    }
    void dfsC(int u){for(int i=hd[u];i;i=E[i].nt){int v=E[i].v;if(v==fa[u])continue;dfsC(v);merge(rt[u],rt[v]);}for(int i=0;i<vec[u].size();++i){int v=vec[u][i];ans+=query(rt[u],1,n,dep[v]);}
    }
    void init1(int x1,int y1,int x2,int y2){int x,y,z;x=x1-y1+n;y=x2-y2+n;z=x1+y1;l1[++cnt1]=data(x-1,z,-1);l1[++cnt1]=data(y,z,1);
    }
    void init2(int x1,int y1,int x2,int y2){int x,y,z;x=x1+y1;y=x2+y2;z=x1-y1+n;l2[++cnt2]=data(z,x,1);l2[++cnt2]=data(z,y+1,-1);
    }
    void add(int x,int y){for(;x<=n;x+=x&-x)c[x]+=y;}
    int ask(int x){int re=0;for(;x;x-=x&-x)re+=c[x];return re;}
    int main(){freopen("train.in","r",stdin);freopen("train.out","w",stdout);n=rd();for(int i=1;i<n;++i){int u=rd(),v=rd();adde(u,i+n),adde(v,i+n);}dfsA(1,0);dfsB(1,1);n<<=1;m=rd();int dg=0;for(int i=1,u,v,p,q,tu,tv,d;i<=m;++i){u=rd();v=rd();p=lca(u,v);q=go(v,dep[v]-dep[p]-1);if(dg){printf("%d %d %d %d\n",u,v,p,q);}update(rt[u],1,n,dep[u],1);vec[p].pb(u);tu=tp[u];d=0;while(tu!=tp[p]){init1(id[tu],d+dep[u]-dep[tu],id[u],d);d+=dep[u]-dep[tu]+1;u=fa[tu],tu=tp[u];}init1(id[p],d+dep[u]-dep[p],id[u],d);d+=dep[u]-dep[p];if(v==p)continue;tv=tp[v];d+=dep[v]-dep[p];while(tv!=tp[q]){init2(id[tv],d-dep[v]+dep[tv],id[v],d);d-=dep[v]-dep[tv]+1;v=fa[tv],tv=tp[v];}init2(id[q],d-dep[v]+dep[q],id[v],d);d-=dep[v]-dep[q];}dfsC(1);sort(l1+1,l1+cnt1+1);sort(l2+1,l2+cnt2+1);n<<=1;for(int i=1,j=1;i<=cnt1;++i){while(j<=cnt2&&l2[j].p<=l1[i].p){add(l2[j].x,l2[j].typ);j++;}ans+=l1[i].typ*ask(l1[i].x);}printf("%lld\n",ans);return 0;
    }

转载于:https://www.cnblogs.com/Paul-Guderian/p/10574113.html

【纪中集训2019.3.20】铁路相关推荐

  1. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  2. 【纪中集训2019.3.26】动态半平面交

    题目 描述 : 给出强制在线参数\(k\),树的大小\(n\),和每个点的点权\(a_i\); 有\(m\)个询问,每个询问是$u ,d $ 的形式: 表示询问\(u\)为根的子树中,和\(u\)的距 ...

  3. 【纪中集训2019.3.15】恶熊咆哮

    题目 描述 有\(n\)只熊,初始时坐标为\((x_i,y_i)\): 这些熊会按照标号依次吼叫,当第\(i\)只熊吼叫,其他熊会移动: \((x_i,y_i)\)会移动到\((x_i \pm 1,y ...

  4. 【纪中集训2019.3.25】芬威克树

    题目 描述 ​ ​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和: ​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变: ​ 维护第二段代码执行\(ADD(x,v)\) ...

  5. 【纪中集训2019.3.30】星辰大海

    题目 描述 ​ 有\(n\)个点\(p_1 ,p_2 , \cdots ,\,p_n\) : ​ 现在\(p_1\)不见了,可能的横纵坐标范围是\([-10^6,10^6]\): ​ 同时需要保证每三 ...

  6. 2019寒假纪中集训总结学期总结(流水账)

    学期总结 这学期上了初三,学校的初.高中校区对调,我们的班主任也由一个生物老师换成了一个化学老师. 之前的班主任比较年轻,跟我们这群学生有这很好的感情,亦师亦友,陪伴我们度过了几乎没有中考压力的初一. ...

  7. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  8. [2021.8纪中集训Day14]

    文章目录 1312. 老曹的忧郁 题目 思路 代码 1313. 老曹骑士 题目 思路 代码 1314. 稳定的数字 题目 思路 代码 封锁阳光大学 题目 题目描述 输入格式 输出格式 输入输出样例 说 ...

  9. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

最新文章

  1. 从oracle中读取图片,从oracle数据库中读取图片,在jsp?
  2. ubuntu10.0.4使用再生龙还原后在启动时不能正常启动
  3. 数据结构 单链表 C
  4. Camelot:从pdf中提取表格数据
  5. 浅谈SQL中存储过程和自定义函数的区
  6. issues:close 云端 STS 启动报找不到 jdk
  7. 超级计算机TOP500、green500、graph500最新排名(2012.11)
  8. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
  9. Java程序设计之扑克牌
  10. 微信小程序图片无法显示时显示默认图片
  11. js对日期进行升序排序
  12. 编译适配 联想Y1(NewifiMini)的Padavan 固件
  13. word文件做一半未响应_word文档未响应文件还没保存该怎么处理?
  14. 通过追女孩时的常见对话来看你会不会聊天
  15. xlsx表格怎么筛选重复数据_excel怎么筛选两个表中相同数据
  16. react+antd的后台管理项目模板
  17. [转] 好玩的电子琴(附琴谱)
  18. 做了个小程序,广告收益2.60元广告费
  19. 内部表与外部表——头歌
  20. 英特尔(中国)有限公司简介

热门文章

  1. Log4j 2 介绍
  2. RocketMQ命令整理
  3. MOOON-server新消息处理接口
  4. 几种常用的C#排序方法简介
  5. 华为手机的nfc是什么功能_华为手机NFC只用来乘车?这个功能还不会用,几千块手机亏了...
  6. python计算选手最后得分并取出前三名_在Python中存储最后3个分数并删除旧分数并计算平均值?...
  7. sql sever avg保留小数_《数据库系统概念》笔记 (一)SQL
  8. android ui布局开发,Android UI设计初步(基本布局)
  9. labuladong的算法小抄pdf_推荐两个学算法的 GitHub 项目
  10. drools规则引擎可视化_Springboot2(60)集成规则引擎Drools