zoukankan      html  css  js  c++  java
  • 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) F dfs序+树状数组

    Performance Review
    Employee performance reviews are a necessary evil in any company. In a performance review, employees give written feedback about each other on the work done recently. This feedback is passed up to their managers which then decide promotions based on the feedback received. Maria is in charge of the performance review system in the engineering division of a famous company. The division follows a typical structure. Each employee (except the engineering director) reports to one manager and every employee reports directly or indirectly to the director. Having the managers assessing the performance of their direct reports has not worked very well. After thorough research, Maria came up with a new performance review system. The main idea is to complement the existing corporate structure with a technical rank for each employee. An employee should give feedback only about subordinates with lower technical level. Hence, the performance review will work as follows. Employees prepare a summary of their work, estimate how much time it takes to review it, and then request their superiors with higher technical rank to review their work. Maria is very proud of this new system, but she is unsure if it will be feasible in practice. She wonders how much time each employee will waste writing reviews. Can you help her out?
    Task
    Given the corporate structure of the engineering division, determine how much time each employee will spend writing performance reviews.
    Input
    The rst line of input has one integer E, the number of employees, who are conveniently numbered between 1 and E. The next E lines describe all the employees, starting at employee 1 until employee E. Each line contains three space-separated integers mi ri ti, the manager, the technical rank and the expected time to perform the review of employee i. The engineering director has no manager, represented with mi = −1. The other employees have mi between 1 and E.
    SWERC'2016 Universidade do Porto 13
    Problem F Problem F
    Constraints 1 ≤ E ≤ 100000 Number of employees 1 ≤ ri ≤ 100000 Technical rank of each employee 1 ≤ ti ≤ 100000 Expected time to perform each review
    Output
    The output contains E lines. Line i has the time employee i will spend writing reviews.
    Sample Input
    5

    4 4 80

    1 1 40

    -1 10 60

    3 5 50

    4 8 70
    Sample Output


    40

    0

    240

    120

    0

    题意:给你一棵树 每个结点有r,t值  现在求所有结点i的子树中的r值小于i点的r值的所有结点的t值之和

    题解:dfs序列+树状数组 结点按照r值排序 r值相同的深度小的排前面。依次处理结点 ,将子树的操作转换到区间上。树状数组中存的是结点序号(dfs遍历序号in[root])

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define ll __int64
      4 #pragma comment(linker, "/STACK:102400000,102400000")
      5 ll n;
      6 ll a,b,c;
      7 ll pre[100005];
      8 ll in[100005];
      9 ll out[100005];
     10 ll nedge=0;
     11 ll dfn=0;
     12 ll dep[100005];
     13 map<ll,ll>mp;
     14 struct node
     15 {
     16     ll pre;
     17     ll to;
     18 }N[4*100005];
     19 struct dian
     20 {
     21    ll w;
     22    ll you;
     23    ll id;
     24 }M[100005],MM[100005];
     25 ll tree[100005];
     26 bool cmp(struct dian aaa,struct dian bbb)
     27 {
     28     if(aaa.you<bbb.you)
     29         return true;
     30     else
     31     {
     32         if(aaa.you==bbb.you)
     33             return dep[in[aaa.id]]<dep[in[bbb.id]];
     34     }
     35     return false;
     36 }
     37 void add(ll from,ll to)
     38 {
     39     nedge++;
     40     N[nedge].to=to;
     41     N[nedge].pre=pre[from];
     42     pre[from]=nedge;
     43 }
     44 void getdfs(ll root,int de)
     45 {
     46     in[root]=++dfn;
     47     MM[dfn]=M[root];
     48     dep[dfn]=de;
     49     mp[root]=1;
     50     for(ll i=pre[root];i;i=N[i].pre){
     51         if(mp[N[i].to])
     52             continue;
     53         getdfs(N[i].to,de+1);
     54     }
     55     out[root]=dfn;
     56 }
     57 ll lowbit(ll xx)
     58 {
     59     return xx&(-xx);
     60 }
     61 void add2 (ll x,ll y)
     62 {
     63     for(ll i=x;i<=n;i+=lowbit(i))
     64         tree[i]+=y;
     65 }
     66 ll getsum (ll x)
     67 {
     68     ll ans=0;
     69     for(ll i=x;i>=1;i-=lowbit(i))
     70         ans+=tree[i];
     71     return ans;
     72 }
     73 int main()
     74 {
     75     scanf("%I64d",&n);
     76     memset(tree,0,sizeof(tree));
     77     memset(pre,0,sizeof(pre));
     78     nedge=0;
     79     ll ro=0;
     80     for(ll i=1;i<=n;i++)
     81     {
     82         scanf("%I64d %I64d %I64d",&a,&b,&c);
     83         M[i].w=c;
     84         M[i].you=b;
     85         M[i].id=i;
     86         if(a==-1){
     87             ro=i;
     88             continue;
     89             }
     90         add(a,i);
     91         add(i,a);
     92     }
     93     getdfs(ro,1);
     94     ll ans[100005];
     95     sort(MM+1,MM+1+n,cmp);
     96     for(ll i=1;i<=n;i++)
     97     {
     98         ll l,r;
     99         l=in[MM[i].id];
    100         r=out[MM[i].id];
    101         ans[MM[i].id]=getsum(r)-getsum(l);
    102         add2(l,MM[i].w);
    103     }
    104     for(ll i=1;i<=n;i++)
    105         printf("%I64d
    ",ans[i]);
    106     return 0;
    107 }
  • 相关阅读:
    hdu 3068 Manacher算法
    用gitolite新建项目,clone后首次push,可能会出现: git: No refs in common and none specified; doing no
    Linux命令之nano
    linux下git使用记录1 git 提交
    Linux 删除文件夹和文件的命令
    UBUNTU 下GIT的安装
    mysql 常用命令
    mysql 数据类型
    SQL优化
    CSS入门教程——定位(positon)
  • 原文地址:https://www.cnblogs.com/hsd-/p/6753900.html
Copyright © 2011-2022 走看看