ABC实在是没什么好说的,但是D题真的太妙了,详细的说一下吧

首先思路是对于a相等的分类,假设有n个,则肯定要把n-1个都增加,因为a都是相等的,所以肯定是增加t小的分类,也就是说每次都能处理一个分类,复杂度是O(n^2),这个思路很好写,优先队列随便搞一下就行了,但是题目中N = 2 * 1e5,n^2肯定是不行的,然后就是这个很巧妙的方法了,cf官方的题解我没看懂...有点尴尬,它也没给标程,但是cf的题解好像不是这个方法

看了网上用并查集的方法,首先以t为关键字从大到小排序,然后用并查集维护当前这个应该加到哪个数字,因为是从大到小排序,所以加的数字越来越大,假设排序后是1112,首先第一次是1,不用加,把1连到2,第二次把1连到3,第三次把1连到4,然后最妙的事情就是,2这时候因为1连了2,所以这时候我们可以知道2需要连到4,因为每个数字一层一层的往上加,在合并的过程中就合并在一起了,所以保证了正确性。

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
const int N = ;
struct news{
int a, t;
bool operator < (const news &o) const{
return t > o.t;
}
} num[N];
map < int, int > fa; int find(int a) {
return (fa[a] == ) ? a : (fa[a] = find(fa[a]));
} inline void merge(int a, int b) {
int f = find(b);
if (f != a)
fa[a] = f;
}
int main() {
int n;
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d", &num[i].a);
for (int i = ; i < n; i++)
scanf("%d", &num[i].t);
long long ans = ;
sort(num, num + n);
for (int i = ; i < n; i++) {
int f = find(num[i].a);
if (f == num[i].a) {
merge(f, f + );
}
else {
merge(f, f + );
ans = ans + 1ll * (f - num[i].a) * num[i].t;
}
}
printf("%lld\n", ans);
return ;
}

------------恢复内容结束------------

Codeforces Round #623 (Div. 2) D.Recommendations 并查集的更多相关文章

  1. Codeforces Round #582 (Div. 3)-G. Path Queries-并查集

    Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...

  2. Codeforces Round #346 (Div. 2)---E. New Reform--- 并查集(或连通图)

    Codeforces Round #346 (Div. 2)---E. New Reform E. New Reform time limit per test 1 second memory lim ...

  3. Codeforces Round #260 (Div. 1) C. Civilization 并查集,直径

    C. Civilization Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/probl ...

  4. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

  5. Codeforces Round #376 (Div. 2) C. Socks —— 并查集 + 贪心

    题目链接:http://codeforces.com/contest/731/problem/C 题解: 1.看题目时,大概知道,不同的袜子会因为要在同一天穿而差生了关联(或者叫相互制约), 其中一条 ...

  6. Codeforces Round #541 (Div. 2)D(并查集(dsu),拓扑排序)

    #include<bits/stdc++.h>using namespace std;vector<int>g[2007];int fa[2007],vis[2007],num ...

  7. Codeforces Round #346 (Div. 2) E题 并查集找环

    E. New Reform Berland has n cities connected by m bidirectional roads. No road connects a city to it ...

  8. Codeforces Round #812 (Div. 2) E(并查集)

    种类并查集:定义种类之间的关系来判断操作是否进行 题目大意:对于题目给出的一个矩阵,我们可以进行一种操作:swap(a[i][j],a[j][i]) 使得矩阵可以变换为字典序最小的矩阵 思路: 通过扫 ...

  9. Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine)

    A. Dead Pixel(思路) 思路 题意:给我们一个m*n的表格,又给了我们表格中的一个点a,其坐标为(x, y),问在这个表格中选择一个不包括改点a的最大面积的矩形,输出这个最大面积 分析:很 ...

随机推荐

  1. vuex 状态管理 入门

    vuex是什么 是一个对 数据状态实现集中式管理 的工具.可以解决组件之间传递的问题 多组件共享状态(变量),有一个数据好多组件都用 组件数大于2,任何一个组件修改其他组件都要改变 实现组件通信 St ...

  2. Python当中的len(),str(),input(),print()函数当中值得注意的点

    在python当中很多时候会用到这三个函数,这也是考试当中十分常见的考点,这里做一些记录: 1.len():用于测量变量当中的字符串/元组等的长度 举个例子: >>> stt=&qu ...

  3. Android Studio 快捷方式记录

  4. js对象模型1

  5. VBA-FileToFileUpdate

    Public Sub FileToFileUpdate(ByVal fileName As String, ByVal strFrm As String, ByVal strTo As String) ...

  6. What is NodeJS(学习过程)

    为什么要学习node.首先是听说了这个和前后端分离有很大的关系.node作为一个基础的技术,需要提前学习.学习node,不打算直接先跟着视频去学习老师们的课程.因为想自己找到一种适合自己的学习方法.之 ...

  7. 41.Python中加载静态文件

    在一个网页中,不仅仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片等.因此在DTL中加载静态文件时一个必须要解决的问题.在DTL中,使用static标签来加载静态文件.要使用st ...

  8. 信号处理之DFT、IDFT

    一.DFT之前言部分 由于matlab已提供了内部函数来计算DFT.IDFT,我们只需要会调用fft.ifft函数就行: 二.函数说明: fft(x):计算N点的DFT.N是序列x的长度,即N=len ...

  9. 使用Scanner类

    import java.util.Scanner;   public class HelloWorld {     public static void main(String[] args) {   ...

  10. Windows玩转Kubernetes系列4-搭建K8S Dashboard

    下载官方yaml文件 最新的配置文件v2.0.0-beta8版本recommended.yaml,UI地址 wget https://raw.githubusercontent.com/kuberne ...