模拟赛T2 线段树优化建图+tarjan+拓扑排序

本文深入探讨了一种复杂的图算法,通过使用多种数据结构如栈、队列和图,以及算法如Tarjan算法来解决特定问题。文章详细介绍了算法的实现过程,包括节点更新、边的添加、强连通分量的寻找等关键步骤。

然而这只是 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;
}

  

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化议;③支持交通政策制定与信号灯配时优化;④作为智慧城市设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读议:议结合文中代码示例搭开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值