• 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 }
  • 相关阅读:
    关于微信最新推出的应用号的看法
    HTML常见标签
    重读《从菜鸟到测试架构师》-- 模拟客户的访问行为(上)
    重读《从菜鸟到测试架构师》-- 大促带来的灾难
    重读《从菜鸟到测试架构师》-- 功能测试之百种变身
    重读《从菜鸟到测试架构师》-- 对黑盒子的全方位照明
    重读《从菜鸟到测试架构师》-- 如何把黑盒子分块
    重读《从菜鸟到测试架构师》-- 黑色的盒子里有什么(下)
    重读《从菜鸟到测试架构师》--黑色的盒子里有什么(中)
    重读《从菜鸟到测试架构师》-- 黑色的盒子里面有什么(上)
  • 原文地址:https://www.cnblogs.com/hsd-/p/6753900.html
Copyright © 2020-2023  润新知