简要题意见此:here

题解:

其实不是平面图也可以做,化边为点,边的权值设为删除时间,然后双指针就行了。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constnamespace IO{inline char gc(){static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}template<typename T>T get(){char c;T num;while(!isdigit(c=gc()));num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num;}inline int gi(){return get<int>();}
}
using namespace IO;using std::cerr;
using std::cout;#define y1 y_1
#define y2 y_2cs int N=1e5+7;int n,m1,m2,tot,ct1,ct2,ec;
struct edge{int u,v;}e[N<<2|3];int vl[N*7],tim[N*7];
namespace LCT{cs int N=::N*7;
#define lc(u) son[u][0]
#define rc(u) son[u][1]int son[N][2],fa[N],sum[N],sub[N];bool rev[N];int mx[N];inline void rever(int u){rev[u]^=1;std::swap(lc(u),rc(u));}inline void pushdn(int u){if(rev[u]){if(lc(u))rever(lc(u));if(rc(u))rever(rc(u));rev[u]=0;}}inline void pushup(int u){sum[u]=sum[lc(u)]+sum[rc(u)]+vl[u]+sub[u];mx[u]=u;if(tim[mx[lc(u)]]>tim[mx[u]])mx[u]=mx[lc(u)];if(tim[mx[rc(u)]]>tim[mx[u]])mx[u]=mx[rc(u)];}inline bool get(int u){return rc(fa[u])==u;}inline bool isrt(int u){return lc(fa[u])!=u&&rc(fa[u])!=u;}inline void Rotate(int u){int p=fa[u],pp=fa[p],d=get(u);if(!isrt(p))son[pp][get(p)]=u;son[p][d]=son[u][!d],son[u][!d]=p;fa[p]=u,fa[u]=pp,fa[son[p][d]]=p;pushup(p);pushup(u);}void Splay(int u){static int q[N],qn;q[qn=1]=u;for(int re p=u;!isrt(p);p=fa[p])q[++qn]=fa[p];for(int re i=qn;i;--i)pushdn(q[i]);for(int re p=fa[u];!isrt(u);Rotate(u),p=fa[u])if(!isrt(p))Rotate(get(u)==get(p)?p:u);pushup(u); }void access(int u){for(int re ch=0;u;u=fa[ch=u]){Splay(u);if(rc(u))sub[u]+=sum[rc(u)];if(ch)sub[u]-=sum[ch];rc(u)=ch;pushup(u);}}void makert(int u){access(u);Splay(u),rever(u);}int find_rt(int u){access(u);Splay(u);while(pushdn(u),lc(u))u=lc(u);Splay(u);return u;}bool iscon(int u,int v){makert(u);return find_rt(v)==u;}void link(int u,int v){makert(u);access(v);Splay(v);fa[u]=v;sub[v]+=sum[u];pushup(v);}void cut(int u,int v){makert(u);access(v);Splay(v);fa[lc(v)]=0,lc(v)=0,pushup(v),pushup(u);}int qsz(int u){access(u);Splay(u);return sum[u];}int find_e(int u,int v){makert(u),access(v),Splay(v);return mx[v];}
#undef rc
#undef lc
}int y1[N],y2[N];
int p1[N],p2[N],po[N];
std::vector<int> e1[N],e2[N];
std::vector<int> nd1[N],nd2[N];
int b[N];
signed main(){#ifdef zxyoifreopen("mt.in","r",stdin);
#endifn=gi(),m1=gi(),m2=gi();tot=n+m1+n+m2;for(int re i=1;i<=m1;++i)p1[i]=++tot;for(int re i=1;i<=m2;++i)p2[i]=++tot;for(int re i=1;i<=n;++i)po[i]=++tot,vl[tot]=1;for(int re i=1;i<=tot;++i)LCT::pushup(tot);for(int re i=1;i<=m1;++i)gi(),b[i]=y1[i]=gi();std::sort(b+1,b+m1+1);ct1=std::unique(b+1,b+m1+1)-b-1;for(int re i=1;i<=m1;++i){y1[i]=std::lower_bound(b+1,b+ct1+1,y1[i])-b;nd1[y1[i]].push_back(i);}for(int re i=1;i<n+m1;++i){int t=gi(),u=gi(),v=gi();if(t==1){e[++ec]=(edge){po[u],p1[v]};e1[v].push_back(ec);tim[ec]=y1[v];LCT::link(ec,po[u]);LCT::link(ec,p1[v]);}else {e[++ec]=(edge){p1[u],p1[v]};if(y1[u]>y1[v])e1[u].push_back(ec),tim[ec]=y1[u];else e1[v].push_back(ec),tim[ec]=y1[v];LCT::link(ec,p1[u]);LCT::link(ec,p1[v]);}}for(int re i=1;i<=m2;++i)gi(),b[i]=y2[i]=gi();std::sort(b+1,b+m2+1);ct2=std::unique(b+1,b+m2+1)-b-1;for(int re i=1;i<=m2;++i){y2[i]=std::lower_bound(b+1,b+ct2+1,y2[i])-b;nd2[y2[i]].push_back(i);}for(int re i=1;i<n+m2;++i){int t=gi(),u=gi(),v=gi();if(t==1){e[++ec]=(edge){po[u],p2[v]};e2[v].push_back(ec);}else {e[++ec]=(edge){p2[u],p2[v]};if(y2[u]>y2[v])e2[u].push_back(ec);else e2[v].push_back(ec);}}ll ans=0,all=(ll)m1*m2;for(int re i1=ct1,i2=1,now=0;i1;--i1){for(int re u:nd1[i1])for(int re j:e1[u]){if(LCT::iscon(j,e[j].u))LCT::cut(j,e[j].u);if(LCT::iscon(j,e[j].v))LCT::cut(j,e[j].v);}while(i2<=ct2&&LCT::qsz(po[1])<n){for(int re u:nd2[i2])for(int re j:e2[u]){if(LCT::iscon(e[j].u,e[j].v)){int p=LCT::find_e(e[j].u,e[j].v);LCT::cut(p,e[p].u);LCT::cut(p,e[p].v);}LCT::link(j,e[j].u);LCT::link(j,e[j].v);}now+=nd2[i2++].size();}ans+=(ll)nd1[i1].size()*(m2-now);}if(ans==0)cout<<"0\n";else if(ans==all)cout<<"1\n";else {ll g=std::__gcd(ans,all);cout<<ans/g<<"/"<<all/g<<"\n";}return 0;
}

再来一份没有化边为点的,跑得居然更慢:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constnamespace IO{inline char gc(){static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}template<typename T>T get(){char c;T num;while(!isdigit(c=gc()));num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num; }inline int gi(){return get<int>();}
}
using namespace IO;using std::cerr;
using std::cout;#define y1 y_1
#define y2 y_2cs int N=1e5+7;int n,m1,m2,tot,ct1,ct2,ec;
struct edge{int u,v;}e[N<<2|3];int tim[N<<2|3],vl[N*3];
namespace LCT{cs int N=::N*3;
#define lc(u) son[u][0]
#define rc(u) son[u][1]int son[N][2],fa[N],sum[N],sub[N];bool rev[N];int mx[N],pr[N],sf[N];inline void rever(int u){rev[u]^=1;std::swap(lc(u),rc(u));std::swap(pr[u],sf[u]);}void pushdn(int u){if(rev[u]){if(lc(u))rever(lc(u));if(rc(u))rever(rc(u));rev[u]=0;}}void pushup(int u){sum[u]=sum[lc(u)]+sum[rc(u)]+vl[u]+sub[u];mx[u]=0;(lc(u)&&tim[pr[u]]>tim[mx[u]])&&(mx[u]=pr[u]);(rc(u)&&tim[sf[u]]>tim[mx[u]])&&(mx[u]=sf[u]);(tim[mx[lc(u)]]>tim[mx[u]])&&(mx[u]=mx[lc(u)]);(tim[mx[rc(u)]]>tim[mx[u]])&&(mx[u]=mx[rc(u)]);}inline bool get(int u){return rc(fa[u])==u;}inline bool isrt(int u){return lc(fa[u])!=u&&rc(fa[u])!=u;}inline void Rotate(int u){int p=fa[u],pp=fa[p],d=get(u);if(!isrt(p))son[pp][get(p)]=u;son[p][d]=son[u][!d],son[u][!d]=p;fa[p]=u,fa[u]=pp,fa[son[p][d]]=p;pushup(p);pushup(u);}void Splay(int u){static int q[N],qn;q[qn=1]=u;for(int re p=u;!isrt(p);p=fa[p])q[++qn]=fa[p];for(int re i=qn;i;--i)pushdn(q[i]);for(int re p=fa[u];!isrt(u);Rotate(u),p=fa[u])if(!isrt(p))Rotate(get(p)==get(u)?p:u);}void access(int u){for(int re ch=0;u;u=fa[ch=u]){Splay(u);if(rc(u))sub[u]+=sum[rc(u)],rc(u)=0;if(ch){sub[u]-=sum[ch];while(pushdn(ch),lc(ch))ch=lc(ch);Splay(ch);sf[u]=pr[ch];rc(u)=ch;}pushup(u);}}void makert(int u){access(u);Splay(u);rever(u);}int find_rt(int u){access(u);Splay(u);while(pushdn(u),lc(u))u=lc(u);Splay(u);return u;}bool iscon(int u,int v){makert(u);return find_rt(v)==u;}void link(int u,int v,int e){makert(u),access(v),Splay(v);fa[u]=v,sub[v]+=sum[u];pr[u]=sf[v]=e;pushup(u),pushup(v);}void cut(int u,int v){makert(u);access(v);Splay(v);fa[lc(v)]=0,lc(v)=0,pushup(v),pushup(u);}int qsz(int u){access(u);Splay(u);return sum[u];}int find_e(int u,int v){makert(u),access(v),Splay(v);return mx[v];}
#undef lc
#undef rc
}bool del[N<<2|3];
int y1[N],y2[N];
int p1[N],p2[N],po[N];
std::vector<int> e1[N],e2[N];
std::vector<int> nd1[N],nd2[N];
int b[N];signed main(){#ifdef zxyoifreopen("mt.in","r",stdin);
#endifn=gi(),m1=gi(),m2=gi();tot=0;for(int re i=1;i<=m1;++i)p1[i]=++tot;for(int re i=1;i<=m2;++i)p2[i]=++tot;for(int re i=1;i<=n;++i)po[i]=++tot,vl[tot]=1;for(int re i=1;i<=tot;++i)LCT::pushup(i);for(int re i=1;i<=m1;++i)gi(),b[i]=y1[i]=gi();std::sort(b+1,b+m1+1);ct1=std::unique(b+1,b+m1+1)-b-1;for(int re i=1;i<=m1;++i){y1[i]=std::lower_bound(b+1,b+ct1+1,y1[i])-b;nd1[y1[i]].push_back(i); }for(int re i=1;i<n+m1;++i){int t=gi(),u=gi(),v=gi();if(t==1){e[++ec]=(edge){po[u],p1[v]};e1[v].push_back(ec);tim[ec]=y1[v];LCT::link(po[u],p1[v],ec);}else {e[++ec]=(edge){p1[u],p1[v]};if(y1[u]>y1[v])e1[u].push_back(ec),tim[ec]=y1[u];else e1[v].push_back(ec),tim[ec]=y1[v];LCT::link(p1[u],p1[v],ec);}}for(int re i=1;i<=m2;++i)gi(),b[i]=y2[i]=gi();std::sort(b+1,b+m2+1);ct2=std::unique(b+1,b+m2+1)-b-1;for(int re i=1;i<=m2;++i){y2[i]=std::lower_bound(b+1,b+ct2+1,y2[i])-b;nd2[y2[i]].push_back(i);}for(int re i=1;i<n+m2;++i){int t=gi(),u=gi(),v=gi();if(t==1){e[++ec]=(edge){po[u],p2[v]};e2[v].push_back(ec);}else {e[++ec]=(edge){p2[u],p2[v]};if(y2[u]>y2[v])e2[u].push_back(ec);else e2[v].push_back(ec);}}ll ans=0,all=(ll)m1*m2;for(int re i1=ct1,i2=1,now=0;i1;--i1){for(int re u:nd1[i1])for(int re j:e1[u]){if(!del[j])LCT::cut(e[j].u,e[j].v);}while(i2<=ct2&&LCT::qsz(po[1])<n){for(int re u:nd2[i2])for(int re j:e2[u]){if(LCT::iscon(e[j].u,e[j].v)){int p=LCT::find_e(e[j].u,e[j].v);LCT::cut(e[p].u,e[p].v);del[p]=true;}LCT::link(e[j].v,e[j].u,j);}now+=nd2[i2++].size();}ans+=(ll)nd1[i1].size()*(m2-now);}if(ans==0)cout<<"0\n";else if(ans==all)cout<<"1\n";else {ll g=std::__gcd(ans,all);cout<<ans/g<<"/"<<all/g<<"\n";}return 0;
}

【校内模拟】坦克(LCT)相关推荐

  1. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  2. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  3. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

  4. 蓝桥杯校内模拟赛_C++组

    蓝桥杯校内模拟赛 填空题 填空题比较简单,只需要在空格中填写整数答案即可: 在计算机存储中,15.125GB是多少MB? 解题思路: 1GB=1024MB,打开系统计算器计算即可 答案: 15488 ...

  5. 第十四届蓝桥杯校内模拟赛第一期——Python

    第十四届蓝桥杯校内模拟赛第一期--Python 文章目录 第十四届蓝桥杯校内模拟赛第一期--Python 1.二进制位数 问题描述 参考答案 扩展 2. 晨跑 问题描述 参考答案 扩展 3. 调和级数 ...

  6. 【蓝桥】软件校内模拟赛(二)反倍数 题目+题解

    文章目录 前言 反倍数 题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度 ...

  7. 【蓝桥】第十一届软件类校内模拟赛(二)填空题部分

    起晚了起晚了,比赛都快结束了才整完qwq 文章目录 前言 填空题 1题目描述 2题目描述 3题目描述 4题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问 ...

  8. (Java入门)面向对象思想模拟坦克开炮,加速,减速行为

    用面向对象的思想编写一个应用程序,该程序有两个类:Tank类和Fight类.      要求:1.模拟坦克加速.减速            2.给定炮弹的数量,模拟开炮行为.            3 ...

  9. [蓝桥杯第十一届校内模拟赛] Apare_xzc

    华中师范大学蓝桥杯第十一届校内模拟赛 2020/3/22 8:00-12:00 题目还是比省赛要简单的,我9:25就做完了. 第一题 分析: 简单题,求给定的1200000的正约数的个数.我们可以暴力 ...

  10. 【校内模拟】【18-10-16】长者 【主席树】【哈希】

    (拖更N天终于想起来我还有博客 ) (校内模拟的题面&代码联赛后解除封印~) 题解 1.0 这次是正经的分析 把题目概括一下,进行认真分析,我们可以依次得到以下信息(由浅至深): 1.考虑骗分 ...

最新文章

  1. 天天向上 专访Data Domain创始人李凯
  2. java获得项目绝对路径
  3. 利用nofllow与内页链接做好SEO
  4. Dataset之MapillaryVistas:MapillaryVistas数据集的简介、下载、使用方法之详细攻略
  5. 计算机风冷散热系统的原理,显卡“发烧”的原因_显卡散热原理
  6. 工作235:splice
  7. 操作系统常考知识点总结(1)
  8. 动态重定位的增加的紧凑功能
  9. OSI网络模型(TCP/IP五层模型)
  10. winform上传文件解决方案
  11. web app iphone4 iphone5 iphone6 iphone6 Plus响应式布局 适配代码
  12. GitHub 的 10 分钟快速入门教程
  13. 日语整理之 自五 他五
  14. istio 防故障流量控制
  15. 如何通过关键字和搜索结果分析用户需求
  16. 乱象?真象!——中国公有云服务市场大起底
  17. java转换大小写快捷键_Java 大小写最快转换方式实例代码
  18. 全国区划图县域图(截至2019年底)
  19. Qt_UI_vs建工程双击ui文件没有弹出设计界面
  20. 03.23可转债打新策略

热门文章

  1. 校验身份证号码并输出个人信息
  2. 机器学习中的度量——相关系数
  3. 再砸200亿美元抢购Nuance,微软十年“钞”能力都花在哪了?
  4. java基础篇(5) 运算顺序的深入解析
  5. 发送邮件自动保存到草稿箱
  6. Exchange发送邮件后卡在草稿箱
  7. 阅读文献1:Bootstrapping ViTs: Towards Liberating Vision Transformers from Pre-training(文章翻译及自身的理解和总结)
  8. 【路由】设置二级路由器
  9. 最新毕设 基于STM32的智能宠物投喂系统(全套资料)
  10. 《ChatGPT Prompt Engineering for Developers》课程-提示词原则