ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Konrad and Company Evaluation

2019-10-01 15:50:26  阅读:355  来源: 互联网

标签:cnt int Company ans 三元组 Konrad cal Evaluation size


F. Konrad and Company Evaluation

参考:[codeforces 1230F]Konrad and Company Evaluation-暴力

思路:题意分析见参考博客。因为求的是三元组的个数,所以在保存的时候的时候就保存为有向图,让工资少的员工指向工资多的员工,那么求三元组的时候,只需要以三元组中间的那个员工为参考点来求解即可。

ll cal(int i)
{
    return (cnt[i]-g[i].size())*g[i].size();
}

那么当进行操作的时候,因为每一次会加n所以肯定会比之间它所连接的两个点要大,那么对于该点指向的那个点来说,组成的三元组就要重新进行计算了,所以先把之前算过的部分减去,再把新的部分加上。

代码:

// Created by CAD on 2019/10/1.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=1e6+5;
int cnt[maxn];
vector<int> g[maxn];
ll cal(int i)
{
    return (cnt[i]-g[i].size())*g[i].size();
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;    cin>>n>>m;
    for(int i=1,u,v;i<=m;++i)
    {
        cin>>u>>v;
        if(u>v) swap(u,v);
        g[u].push_back(v);
        cnt[u]++,cnt[v]++;
    }
    ll ans=0;
    for(int i=1;i<=n;++i)   ans+=cal(i);
    int q;  cin>>q;
    cout<<ans<<endl;
    while(q--)
    {
        int x;  cin>>x;
        ans-=cal(x);
        for(auto i:g[x])
        {
            ans-=cal(i);
            g[i].push_back(x);
            ans+=cal(i);
            g[x].clear();
        }
        cout<<ans<<endl;
    }
    return 0;
}

标签:cnt,int,Company,ans,三元组,Konrad,cal,Evaluation,size
来源: https://www.cnblogs.com/CADCADCAD/p/11615492.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有