E. Train Hard, Win Easy(数学推导 + 前缀和)

news2024/9/21 14:35:20

Problem - E - Codeforces

 

这是一个有关竞赛编程的问题。Zibi 是一名竞赛编程教练,有 n 名选手想要备战。培训比赛具有一些不同寻常的规则——每个团队有两名成员和两个问题,每个选手都会编写其中一个问题的代码。当然,一个团队中的人将编写不同的问题。

评分规则也不是典型的。第一个问题总是一个实现问题:你必须非常快地实现某个众所周知的算法,而你的打字时间将被评分。第二个问题是一个可怕的几何任务,你只需要在合理的时间内得到它的通过。在这里,你的代码长度和难度很重要。之后,Zibi 将为每个方案给出一些罚分(可能是负数),团队的最终得分是它们的总和(得分越少,就越好)。

我们知道,当第 i 位选手编写第一个任务时,他总是会得到 xi 分,编写第二个任务时,他总是会得到 yi 分。我们可以假设,所有选手都知道彼此的技能,并在比赛期间分配问题,以最小化他们的最终得分。请记住,在比赛中,每个人都只编写一个问题。

Zibi 希望所有选手彼此之间进行比赛。然而,有 m 对人真的不喜欢合作,他们绝对不会在一起写比赛。尽管如此,教练将为所有可能的人组成团队,这些人不会互相厌恶。对于每个参与者,教练都感兴趣,他或她所训练的所有团队的得分总和是多少?

输入包含若干行:第一行包含两个整数 n 和 m(2≤n≤300000,0≤m≤300000)——参赛者数量和不想一起写比赛的人数。接下来的 n 行,每行包含两个整数 xi 和 yi(−109≤xi,yi≤109)——第 i 位选手在第一个问题和第二个问题上获得的分数。保证没有两个人既有 xi 又有 yi 相同的情况。最后的 m 行中,每行包含两个整数 ui 和 vi(1≤ui,vi≤n,ui≠vi)——不想在同一个团队中的人的索引。每个无序索引对最多出现一次。

输出 n 行,按照它们在输入中出现的顺序,输出所有参与者的得分总和。

Examples

input

Copy

3 2
1 2
2 3
1 3
1 2
2 3

output

Copy

3 0 3 

input

Copy

3 3
1 2
2 3
1 3
1 2
2 3
1 3

output

Copy

0 0 0 

input

Copy

5 3
-1 3
2 4
1 1
3 5
2 2
1 4
2 3
3 5

output

Copy

4 14 4 16 10 

题解:
除了m种不会组队的,其他一定会组队,单个枚举的话n^2肯定会t,

那么我们可不可以先算出所有的贡献(假设没有之间不组队的人),所有人都相互组队

但这时又会有一个问题,我们如何确定组队时,谁写第一题谁写第二题?

假设我们设

a1 a2

b1 b2

如果a写第一题更优应该满足

a1 + b2 < b1 + a2

变形就成了

a1 - a2 < b1 - b2

我们按照这个排序一下,开始找最优

假设此时遍历到i,i的下标是id(原来的下标)

由于每一个人的顶多会和n - 1个人组队,

贡献其实就是统计前i - 1个人怎么选,(n - i)个人怎么选

由于我们排过序,前面i - 1个人,肯定选第一个比较好,(注意此时都是在和第i个比),前i-1的第二个由i选比较好

对于(n - i)个,排在i后面的,相比选(n - i)的第一个肯定不如选让i选第一个,那么(n - i)的都选第二个

当然对于不能组队的也要减去其贡献,每次记录id,代表其已经选过

然后看是否有和id不能一起组队的,

如果有又分为两种情况

1.被标记过,说明这个人在前面,说明当时肯定这个人选的是第一个,那么id选的就是第二个,减去贡献

2.刚好与第一种相反

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
int n,m;
struct node
{
	int one,two,id;
}a[300050];
int one[300050];
int two[300050];
int last[300005];
vector<int> p[300050];
bool cmp(node a,node b)
{
	return a.one - a.two < b.one - b.two;
}
int ans[300050]; 
void solve()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i].one >> a[i].two;
		a[i].id = i;
		one[i] = a[i].one;
		two[i] = a[i].two;
	}
	for(int i = 1;i <= m;i++)
	{
		int x,y;
		cin >> x >> y;
		p[x].push_back(y);
		p[y].push_back(x);
	}
	sort(a + 1,a + 1 + n,cmp);
	for(int i = n;i >= 1;i--)
	last[i] = last[i + 1] + a[i].two;
	map<int,int> f;
	int pre = 0;
	for(int i = 1;i <= n;i++)
	{
		int id = a[i].id;
		f[id] = 1;
		ans[id] += pre;
		ans[id] += (i - 1)*a[i].two;
		ans[id] += last[i + 1];
		ans[id] += (n - i)*a[i].one;
		for(int j = 0;j < p[id].size();j++)
		{
			int now = p[id][j];
			if(f[now])
			{
				ans[id] -= one[now];
				ans[id] -= two[id];
			}
			else
			{
				ans[id] -= one[id];
				ans[id] -= two[now];
			}
		}
		pre += a[i].one;
	}
	for(int i = 1;i <= n;i++)
	cout << ans[i] <<" ";
}
signed main()
{
	ios::sync_with_stdio(0 );
	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ViveNAS - 一个基于LSM tree的文件存储实现 (一)

1. ViveNAS &#xff08;GitHub - cocalele/ViveNAS&#xff09; ViveNAS 是一个开源分布式的网络文件系统&#xff08;NAS&#xff09;, 具有下面的特点: - 通过不同存储介质的结合&#xff0c;在高性能、低成本间寻找动态的平衡 - 解决数据的长期、低成本存储问题&#xff…

JVM-0428

执行引擎 执行引擎做什么的 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引…

java基础入门-03

Java基础入门-03 10、字符串10.1.API10.1.1API概述10.1.2如何使用API帮助文档 10.2.String类10.2.1 String类概述10.2.2 String类的特点10.2.3 String类的构造方法10.2.4 创建字符串对象两种方式的区别10.2.5 字符串的比较10.2.5.1 号的作用10.2.5.2 equals方法的作用 10.2.6 用…

java web会话管理

在人机交互过程中&#xff0c;会话管理是指保持用户的整个会话活动的交互与计算机系统跟踪的过程。会话管理分为桌面会话管理、浏览器会话管理、Web会话管理。本书讨论的是Web会话管理(通常指的是session以及Cookie) &#xff0c; 也称为会话跟踪。 会话管理基本原理 使用隐藏…

机器学习笔记 图像特征提取器(卷积变体)的技术发展与演变

一、图像特征提取器简述 图像特征提取器是可用于从图像中学习表示的函数或模块。最常见的特征提取器类型是卷积,其中内核在图像上滑动,允许参数共享和平移不变性。 在深度学习技术的快速发展过程中,基于卷积也演变出来了若干新技术由于图像特征的提取,这里进行了一下简单梳…

[oeasy]python0145_版本控制_git_备份还原

git版本控制 回忆上次内容 上次我们了解了 try 的完全体 try 尝试运行 except 发现异常时运行的代码块 else 没有发现异常时运行的代码块 finally 无论是否发现异常最终都要运行的代码块 发现导入部分 可以再分为两个子模块一个输入 a一个输入 b 可以再拆分么&#xff1f;&…

【Python基础练习100题--第一篇:文件篇】

前言 这些题都是在B站的练习题&#xff0c;链接在这 对于刚学python的新手来说十分的适合&#xff0c; 可以加强和巩固我们的基础。 嘿嘿 一起噶油吧&#xff01;&#x1f349; &#x1f349;1.对学生成绩排序 # 这里对字典进行排序&#xff0c;同事使用到了sorted函数 # 这…

【安全工具】Httpx信息收集

文章目录 前言一、下载二、使用步骤1.帮助文档2.常用命令常用组合命令&#xff1a; 总结 前言 HTTPX 是一个功能强大的 HTTP 客户端工具&#xff0c;用于执行各种网络任务&#xff0c;例如发现 Web 应用程序漏洞、探测域名和端口等。它使用了 retryablehttp 库来运行多个探测器…

[计算机图形学]相机与透镜(前瞻预习/复习回顾)

一、相机 1.成像方法 成像方法有两种&#xff0c;合成和捕捉&#xff0c;我们之前所说的光栅化和光线追踪都属于合成的方法&#xff0c;也就是实际上不存在的东西。而另一种成像方法叫做捕捉成像&#xff0c;也就是把真实世界中存在的一些东西变成照片这就是捕捉成像&#xf…

【量化课程】01_投资与量化投资

文章目录 1.1 什么是投资1.1.1 经济意义上的投资1.1.2 投资的分类1.1.3 金融投资1.1.4 个人投资者投资品种1.1.5 投资VS投机 1.2 股票投资的基本流程1.3 常见的股票投资分析流派1.3.1 投资者分析流派 1.4 什么是量化投资1.4.1 量化投资基本概念1.4.2 量化投资的优势1.4.3 量化投…

C多线程、锁、同步、信号量

文章目录 一 线程函数1.1 创建线程1.2 线程退出1.3 线程回收1.4 线程分离&#xff1a;1.5 其他线程函数1.5.1 线程取消1.5.2 线程ID比较 二 线程同步2.1 互斥锁2.1.1定义2.1.2 初始化2.1.3 销毁2.1.4 加锁 、 常试锁、解锁2.1.5 互斥锁使用 2.2 死锁2.3 如何避免死锁2.4 读写锁…

05_从0运行,重定位,初始化,中断再到定时器

总结 这边简单讲讲,代码上电后从0开始发生了什么,为什么要重定位把代码复制到sdram, bin文件前面几条跳转函数都跳转去哪 中断产生后发生什么 重定位问题 1.为什么需要重定位 把程序从一个位置移到另一个位置 叫重定位 可以只重定位部分段的数据 也可以把所有的都重定位到sd…

Linux运维之shell基础

一.流程控制 1.if判断 基本语法&#xff1a; if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi注意事项&#xff1a; ①[ 条件判断式 ]&#xff0c;中括号和条件判断式之间必须有空格②if 后要有空格 例如&#xff0c;现在写一个if.sh脚本文件 #…

echarts关于自定义饼图数据刷新和颜色渲染问题

在使用echarts的自定义饼图Customized Pie时&#xff0c;定义的动态数据会发生颜色无法渲染的问题&#xff0c;如下图所示&#xff1a; 该图表的颜色是根据itemStyle内的color属性而来&#xff0c;如下&#xff1a; itemStyle: {color: #4d90fe, /* 图表的颜色 */shadowBlur:…

【python知识】importlib包详解

importlib — The implementation of import — Python 3.11.3 documentation 目录 一、说明 二、 模块导入简介 2.1 最简单的 importlib用途 2.2 importlib 包的目的有三个 2.3 import_module() 和__import__() 三、高级模块使用 3.1 动态引入 3.2 模块引入检查 3…

SpringBoot整合Mybatis-Plus、Jwt实现登录token设置

Spring Boot整合Mybatis-plus实现登录常常需要使用JWT来生成用户的token并设置用户权限的拦截器。本文将为您介绍JWT的核心讲解、示例代码和使用规范&#xff0c;以及如何实现token的生成和拦截器的使用。 一、JWT的核心讲解 JWT&#xff08;JSON Web Token&#xff09;是一种…

JavaWeb——HTML和CSS

HTML和CSS定义 标记语言 :比如XML:可扩展的标记语言&#xff0c;标签可以自己定义&#xff0c;解析时需要按照定义的规则去解析。 学习目的:掌握常见标签和常见样式的使用 HTML 结构: 特点: 1.不区分大小写&#xff0c;不管是<html>还是<HTML>都是一样的作用 …

错题笔记第一篇

目录 1. strlen的用法2. case3. switch4. 二分查找 1. strlen的用法 正确答案 &#xff1a;C strlen计算的是字符串的长度&#xff0c;二字符串是以\0结尾&#xff0c;而咱们并没有存储\0&#xff0c;后序的空间是未知的&#xff0c;strlen找不到\0就会一直找&#xff0c;所以它…

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console 首先需要明确的一点是从 VSCode 插件商店下载的 CMake 是默认打印输出的结果在 debug console 中的&#xff0c;就像下面这样&#xff1a; 可以看到&#xff0c;一个问题是在加载 dll 时候会频繁…

82. Python split方法-分割字符串

82. split方法-分割字符串 文章目录 82. split方法-分割字符串1. 什么是split( )函数2. split( )方法的语法格式如下&#xff1a;3. 实操练习4. 列表索引取值知识回顾5. 用split方法分解网址提取有效信息6. 从地址信息中拆分省、市、区信息 1. 什么是split( )函数 split[splɪ…