然而这只是 70pts 的部分分,考场上没想到满分怎么做(现在也不会)

code:

#include <cstdio>
#include <string>
#include <stack>
#include <queue>
#include <cstring>
#include <algorithm>
#define N 100009
#define lson ls[x]
#define rson rs[x]
#define inf 4500000
using namespace std;
void setIO(string s) {
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
int scc;
int cnt;
int n;
int tot;
int edges;
int A[N*5];
int hd[N*5];
int to[N*30];
int nex[N*30];
int ls[N*5];
int rs[N*5];
int vis[N*5];
int dfn[N*5];
int low[N*5];
int id[N*5];
int In[N*5];
int Ou[N*5];
int tag[N*5];
int X[N],L[N],R[N],con[N];
int is[N*5];
stack<int>S;
queue<int>q;
vector<int>G[N*5];
int newnode() {
return ++tot;
}
void add(int u,int v) {
// printf("%d %d\n",u,v);
nex[++edges]=hd[u];
hd[u]=edges;
to[edges]=v;
}
void update(int &x,int l,int r,int p) {
if(l==r) {
x=p;
return;
}
if(!x) {
x=newnode();
}
int mid=(l+r)>>1;
if(X[p]<=mid) {
update(lson,l,mid,p);
}
else {
update(rson,mid+1,r,p);
}
}
void build(int x) {
if(lson) {
add(x,lson);
build(lson);
}
if(rson) {
add(x,rson);
build(rson);
}
}
void Add(int x,int l,int r,int L,int R,int rt) {
if(!x) {
return;
}
if(l>=L&&r<=R) {
add(rt,x);
return;
}
int mid=(l+r)>>1;
if(L<=mid) {
Add(lson,l,mid,L,R,rt);
}
if(R>mid) {
Add(rson,mid+1,r,L,R,rt);
}
}
void tarjan(int u) {
vis[u]=1;
S.push(u);
low[u]=dfn[u]=++cnt;
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(!vis[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]==1) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
++scc;
for(;;) {
int x=S.top();
S.pop();
id[x]=scc;
vis[x]=-1;
if(x==u) {
break;
}
}
}
}
int main() {
// setIO("broadcast");
int i,j;
scanf("%d",&n);
tot=n;
int tp=0;
int root=0;
for(i=1;i<=n;++i) {
scanf("%d%d",&X[i],&con[i]);
L[i]=X[i]-con[i];
R[i]=X[i]+con[i];
A[++tp]=X[i];
A[++tp]=L[i];
A[++tp]=R[i];
}
sort(A+1,A+1+tp);
for(i=1;i<=n;++i) {
X[i]=lower_bound(A+1,A+1+tp,X[i])-A;
L[i]=lower_bound(A+1,A+1+tp,L[i])-A;
R[i]=lower_bound(A+1,A+1+tp,R[i])-A;
}
for(i=1;i<=n;++i) {
update(root,1,inf,i);
}
build(root);
for(i=1;i<=n;++i) {
Add(root,1,inf,L[i],R[i],i);
}
for(i=1;i<=n;++i) {
if(!vis[i]) {
tarjan(i);
}
}
for(i=1;i<=tot;++i) {
for(j=hd[i];j;j=nex[j]) {
int v=to[j];
if(!id[i]||!id[v]) {
continue;
}
if(id[v]!=id[i]) {
++In[id[v]];
++Ou[id[i]];
G[id[i]].push_back(id[v]);
}
}
}
for(i=1;i<=n;++i) {
is[id[i]]=1;
}
for(i=1;i<=scc;++i) {
if(!In[i]) {
q.push(i);
}
}
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=0;i<G[u].size();++i) {
int v=G[u][i];
--In[v];
tag[v]|=(tag[u]|is[u]);
if(!In[v]) {
q.push(v);
}
}
}
int a1=0;
int a2=0;
for(i=1;i<=scc;++i) {
if(is[i]) {
++a1;
}
}
for(i=1;i<=scc;++i) {
if(!tag[i]&&is[i]) {
++a2;
}
}
printf("%d %d\n",a2,a1);
return 0;
}

  

模拟赛T2 线段树优化建图+tarjan+拓扑排序的更多相关文章

  1. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  2. bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)

    直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair&l ...

  3. BZOJ5017 炸弹(线段树优化建图+Tarjan+拓扑)

    Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被 ...

  4. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

  5. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  6. bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...

  7. 『炸弹 线段树优化建图 Tarjan』

    炸弹(SNOI2017) Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸 时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi ...

  8. Libre OJ 2255 (线段树优化建图+Tarjan缩点+DP)

    题面 传送门 分析 主体思路:若x能引爆y,从x向y连一条有向边,最后的答案就是从x出发能够到达的点的个数 首先我们发现一个炸弹可以波及到的范围一定是坐标轴上的一段连续区间 我们可以用二分查找求出炸弹 ...

  9. 【2019北京集训2】duck 线段树优化建图+tarjan

    题目大意:给你$n$个点,第$i$个点有点权$v_i$.你需要将这$n$个点排成一排,第$i$个点的点权能被累加当且仅当这个点前面存在编号在$[l_i,r_i]$中的点,问你这些点应该如何排列,点权和 ...

随机推荐

  1. 本地计算机上的SQL Server(MSSQLSERVER)服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止

    看下SQLExperss协议和 MySQLServer协议的TCP/IP端口,有可能是SQLEXPERSS将TCP端口占用了,将SQLEXPERSS的TCP/IP协议禁用,重启 SQLEXPRESS服 ...

  2. centos 7 安装python3 & pip3

    1.安装python3 https://www.cnblogs.com/Trees/p/7497482.html 2.解决:python ModuleNotFoundError: No module ...

  3. Beta冲刺(7/7)——2019.5.29

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  4. pytorch_05_神经网络

    神经网络 一些神经元的输出会变成另外一些神经元的输入,一般以层来组织,最常见的是全连接神经网络,其中两个相邻层中每一个层的所有神经元与另一个层的所有神经元相连,每个层内部的神经元不相连. 一般的,N层 ...

  5. linux重定向 null和zero

    文件描述符 linux下一切皆文件 文件描述符,是内核为了高效管理已经被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符; 文件描述符是一个简单的非负整数,用 ...

  6. 【CTS2019】氪金手游(动态规划)

    [CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...

  7. Android模拟器太慢怎么办?使用微软的VS模拟器

    开发过android的人都知道,android模拟器非常的慢,推荐使用微软的VS模拟器. (1)到 https://visualstudio.microsoft.com/zh-hans/vs/msft ...

  8. .net 中访问config的一些方式

    人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志. 哎!好久没有写博客了,今天就分享一些比较常用的对config文件的访问一些方式. 首先 引用 using System.Configurat ...

  9. leetcode不同路径

    62. 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...

  10. SQL 自动生成序号

    查询出来的数据的编号,不是按照从1开始的有序进行的,界面上显示想显示有序排序 select RANK() OVER(ORDER BY id ) as ID ,* from reconcilet_det ...