P4700-[CEOI2011]Traffic【tarjan,dp】

正题

题目链接:https://www.luogu.com.cn/problem/P4700


题目大意

A×BA\times BA×B的网格上有nnn个点,然后mmm条有向/无向边连接成平面图,求最左边每个点能到达的最右边点的数量。

1≤A,B≤109,1≤n≤3×105,1≤m≤9×1051\leq A,B\leq 10^9,1\leq n\leq 3\times 10^5,1\leq m\leq 9\times 10^51A,B109,1n3×105,1m9×105


解题思路

突破点肯定是平面图,考虑假设对于左边两个点a,ba,ba,b,右边两个A,BA,BA,Byyy坐标递增,显然如果aaa能走到BBB且不能走到AAA那么bbb一定不能走到AAA

也就是说每个点能到右边一定是一个区间上的点,先tarjantarjantarjan缩点一下dpdpdp出这个区间就好了。

需要注意的是如果一个右边的点无法被任何左边的点走到那么它不能被统计在区间里。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)(排序)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
const int N=3e5+10;
int n,m,A,B,cnt,cot,pnt,bnt;
int X[N],Y[N],p[N],b[N],l[N],r[N];
int dfn[N],low[N],col[N],in[N];
queue<int> q;stack<int> s;
vector<int> G[N],T[N];
bool ins[N],v[N];
void tarjan(int x){dfn[x]=low[x]=++cnt;s.push(x);ins[x]=1;for(int i=0;i<G[x].size();i++){int y=G[x][i];if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){col[x]=++cot;while(s.top()!=x){col[s.top()]=cot;ins[s.top()]=0;s.pop();}ins[x]=0;s.pop();}return;
}
void dfs(int x){if(v[x])return;v[x]=1;for(int i=0;i<G[x].size();i++)dfs(G[x][i]);
}
void Topsort(){for(int i=1;i<=cot;i++)if(!in[i])q.push(i);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<T[x].size();i++){int y=T[x][i];in[y]--;l[y]=min(l[y],l[x]);r[y]=max(r[y],r[x]);if(!in[y])q.push(y);}}return;
}
bool cmp(int x,int y)
{return Y[x]>Y[y];}
int main()
{scanf("%d%d%d%d",&n,&m,&A,&B);for(int i=1;i<=n;i++)scanf("%d%d",&X[i],&Y[i]);for(int i=1;i<=m;i++){int x,y,k;scanf("%d%d%d",&x,&y,&k);G[x].push_back(y);if(k!=1)G[y].push_back(x);}for(int i=1;i<=n;i++)if(X[i]==0)dfs(i);for(int i=1;i<=n;i++){if(X[i]==0)p[++pnt]=i;else if(X[i]==A&&v[i])b[++bnt]=Y[i];}sort(b+1,b+1+bnt);for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=cot;i++)l[i]=bnt+1,r[i]=0;for(int i=1;i<=n;i++)if(X[i]==A&&v[i]){Y[i]=lower_bound(b+1,b+1+bnt,Y[i])-b;l[col[i]]=min(l[col[i]],Y[i]);r[col[i]]=max(r[col[i]],Y[i]);}for(int x=1;x<=n;x++)for(int i=0;i<G[x].size();i++){int y=G[x][i];if(col[x]==col[y])continue;T[col[y]].push_back(col[x]);in[col[x]]++;}Topsort();sort(p+1,p+1+pnt,cmp);for(int i=1;i<=pnt;i++){int x=col[p[i]];if(!r[x]){puts("0");continue;}printf("%d\n",r[x]-l[x]+1);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stack Overflow 监控系统内部架构初探

Stack Exchange 架构主管 Nick Craver 在最近的一篇文章中介绍了他们的监控系统。他在文章中讨论了监控策略背后的理念和动机&#xff0c;并介绍了他们的工具集——主要是 Bosun、Grafana 和 Opserver。Stack Overflow 及其姐妹站点 Stack Exchange 运行在.NET 和 MS SQL Serve…

三元环计数

无向图三元环计数 从度数小的点向度数大的点连边&#xff0c;若度数相同则将编号小的向编号大的连边。 可以证明复杂度是 \(O(m\sqrt{m})\) 。 有向图三元环计数 将所有边看成无相&#xff0c;按照有向图的方式找出所有三元环&#xff0c;再进行检查是否在原图上也构成三元环。…

P5829 【模板】失配树

P5829 【模板】失配树 题目&#xff1a; 题解&#xff1a; 参考题解 我们先想一个问题&#xff1a;如何求出一个字符串的所有border&#xff1f; 如果一个字符串既是 S的前缀又是 S 的后缀&#xff0c;那么我们把 SS 自己平移一下就可以前后重合&#xff0c;然后我们就可以继…

树哈希判断同构无根同构问题转有根同构问题

前言 判断无根的同构 利用重心作为根进行dfs处理 注意哈希的公式&#xff1a; f[fa]∑f[son]*primesiz[fa] 这个东西好像也是千变万化 复杂度&#xff1a;nmlogn 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define int long long const …

[JLOI2015]战争调度

文章目录题目题解代码实现题目 脸哥最近来到了一个神奇的王国&#xff0c;王国里的公民每个公民有两个下属或者没有下属&#xff0c;这种关系刚好组成一个 n 层的完全二叉树。 公民 i 的下属是 2 * i 和 2 * i 1。最下层的公民即叶子节点的公民是平民&#xff0c; 平民没有下…

CF903G-Yet Another Maxflow Problem【线段树,最大流】

正题 题目链接&#xff1a;https://www.luogu.com.cn/problem/CF903G 题目大意 有nnn个AAA点&#xff0c;nnn个BBB点&#xff0c;第Ai→Ai1A_i\rightarrow A_{i1}Ai​→Ai1​和Bi→Bi1B_{i}\rightarrow B_{i1}Bi​→Bi1​都连有不同流量的边&#xff0c;然后有mmm对Ai→BjA_i…

使用PerfView监测.NET程序性能(一):Event Trace for Windows

前言&#xff1a;在日常项目开发中&#xff0c;我们时不时会遇到程序占用了很高CPU的情况&#xff0c;可能是程序里某些未经优化的代码或者Bug&#xff0c;或者是程序运行压力太大。无论是什么原因&#xff0c;我们总希望能看到到底是哪个方法占用了如此高的CPU。微软为我们提供…

虚树 virtual-tree

我们发现&#xff0c;如果一棵树中真正需要处理的点很少&#xff0c;而总共点数很多时&#xff0c;可以只处理那些需要的点&#xff0c;而忽略其他点。 因此我们可以根据那些需要的点构建虚树&#xff0c;只保留关键点。 oi-wiki上对虚树的介绍 我们根据一下方式建立虚树&#…

8.16模拟:树上算法

文章目录前言收获全排列求期望模型转化树哈希判断同构&无根同构转有根同构比赛复盘T1 reformT2 buildT3 relationT4 split总结前言 150分 10020300 qwq 今天题还是较难 而且又去打了半个多小时的疫苗 情有可原吧 T2其实是可切的 T3的暴力因为数组开小了挂了30qwq 感觉这几…

【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

我似乎很少写这种算法博客可持久化线段树概念概念介绍&#xff08;类比帮助理解&#xff09;简单分析一下时间和空间复杂度&#xff08;内容池&#xff09;模板结构体变量建树模板单点修改模板单点查询模板区间修改模板&#xff08;pushup&#xff09;区间修改模板&#xff08;…

bzoj#4161-Shlw loves matrixI【常系数线性齐次递推】

正题 题目链接:https://darkbzoj.tk/problem/4161 题目大意 给出序列aaa&#xff0c;和hhh的0∼k−10\sim k-10∼k−1项&#xff0c;满足 hn∑i1naihn−ih_n\sum_{i1}^na_ih_{n-i}hn​i1∑n​ai​hn−i​ 求hnh_nhn​。 1≤n≤109,1≤k≤20001\leq n\leq 10^9,1\leq k\leq 20…

P3258 [JLOI2014]松鼠的新家

文章目录题意&#xff1a;题解&#xff1a;树上差分代码&#xff1a;树链剖分代码&#xff1a;P3258 [JLOI2014]松鼠的新家题意&#xff1a; n个点&#xff0c;n-1条边&#xff0c;给出每个点的拜访顺序&#xff0c;问每个点经过几次&#xff08;最后一次移动不算拜访&#xf…

8.17模拟:数学

文章目录前言收获考场复盘T1T2T3T4总结前言 190分 60100300 虽然分不太高&#xff0c;但毕竟今天的题有点太阴间了… 所以还不错啦 最重要的是今天挂分很少 终于停住了这几天越挂越嗨的态势 也就T4挂了5分吧&#xff0c;可以接受 收获 算斜率的区间确定一条线旋转位置时要取…

牛客-小w的魔术扑克【并查集】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1100/C 题目大意 nnn个数字mmm张扑克牌&#xff0c;每张两面有各有一个数字&#xff0c;可以选择一些扑克牌使用正面的数字&#xff0c;一些使用反面的&#xff0c;qqq次询问能否凑出l∼rl\sim rl∼r。 1≤n,m,q≤1051\leq…

[SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]

DP专练博客 DP专练T1&#xff1a;最大子矩阵题目题解代码实现T2&#xff1a;守卫题目题解代码实现T3&#xff1a;手机号码题目题解代码实现T1&#xff1a;最大子矩阵 题目 这里有一个n*m的矩阵&#xff0c;请你选出其中k个子矩阵&#xff0c;使得这个k个子矩阵分值之和最大。…

【做题记录】位运算

CF1592E Bored Bakry 题意&#xff1a;找出最长的区间 \([l,r]\) 满足 \(a_{l}\&a_{l1}\&\dots\&a_{r-1}\&a_{r}>a_{l}\oplus a_{l1}\oplus\dots\oplus a_{r-1}\oplus a_{r}\) 。 首先发现如果有一段满足这个条件的区间&#xff0c;那么一定有一个(较高的)二…

IdentityServer4-EF动态配置Client和对Claims授权(二)

本节介绍Client的ClientCredentials客户端模式&#xff0c;先看下画的草图&#xff1a;一、在Server上添加动态新增Client的API 接口。为了方便测试&#xff0c;在Server服务端中先添加swagger&#xff0c;添加流程可参考&#xff1a;https://www.cnblogs.com/suxinlcq/p/67575…

P3178 [HAOI2015]树上操作

P3178 [HAOI2015]树上操作 题意&#xff1a; 题解&#xff1a; 这已经是很裸的树链剖分了。。。 直接套模板 代码&#xff1a; #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespac…

8.18模拟:构造

文章目录前言收获考场复盘T1T2T3T4总结前言 190分 10006030 明明是dfs专题 不太理想qwq 写了三个dfs就离谱 最不满意的是T2的爆零 其实分类讨论一下是很可做的 而且暴力还因为没开ll挂掉了… 不过毕竟构造题之前几乎没有做过 所以慢慢来吧 收获 一些构造题的trick 调整法数…

P5371-[SNOI2019]纸牌【矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P5371 题目大意 有nnn种牌&#xff0c;每种牌最多CCC张&#xff0c;XXX个限制形如kik_iki​种牌至少aia_iai​张。 求所有牌的序号能分成(i,i,i)(i,i,i)(i,i,i)或者(i,i1,i2)(i,i1,i2)(i,i1,i2)的若干组的方案数。 1≤n≤10…