zoukankan      html  css  js  c++  java
  • 情报传递(message)

    情报传递(message)

    题目描述

     

    奈特公司是一个巨大的情报公司,它有着庞大的情报网络,情报网络中共有n名情报员。每名情报员可能有若干名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线。奈特公司纪律森严,每名情报员只能与自己的上、下线联系,同时,情报网络中任意两名情报员一定能够通过情报网络传递情报。

    奈特公司每天会派发以下两种任务中的一个任务:

    1、搜集情报:指派T号情报员搜集情报

    2、传递情报:将一条情报从X号情报员传递至Y号情报员

    情报员最初处于潜伏阶段,他们是相对安全的,我们认为此时所有情报员的危险值为0;一旦某个情报员开始搜集情报,他的危险值就会持续增加,每天增加1点危险值(开始搜集情报的当天危险值仍为0,第2天危险值为1,第3天危险值为2,以此类推)。传递情报并不会使情报员的危险值增加。

    为了保证传递情报的过程相对安全,每条情报都有一个风险控制值C。奈特公司认为,参与传递这条情报的所有情报员中,危险值大于C的情报员将对这条情报构成威胁。现在,奈特公司希望知道,对于每个传递情报任务,参与传递的情报员有多少个,其中对这条情报构成威胁的情报员有多少个。

     

     

    第1行包含1个正整数n,表示情报员个数。

    第2行包含n个非负整数,其中第i个整数Pi表示i号情报员上线的编号。特别地,若Pi=0,表示i号情报员是大头目。

    第3行包含1个正整数q,表示奈特公司将派发q个任务(每天一个)。

    随后q行,依次描述q个任务。

    每行首先有1个正整数k。若k=1,表示任务是传递情报,随后有3个正整数Xi、Yi、Ci,依次表示传递情报的起点、终点和风险控制值;若k=2,表示任务是搜集情报,随后有1个正整数Ti,表示搜集情报的情报员编号。


    solution

    首先把询问离线。

    可以发现如果一个有威胁的人应该在T-c[i]时刻之前就开始收集

    按时间为下标,每个点建主席树。

    第k棵树的每个值表示时间i,k到根的路径上是否有点出现

    由于离线,我们就一开始全部建完。

    效率O(nlogn)

    xjq神犇用树状数组切掉

    把询问按T-c排序,用树剖序作下标建树状数组

    按时间把点和询问加入

    常数贼小orz

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 200005
    using namespace std;
    int n,Q,f[maxn][22],head[maxn],t1,t2,tot,deep[maxn];
    int ti[maxn],root[maxn],cnt;
    struct node{
        int v,nex;
    }e[maxn*2];
    struct Que{
        int op,x,y,c;
    }q[maxn];
    struct Node{
        int x,ls,rs;
    }tree[maxn*20];
    void lj(int t1,int t2){
        e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
    }
    void wh(int k){
        tree[k].x=tree[tree[k].ls].x+tree[tree[k].rs].x;
    }
    void build(int &k,int la,int l,int r,int pl){
        if(!k)k=++cnt;
        if(l==r){tree[k].x=tree[la].x+1;return;}
        int mid=l+r>>1;
        if(pl<=mid)tree[k].rs=tree[la].rs,build(tree[k].ls,tree[la].ls,l,mid,pl);
        else tree[k].ls=tree[la].ls,build(tree[k].rs,tree[la].rs,mid+1,r,pl);
        wh(k);
    }
    void dfs(int k){
        int fa=f[k][0];deep[k]=deep[fa]+1;
        if(ti[k])build(root[k],root[fa],1,Q,ti[k]);
        else root[k]=root[fa];
        for(int i=head[k];i;i=e[i].nex){
            if(e[i].v!=fa)dfs(e[i].v);  
        }
    }
    int L(int x,int y){
        if(deep[x]<deep[y])swap(x,y);
        for(int i=20;i>=0;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];
        for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
        if(x==y)return x;
        return f[x][0];
    }
    int ask(int t1,int t2,int t3,int t4,int l,int r,int pl){
        if(pl<=0)return 0;
        if(l==r)return tree[t1].x+tree[t2].x-tree[t3].x-tree[t4].x;
        int mid=l+r>>1;
        int s1=tree[t1].ls,s2=tree[t2].ls,s3=tree[t3].ls,s4=tree[t4].ls;
        if(mid<pl){
            int tmp=tree[s1].x+tree[s2].x-tree[s3].x-tree[s4].x;
            s1=tree[t1].rs,s2=tree[t2].rs,s3=tree[t3].rs,s4=tree[t4].rs;
            return tmp+ask(s1,s2,s3,s4,mid+1,r,pl);
        }
        else return ask(s1,s2,s3,s4,l,mid,pl);
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d",&f[i][0]);
            lj(f[i][0],i);
        }
        for(int j=1;j<=20;j++)
        for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
        cin>>Q;
        for(int i=1;i<=Q;i++){
            scanf("%d",&q[i].op);
            if(q[i].op==1)scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].c);
            else {
                scanf("%d",&q[i].c);
                if(!ti[q[i].c])ti[q[i].c]=i;
            }
        }
        dfs(1);
        for(int i=1;i<=Q;i++){
        if(q[i].op==2)continue;
        int lca=L(q[i].x,q[i].y);
        printf("%d ",deep[q[i].x]+deep[q[i].y]-deep[lca]-deep[f[lca][0]]);
        printf("%d
    ",ask(root[q[i].x],root[q[i].y],root[lca],root[f[lca][0]],1,Q,i-q[i].c-1));
        }
        return 0;
    }
  • 相关阅读:
    ES学习(十)
    ES学习(九)
    ES学习(八)
    ES学习(七)--documentAPI
    ES学习(六)--shard和replica机制
    ES学习(四)--嵌套聚合、下钻分析、聚合分析
    uniapp中常见的请求方法封装 --来之插件市场(全局方法封装(请求/正则/URI)
    工具/插件
    express中文件的上传 multer
    express中开发常用
  • 原文地址:https://www.cnblogs.com/liankewei/p/10358763.html
Copyright © 2011-2022 走看看