CF985G Team Players

news2025/4/15 11:53:59

我敢赌,就算你知道怎么做,也必然得调试半天才能 AC。

[Problem   Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription]

在这里插入图片描述

图片来自洛谷

[Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis]

显然不可能正面计算。所以被迫正难则反。

把所有三元组分成四类:不考虑有没有边相连;有且只有一条边连接;有且只有两条边连接;三个点形成三元环。

每种情况分别考虑。

  1. 不考虑有没有边相连。
    等价于对所有 ( i , j , k ) s.t. 0 ≤ i < j < k < n (i,j,k) \quad \text{s.t.} \quad 0 \leq i <j<k<n (i,j,k)s.t.0i<j<k<n 求出 ∑ legal (i,j,k) A i + B j + C k \sum\limits_{\text{legal (i,j,k)}} Ai+Bj+Ck legal (i,j,k)Ai+Bj+Ck
    枚举 k k k,则 ( i , j ) (i,j) (i,j) 只能在 [ 0 , k − 1 ] [0,k-1] [0,k1] 中取值,共 k ( k − 1 ) 2 \dfrac{k(k-1)}{2} 2k(k1) 种情况。
    对于固定的 k k k ∑ 0 ≤ i < j < k A i + B j = ∑ 0 ≤ i < k − 1 ( ∑ i < j < k A i + B j ) = ∑ 0 ≤ i < k − 1 ( A i ( k − i − 1 ) + ∑ i < j < k B j ) \sum\limits_{0 \leq i < j <k}Ai+Bj=\sum\limits_{0 \leq i < k-1}\left ( \sum\limits_{i<j<k}Ai+Bj \right )=\sum\limits_{0\leq i <k-1} \left ( Ai(k-i-1)+\sum\limits_{i<j<k}Bj\right ) 0i<j<kAi+Bj=0i<k1(i<j<kAi+Bj)=0i<k1(Ai(ki1)+i<j<kBj)
    然后把括号内的项展开,可以得到关于 ∑ i 2 \sum i^2 i2 ∑ i \sum i i 的式子,这些式子都是有公式可以 O ( 1 ) O(1) O(1) 计算的。
  2. 有且只有一条边连接的三元组。
    枚举每条边 ( u , v ) s.t. u < v (u,v) \quad \text{s.t.} \quad u<v (u,v)s.t.u<v,则第三个点 w w w 只有三种情况: w < u < v w<u<v w<u<v u < w < v u<w<v u<w<v u < v < w u<v<w u<v<w。每种情况下 u , v u,v u,v 的贡献都是确定的,而 w w w 的和是连续正整数的和,可以用公式求出。
    注意: 用这种方法求出的三元组包含了第三步和第四步的情况。因此,准确地说,第二种情况是有边相连的三元组
  3. 有且只有两条边连接的三元组。
    这是最不好想的一种情况。不仅容易漏掉,也不好想解决方法。
    正解还是很惊艳的。三个点有且只有两条边连接,必然两条边有一个公共点。枚举这个公共点 u u u,那么 v , w v,w v,w 就只能在和 u u u 有边相连的点集中取值。
    问题是,这个点集可能很大,怎么办?
    那我们就不要同时考虑 v , w v,w v,w,仅考虑单个点对答案的贡献。
    如果 v < u v<u v<u,那么 v v v 前面的系数可能是 A A A 或者 B B B(绝对不会是 C C C)。如果系数是 A A A,那么 w w w v v v 大。在一个有限的点集中,我们很容易知道这样的 w w w 有多少个,因此 A v Av Av 的系数我们就可以求出来(请注意,我们只算 v v v 的贡献,至于 w w w 的和我们先不考虑)。其它情况同理。
    枚举点集里的所有点,即可求出第三种情况的贡献。
    注意: 第三步里也重复计算了第四步的情况。
  4. 有三条边连接的三元组。
    这部分最简单了。直接用三元组计数的模板即可。
    (当然,不会这个模板就是送命。)

现在来考虑容斥系数。分别记四个步骤算出来的结果为 S 1 , S 2 , S 3 , S 4 S_1,S_2,S_3,S_4 S1,S2,S3,S4

  • 所有的三元组都会在第一步中计算且仅计算一次。
  • 第二步中,有且仅有一条边连接的三元组仅计算了一次,两条边相连的三元组计算了两次,三条边相连的三元组计算了三次。
  • 第三步中,有两条边相连的二元组计算了一次;三条边相连的三元组计算了三次。
  • 第四步中,三条边连接的三元组都仅计算了一次。

因此,通过你聪明的大脑,你一定可以发现,答案就是 S 1 − S 2 + S 3 − S 4 S_1-S_2+S_3-S_4 S1S2+S3S4

就这么开心的写代码吧。小心细节不要 WA 哦。

Code \color{blue}{\text{Code}} Code

typedef unsigned long long ll; 

const int N=2e5+100; 

int n,m,A,B,C,u[N],v[N];
ll ans;
vector<int> edge[N],e[N];

ll pre_sqr(int n){
	return 1ull*n*(n+1)/2*(2*n+1)/3;
}
ll pre_sum(int n){
	return 1ull*n*(n+1)/2;
}
ll get_sum(int a,int b){
	int t=(b-a+1);
	return 1ull*(a+b)*t/2;
}

ll get_all(){
	ll cnt,tmp1,tmp2,res=0;
	
	for(int j=2;j<n;j++){
//		从 0 到 j-1 中选出两个数
		int i=j-1;//写着简单 
		
		cnt=pre_sum(i);
		tmp1=1ull*i*pre_sum(i-1)-pre_sqr(i-1);
		tmp2=pre_sqr(i);
		
		res+=1ull*tmp1*A;
		res+=1ull*tmp2*B;
		res+=1ull*cnt*C*j;
	}
	
	return res;
}//第一步

ll get_minus(){
	ll res=0;
	
	for(int i=1;i<=m;i++){
		if (u[i]>v[i]) swap(u[i],v[i]);
		
		//(x, u[i], v[i])
		if (u[i]>0)
			res+=1ull*A*pre_sum(u[i]-1)+1ull*u[i]*(1ull*B*u[i]+1ull*C*v[i]);
		
		//(u[i], x, v[i])
		if (v[i]-u[i]>1)
			res+=1ull*B*get_sum(u[i]+1,v[i]-1)+(1ull*A*u[i]+1ull*C*v[i])*(v[i]-u[i]-1);
		//(u[i], v[i], x)
		if (v[i]<n-1)
			res+=1ull*C*get_sum(v[i]+1,n-1)+(1ull*A*u[i]+1ull*B*v[i])*(n-1-v[i]);
	} 
	
	return res;
}//第三步

int ind[N],vistime[N];

ll get_triple(){
	ll res=0;
	
	for(int i=1;i<=m;i++){
		++ind[u[i]];
		++ind[v[i]];
	}
	
	for(int i=1;i<=m;i++){
		if (ind[u[i]]>ind[v[i]]) swap(u[i],v[i]);
		else if ((ind[u[i]]==ind[v[i]])&&(u[i]>v[i])) swap(u[i],v[i]);
		
		edge[u[i]].push_back(v[i]);
	}
	
	memset(vistime,-1,sizeof(vistime));//注意这里,不然可能会多算出一些三元组
	for(int i=0;i<n;i++){
		for(int j:edge[i]) vistime[j]=i;
		
		for(int j:edge[i])
			for(int k:edge[j])
				if (vistime[k]==i){//因为这里
					int t[]={i,j,k};
					sort(t,t+3);
					
					res+=1ull*A*t[0]+1ull*B*t[1]+1ull*C*t[2];
				}
	}
	
	return res;
}//第四步,三元环计数的板子

ll get_add(){
	for(int i=1;i<=m;i++){
		e[u[i]].push_back(v[i]);
		e[v[i]].push_back(u[i]);
	}
	
	ll res=0;
	
	for(int u=0;u<n;u++){
		e[u].push_back(u);
		sort(e[u].begin(),e[u].end());
		
		int x=e[u].size()-1;
		if (x==0) continue;
		
		for(int i=0;i<=x;i++){
			int v=e[u][i];
			
			if (v<u)
				res+=1ull*A*v*(x-i-1)+1ull*B*v*i;
			else if (v>u)
				res+=1ull*B*v*(x-i)+1ull*C*v*(i-1);
			else
				res+=1ull*v*(1ull*(x-i)*(x-i-1)/2*A+1ull*B*(x-i)*i+1ull*i*(i-1)/2*C); 
		}
	}//第二步
	
	return res;
}

int main(){
	n=read();m=read();
	A=read();B=read();C=read();
	for(int i=1;i<=m;i++){
		u[i]=read();
		v[i]=read();
	}
	
	ans=get_all()-get_minus()+get_add()-get_triple();
	
	cout<<ans<<endl;
	
	return 0;
}

最后,Good luck to you。

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

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

相关文章

企业经营决策风险

在企业的经营过程中&#xff0c;领导者每天都在面对大量的决策——该扩大生产还是收缩业务&#xff1f;该增设销售渠道还是提升产品质量&#xff1f;但你知道吗&#xff0c;企业最大的成本&#xff0c;不是生产成本&#xff0c;也不是人工成本&#xff0c;而是决策错误的成本&a…

UE5蓝图实现打开和关闭界面、退出

Button_Back 和Button_Exit是创建的两个按钮事件。 1.Create Widget 创建界面&#xff08;打开界面&#xff09; 2.Add to Viewport 添加到视图 3.remove form Parent&#xff0c;Target&#xff1a;self 从父节点移除当前界面&#xff08;关闭界面&#xff09; 4.Quit Game 退…

JavaWeb 课堂笔记 —— 09 MySQL 概述 + DDL

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…

echarts 图表

echart快速上手 快速上手 - 使用手册 - Apache EChartshttps://echarts.apache.org/handbook/zh/get-started/

无线通信网

1.2.4G相邻信道间有干扰&#xff0c;5G相邻信道几乎无干扰 2.2.4G频段的优点是信号强&#xff0c;衰减小&#xff0c;穿墙强&#xff0c;覆盖距离远&#xff1b;缺点是带宽较窄&#xff0c;速度较慢&#xff0c;干扰较大。 5G频段的优点是带宽较宽&#xff0c;速度较快&#…

数据结构:哈希表 | C++中的set与map

上回说到&#xff0c;红黑树是提升了动态数据集中频繁插入或删除操作的性能。而哈希表(Hash Table)&#xff0c;则是解决了传统数组或链表查找数据必须要遍历的缺点。 哈希表 哈希表的特点就是能够让数据通过哈希函数存到表中&#xff0c;哈希函数能够将数据处理为表中位置的索…

容器初始化Spring Boot项目原理,即web项目(war)包涉及相关类对比详解

以下是关于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的对比详解及总结表格&#xff1a; 1. 核心对比详解 (1) SpringBootServletInitializer 作用&#xff1a; S…

[ctfshow web入门] web29

前置知识 eval: 把字符串按照 PHP 代码来执行&#xff0c;例如eval(“echo 1;”);这个函数拥有回显 system&#xff1a;使php程序执行系统命令&#xff0c;例如&#xff0c;system(“ls”);就是查看当前目录&#xff0c;这个拥有回显 preg_match&#xff1a;查找字符串是否匹配…

5.JVM-G1垃圾回收器

一、什么是G1 二、G1的三种垃圾回收方式 region默认2048 三、YGC的过程(Step1) 3.1相关代码 public class YGC1 {/*-Xmx128M -XX:UseG1GC -XX:PrintGCTimeStamps -XX:PrintGCDetails -XX:UnlockExperimentalVMOptions -XX:G1LogLevelfinest128m5% 60%6.4M 75M*/private stati…

Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(一)

01 查表法 在 our_arm_cos_f32 函数中&#xff0c;查表&#xff08;Look-Up Table, LUT&#xff09; 的核心是 预计算的正弦值表 sinTable_f32&#xff0c;通过巧妙利用余弦与正弦的相位关系实现快速余弦计算。以下是详细解析&#xff1a; 1. 查的是什么表&#xff1f; (1) 表内…

机械臂只有位置信息是否可以进行手眼标定?

平常我在做手眼标定时&#xff0c;一般都是通过OpenCV的cv::calibrateHandEye函数进行求解&#xff0c;需要输入多组不同的机械臂位姿。今天遇到了一款舵机机器人&#xff0c;只能获取位置&#xff0c;得不到姿态信息&#xff0c;想着那就把姿态都设为0&#xff0c;结果求不出来…

Python 数据分析01 环境搭建教程

Python 数据分析01 环境搭建教程 一、安装 Python 环境 访问 Python 官方网站 Python 官网&#xff0c;选择适合你操作系统的 Python 版本进行下载。下载完成后&#xff0c;运行安装程序。在安装过程中&#xff0c;建议选择“Add Python to PATH”选项&#xff0c;这样可以在…

使用 Visual Studio 2022 (VS2022) 编译 FreeCAD 1.0.0 的详细教程

一、环境准备 官方教程&#xff1a;在 Windows 上编译 - FreeCAD Documentation Windows 10/11&#xff08;推荐&#xff09; git vs2022 cmake 3.26.4 Doxygen1.12 二、获取源码与依赖 版本关系 打开Git Bash或CMD&#xff0c;执行以下命令 git clone --recurse-sub…

蓝桥杯单片机频率

long int Freq; unsigned int Timer_1000Ms; 加上 TMOD | 0x05; void Timer0Init(void) //0毫秒12.000MHz {AUXR & 0x7F; //定时器时钟12T模式TMOD & 0xF0; //设置定时器模式TMOD | 0x05;TL0 0x00; //设置定时初值TH0 0x00; //设置定时初值TF0 0; //清除TF0标…

遵循IEC 62304:构建安全可靠的医疗器械软件

目录 一、IEC 62304 标准概述 1. 标准定位与适用范围 二、核心内容与要求 1. 软件安全等级&#xff08;Software Safety Classification&#xff09; &#xff08;1&#xff09;分级标准 &#xff08;2&#xff09;分级依据 &#xff08;3&#xff09;验证要求 2. 软件…

互联网三高-数据库高并发之分库分表

1 数据库概述 1.1 数据库本身的瓶颈 ① 连接数 MySQL默认最大连接数为100&#xff0c;允许的最大连接数为16384 ② 单表海量数据查询性能 单表最好500w左右&#xff0c;最大警戒线800w ③ 单数据库并发压力问题 MySQL QPS&#xff1a;1500左右/秒 ④ 系统磁盘IO、CPU瓶颈 1.2 数…

UE5 在UE中创建骨骼动画

文章目录 创建动画的三种方式修改骨骼动画 创建动画的三种方式 方法一 打开一个已有的动画&#xff0c;左上角“创建资产/创建动画/参考姿势” 这将创建一个默认的A字形的骨骼&#xff0c;不建议这么做 方法二 打开一个已有的动画&#xff0c;左上角“创建资产/创建动画/当前…

[ctfshow web入门] web38

信息收集 过滤多了php和file if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag|php|file/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__); }解题 更多解法参考 [ctfshow web入门] web37 我们选个最简单的。但是因为php被过滤了我们改用…

汽车CAN总线采样点和采样率详解

写在前面 本篇文章主要讲解在汽车电子中CAN总线采样率的相关知识点,内容涉及CAN波特率、采样点、时间份额、同步跳转宽度以及采样率的计算。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1、CAN波特率 CAN波特率常规分为250kbps和500kbps,本文章主要以这两个波特率为…

Maven error:Could not transfer artifact

问题描述 当项目从私有仓库下载依赖时&#xff0c;Maven 报错&#xff0c;无法从远程仓库下载指定的依赖包&#xff0c;错误信息如下&#xff1a; Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…