LOJ #2107. 「JLOI2015」城池攻占 Splay+启发式合并

这道题拿左偏树做的话时间复杂度好像是 $O(n \log n)$ 的,拿 $Splay$ 的话就是 $O(n \log^2 n)$ 的.   

$Splay$ 真恶心,真心不好写,要不是可以练习代码能力的话我才不用 $Splay$.  

code:   

#include <bits/stdc++.h>       
#define ll long long       
#define N 300006 
#define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout)  
using namespace std;  
const ll inf=7e18+2;   
ll h[N];
struct opt 
{
    int a;  
    ll v;     
}tree[N];       
int DE;       
int n,m,edges,tot,FL,Ans1[N],Ans2[N],ge[N];         
int dep[N],hd[N],to[N],nex[N],rt[N],ou[N];            
namespace BST
{  
    #define lson s[x].ch[0] 
    #define rson s[x].ch[1]  
    struct node 
    {   
        ll v,a,b;  
        int si,ch[2],f,id;  
        void ini() 
        {
            v=0,a=1,b=0;    
            si=1,ch[0]=ch[1]=f=id=0;  
        }   
    }s[N*20];    
    int tot;  
    stack<int>S;       
    inline int get(int x) { return s[s[x].f].ch[1]==x; }   
    inline int newnode()  
    {
        if(S.empty()) 
            return ++tot;   
        else
        {
            int u=S.top(); 
            S.pop();  
            return u;   
        }
    }    
    inline void pushup(int x) 
    {
        s[x].si=s[lson].si+s[rson].si+1;  
    }
    inline void mark_a(int x,ll a) 
    {
        s[x].a*=a,s[x].b*=a;     
        if(s[x].v!=inf&&s[x].v!=-inf)   
            s[x].v*=a;        
    }
    inline void mark_b(int x,ll b) 
    {
        s[x].b+=b;   
        if(s[x].v!=inf&&s[x].v!=-inf)   
            s[x].v+=b;   
    }
    inline void pushdown(int x) 
    {
        if(s[x].a!=1) 
        {
            if(lson)  
                mark_a(lson,s[x].a);  
            if(rson) 
                mark_a(rson,s[x].a);  
            s[x].a=1; 
        }
        if(s[x].b) 
        {
            if(lson) 
                mark_b(lson,s[x].b);  
            if(rson) 
                mark_b(rson,s[x].b);   
            s[x].b=0;  
        }
    }
    int ins(int &x,int ff,int id,ll v) 
    {
        if(!x) 
        {
            x=newnode();       
            s[x].ini();  
            s[x].f=ff,s[x].id=id,s[x].v=v; 
            return x;      
        }      
        ++s[x].si;  
        pushdown(x);     
        return ins(s[x].ch[v>s[x].v],x,id,v); 
    }  
    inline int find(int x,ll v) 
    {
        int r=0;    
        while(1) 
        {    
            if(!x) 
                break;  
            pushdown(x);       
            if(s[x].v>=v)  
                r=x,x=lson;    
            else 
                x=rson;  
        }
        return r;   
    }   
    inline void rotate(int x) 
    {
        int old=s[x].f,fold=s[old].f,which=get(x);  
        s[old].ch[which]=s[x].ch[which^1];  
        if(s[old].ch[which]) 
            s[s[old].ch[which]].f=old;  
        s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;  
        if(fold)  
            s[fold].ch[s[fold].ch[1]==old]=x;   
        pushup(old),pushup(x); 
    }
    void splay(int x,int &tar) 
    {
        int u=s[tar].f;  
        for(int fa;(fa=s[x].f)!=u;rotate(x))     
            if(s[fa].f!=u)  
                rotate(get(fa)==get(x)?fa:x);  
        tar=x;  
    }    
    void ope(int &x,int y) 
    {      
        if(s[y].v!=-inf&&s[y].v!=inf)   
        { 
            int p=ins(x,0,s[y].id,s[y].v);    
            if((rand()%3)==0)   
                splay(p,x);                          
        }
        pushdown(y);   
        if(s[y].ch[0])  
            ope(x,s[y].ch[0]);   
        if(s[y].ch[1]) 
            ope(x,s[y].ch[1]);   
        S.push(y);     
    }        
    void del(int x) 
    {    
        if(!x)  
            return;   
        if(s[x].v!=inf&&s[x].v!=-inf) 
        {   
            Ans1[FL]+=1;     
            ou[s[x].id]=1;   
            Ans2[s[x].id]+=dep[ge[s[x].id]]-dep[FL];       
        }    
        pushdown(x);   
        if(lson)   
            del(lson);  
        if(rson)  
            del(rson);   
        S.push(x);   
    }  
    #undef lson 
    #undef rson  
};                
void add(int u,int v) 
{
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;   
}      
void merge(int x,int y) 
{  
    if(BST::s[rt[x]].si<BST::s[rt[y]].si)       
        swap(rt[x],rt[y]);  
    BST::ope(rt[x],rt[y]);   
}               
void dfs(int x,int ff) 
{
    dep[x]=dep[ff]+1;           
    BST::ins(rt[x],0,0,inf);  
    BST::ins(rt[x],0,0,-inf);     
    for(int i=hd[x];i;i=nex[i]) 
    {
        int y=to[i];      
        dfs(y,x),merge(x,y);  
    }       
    FL=x;    
    int q=BST::find(rt[x],h[x]);                                 
    BST::splay(q,rt[x]);             
    BST::s[BST::s[q].ch[0]].f=0; 
    BST::del(BST::s[q].ch[0]);   
    BST::s[q].ch[0]=0;                           
    BST::pushup(q);                                             
    if(x!=1)                
    {
        if(tree[x].a==0)   
            BST::mark_b(q,tree[x].v);   
        if(tree[x].a==1)  
            BST::mark_a(q,tree[x].v);         
    }                     
}
int main() 
{ 
    // setIO("input");     
    int i,j;    
    scanf("%d%d",&n,&m);         
    for(i=1;i<=n;++i)          
        scanf("%lld",&h[i]);         
    for(i=2;i<=n;++i)      
        scanf("%d%d%lld",&j,&tree[i].a,&tree[i].v),add(j,i);            
    for(i=1;i<=m;++i) 
    {
        ll v; 
        int u;        
        scanf("%lld%d",&v,&u);     
        ge[i]=u;  
        BST::ins(rt[u],0,i,v);        
    }     
    dfs(1,0);       
    for(i=1;i<=n;++i)   
        printf("%d\n",Ans1[i]);  
    for(i=1;i<=m;++i)  
        if(!ou[i])      
            printf("%d\n",dep[ge[i]]);  
        else 
            printf("%d\n",Ans2[i]);  
    return 0;
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值