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 }
  • 相关阅读:
    史上世界上最惨烈的几次股灾!
    做网站的人必须遵守的N大定律,事实上不止做网站
    看士兵突击有感
    中美小学生守则比较
    奥运赞助商及合作伙伴
    sharepoint 备份还原
    sql事务
    javascript 命名空间 类 继承 重载 私有成员和公开成员
    XSLT 学习一
    Web版OutLook,利用POP接收邮件服务器邮件
  • 原文地址:https://www.cnblogs.com/hsd-/p/6753900.html
Copyright © 2011-2022 走看看