次方计数的拆贡献法(考虑组合意义)+限定类问题善用值域与位置进行ds:1006T3

news2025/1/20 10:51:44

对于多次方的计数问题可以考虑拆贡献。

题目问 ∣ S ∣ 3 |S|^3 S3 ∣ S ∣ |S| S 表示选的点数。相当于在 ∣ S ∣ |S| S 中选了3次,也就是选了3个可相同的点。

先考虑3个不相同点的贡献,对应任意3个点,必然会对所有包含其矩形产生贡献。所以只需要统计对应的矩形数目。但是必须乘上全排列6,因为我们钦定选了3次是考虑顺序的。

对于2个同,3个同同理。都会对相应矩形产生贡献。

现在考虑统计3个点的情况,发现本质有两种:
在这里插入图片描述
这种很好统计,直接ds维护。

在这里插入图片描述

这种我们拿ds维护的时候,很容易出现算错的现象。因为我们计算贡献的顺序可能是这样的:

在这里插入图片描述

那就会把这种情况算进去:

在这里插入图片描述

而用这种方法计算则不会出现问题,因为我们放在了两边

在这里插入图片描述

//5.7k

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 100010
//#define M
#define mo 998244353
struct Node {
	int x, id; 
}b[N];
int n, m, i, j, k, T;
int ans1, ans2, ans3; 
int mx, p[N], a[N], rt; 

int calc1() {
	int ans=0; 
	for(i=1; i<=n; ++i) {
		ans+=i*(n-i+1)%mo*p[i]%mo*(n-p[i]+1)%mo; 
		ans%=mo; 
	}
	return ans; 
}

void Add(int &a, int b) {
	a+=b; a%=mo; 
}

void Mul(int &a, int b) {
	a*=b; a%=mo; 
}

struct Binary_tree {
	int cnt[N], i; 
	void clear() {
		for(i=0; i<=n; ++i) cnt[i]=0; 
	}
	void add(int x, int y) {
//		printf("> %d\n", x); 
		while(x<=n) Add(cnt[x], y), x+=x&-x; 
	}
	int que(int x) {
//				printf("> %d\n", x); 

		int ans=0; 
		while(x) Add(ans, cnt[x]), x-=x&-x; 
		return ans; 
	}
}Bin, Bin1, Bin2;

int suan() {
	int i, ans=0; 
	Bin.clear(); 
	for(i=1; i<=n; ++i) {
		Add(ans, Bin.que(a[i])*(n-i+1)%mo*(n-a[i]+1)%mo);  
		Bin.add(a[i], a[i]*i%mo); 
	}
	return ans; 
}

int calc2() {
	int ans=0; 
	ans+=suan(); 
	for(i=1; i<=n; ++i) a[i]=n-a[i]+1; 
	ans+=suan(); ans%=mo; 
	return ans; 
}

int suan31() {
	int ans=0, i; 
	Bin1.clear(); Bin2.clear(); 
	for(i=1; i<=n; ++i) Bin2.add(a[i], (n-i+1)*(n-a[i]+1)%mo); 
	for(i=1; i<=n; ++i) {
		Bin2.add(a[i], -(n-i+1)*(n-a[i]+1)%mo); 
		Add(ans, Bin1.que(a[i])*(Bin2.que(n)-Bin2.que(a[i]))); 
//		printf("%lld : %lld\n", i, ans); 
		Bin1.add(a[i], i*a[i]%mo); 
	}
	return ans; 
}

struct Segment_tree {
	int tot, ls[N<<2], rs[N<<2]; 
	int s[N<<2], c[N<<2], tag[N<<2]; 
	void clear(int &k, int l, int r) {
		if(!k) k=++tot, s[k]=c[k]=tag[k]=ls[k]=rs[k]=0; 
		if(l==r) return ; 
		int mid=(l+r)>>1; 
		clear(ls[k], l, mid); clear(rs[k], mid+1, r); 
	}
	void push_down(int k) {
		Add(tag[ls[k]], tag[k]); Add(tag[rs[k]], tag[k]); 
		Add(s[ls[k]], c[ls[k]]*tag[k]%mo); 
		Add(s[rs[k]], c[rs[k]]*tag[k]%mo); 
		tag[k]=0; 
	}
	void push_up(int k) {
		s[k]=(s[ls[k]]+s[rs[k]])%mo; 
		c[k]=(c[ls[k]]+c[rs[k]])%mo; 
	}
	void add(int k, int l, int r, int x, int y) {
//		printf("Add : %lld %lld\n", x, y); 
		if(l==r) {
			Add(c[k], y);
//			printf("Then c[%lld] become %lld\n", k, c[k]); 

			return  void(); 
		}
//		printf("s[%lld]=%lld [%lld %lld]\n", k, s[k], x, y); 

		push_down(k); 
//		printf("s[%lld]=%lld [%lld %lld]\n", k, s[k], x, y); 

		int mid=(l+r)>>1; 
		if(x<=mid) add(ls[k], l, mid, x, y); 
		else add(rs[k], mid+1, r, x, y);
//		printf("s[%lld]=%lld [%lld %lld]\n", k, s[k], x, y); 
 
		push_up(k); 
//		printf("s[%lld]=%lld [%lld %lld]\n", k, s[k], x, y); 
//		printf("Then c[%lld] become %lld\n", k, c[k]); 
	}
	void modify(int k, int l, int r, int x, int y, int z) {
		if(l>=x && r<=y) {
			Add(s[k], c[k]*z%mo), Add(tag[k], z); 
//			printf("==== [%lld] %lld %lld\n", k, s[k], c[k]); 
//			return Add(s[k], c[k]*z%mo), Add(tag[k], z), void();
			return ;  
		}
			
		int mid=(l+r)>>1; push_down(k);  
		if(x<=mid) modify(ls[k], l, mid, x, y, z); 
		if(y>=mid+1) modify(rs[k], mid+1, r, x, y, z); 
		push_up(k); 
//		printf(">>> s[%lld]=%lld [%lld %lld]\n", k, s[k], x, y); 

//		printf("")
	}
	int que(int k, int l, int r, int x, int y) {
		if(l>=x && r<=y) return s[k]; 
		int mid=(l+r)>>1, sum=0; push_down(k); 
		if(x<=mid) sum+=que(ls[k], l, mid, x, y); 
		if(y>=mid+1) sum+=que(rs[k], mid+1, r, x, y); 
		return sum%mo; 
	}
}Seg;

int suan32() {
	int ans=0, i; 
//	for(i=1; i<=n; ++i) printf("%lld ", a[i]); printf(" => "); 
	Bin1.clear(); Bin2.clear(); 
//	for(i=1; i<=n; ++i) {
//		Add(ans, (n-i+1)*Bin2.que(a[i])%mo); 
//		printf("%lld : %lld %lld\n", (n-i+1)*Bin2.que(a[i]), a[i]*(Bin1.que(n)-Bin1.que(a[i]))); 
//		Bin2.add(a[i], a[i]*(Bin1.que(n)-Bin1.que(a[i]))%mo); 
//		Bin1.add(a[i], i*(n-a[i]+1)%mo); 
//	}
	for(i=1; i<=n; ++i) b[i].x=a[i], b[i].id=i; 
	sort(b+1, b+n+1, [] (Node x, Node y) { return x.x>y.x; }); 
	rt=Seg.tot=0; Seg.clear(rt, 1, n); 
	for(i=1; i<=n; ++i) {
		Add(ans, b[i].x*(n-b[i].id+1)%mo*Seg.que(1, 1, n, 1, b[i].id)%mo); 
//		printf("%lld[%lld %lld] : %lld %lld %lld\n", i, 
//			b[i].id, b[i].x, b[i].x*(n-b[i].id+1), Seg.que(1, 1, n, 1, b[i].id), 
//					b[i].x*(n-b[i].id+1)%mo*Seg.que(1, 1, n, 1, b[i].id)%mo); 
		Seg.modify(1, 1, n, b[i].id, n, b[i].id); 
		Seg.add(1, 1, n, b[i].id, n-b[i].x+1); 
	}
//	printf("%lld\n", ans); 
	return ans; 
}

int calc3() {
	int ans=0, i; 
	memcpy(a, p, sizeof(a)); 
	Add(ans, suan31()); 
	for(i=1; i<=n; ++i) a[i]=n-a[i]+1; 
	Add(ans, suan31()); 
//	printf("%lld (%lld)\n", ans, ans*6); 
	memcpy(a, p, sizeof(a)); 
	Add(ans, suan32()); 
	reverse(a+1, a+n+1); 
	Add(ans, suan32()); 
	for(i=1; i<=n; ++i) a[i]=n-a[i]+1; 
	Add(ans, suan32()); 
	reverse(a+1, a+n+1); 
	Add(ans, suan32()); 
//	printf("%lld (%lld)\n", ans, ans*6); 
	return ans; 
//	return 0; 
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
		freopen("points.in", "r", stdin);
	freopen("points.out", "w", stdout);
//	T=read();
//	while(T--) {
//
//	}	
	n=read(); mx=read(); 
	for(i=1; i<=n; ++i) p[i]=a[i]=read(); 
	ans1=calc1(); ans2=calc2(); ans3=calc3(); 
//	printf("Basic : %lld\n", ans1+ans2*6); 
	if(mx==1) return printf("%lld ", ans1), 0; 
	if(mx==2) return printf("%lld ", (ans1+2*ans2)%mo), 0; 
	if(mx==3) return printf("%lld ", (ans1+6*ans2+6*ans3)%mo), 0; 
	return 0;
}

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

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

相关文章

Go Gin Gorm Casbin权限管理实现 - 2. 使用Gorm存储Casbin权限配置以及`增删改查`

文章目录 0. 背景1. 准备工作2. 权限配置以及增删改查2.1 策略和组使用规范2.2 用户以及组关系的增删改查2.2.1 获取所有用户以及关联的角色2.2.2 角色组中添加用户2.2.3 角色组中删除用户 2.3 角色组权限的增删改查2.3.1 获取所有角色组权限2.3.2 创建角色组权限2.3.3 修改角色…

uni-app 经验分享,从入门到离职(实战篇)——模拟从后台获取图片路径数据后授权相册以及保存图片

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;需求描述&#x1f3af;前置知识点&#x1f9e9;uni.showLoading()&#x1f9e9;uni.authorize()&#x1f9e9;uni.downloadFile()&#x1f9e9;uni.saveImageToPhotosAlbum() &#x1f3af;演示代码&#x1f9e9;关于图片接…

不能一棍子敲死刚诞生不久的USB-C,虽然它有时确实很惹人厌

今年iPhone机型最大的预期之一是从苹果专有的Lightning端口过渡到USB-C标准。一些人担心过渡需要他们更换所有配件&#xff0c;而另一些人&#xff08;包括你&#xff09;则期待着未来能够为iPad、MacBook和iPhone使用一根电缆。 然而&#xff0c;现在新机型已经问世&#xff…

微信小程序使用路由传参和传对象的方法

近期在做微信小程序开发&#xff0c;在页面跳转时&#xff0c;需要携带参数到下一个页面&#xff0c;尤其是将对象传入页面。为了方便重温&#xff0c;特此记录。 路由传字符串参数 原始页面 传递字符串参数比较简单。路由跳转有两种方式&#xff0c;一种是通过navigator组件…

【AI视野·今日CV 计算机视觉论文速览 第262期】Fri, 6 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 6 Oct 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Improved Baselines with Visual Instruction Tuning Authors Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee大型多模…

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…

雷达天线、信号链路、大气衰减基本概念

一、 有效各向同性辐射功率 有效各向同性辐射功率是各向同性天线必须辐射的假设功率,以在天线最强波束的方向上提供与实际源天线相同(等效)的信号强度。 二、电磁波传播 图1 从发射机到接收机的链路路径 信号与环境传播模型远离地面的高频和/或链路路径和/或窄天线Line of …

基础算法之——【动态规划之路径问题】1

今天更新动态规划路径问题1&#xff0c;后续会继续更新其他有关动态规划的问题&#xff01;动态规划的路径问题&#xff0c;顾名思义&#xff0c;就是和路径相关的问题。当然&#xff0c;我们是从最简单的找路径开始&#xff01; 动态规划的使用方法&#xff1a; 1.确定状态并…

《视觉 SLAM 十四讲》V2 第 6 讲 非线性优化 【高斯牛顿法、列文伯格-马夸尔特方法 、Ceres 库 和 g2o库 】

文章目录 6.1.2 最小二乘 寻找下降增量 Δ x k \Delta\bm{x}_k Δxk​的 4 种方法6.2.1 一阶和二阶梯度法(最速下降法、牛顿法)6.2.2 高斯牛顿法6.2.3 列文伯格-马夸尔特方法 【阻尼牛顿法】【信赖区域法】 6.3 实践6.3.1 手写高斯牛顿法 【Code】6.3.2 谷歌的优化库 Ceres 【最…

自动驾驶学习笔记(一)——Apollo平台

#Apollo开发者社区# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Apollo框架 开发平台 总结 前…

【TMS320F28374之PWM】

简介 增强型脉宽调制器(ePWM)外设是控制商业和工业设备中许多电力电子系统的关键元件。这些系统包括数字电机控制、开关模式电源控制、不间断电源(UPS)和其他形式的电源转换。ePWM外设还可以执行数模转换(DAC)功能&#xff0c;其中占空比相当于DAC模拟值;它有时被称为电源DAC。…

[机缘参悟-109] :接纳生活中的无完美是一种修行,过度追求完美是一种“我执”,接纳污秽、肮脏、邪恶、小人是一种高度

目录 前言&#xff1a; 一、天地以万物为刍狗&#xff0c;站在大自然的视角没有善恶 1.1 天地以万物为刍狗&#xff0c;在自然面前&#xff0c;一切生命都平等 1.2 食物链是一个闭环系统&#xff0c;无所谓善恶 1.3 在大自然中&#xff0c;人类眼中的“美丽”都诞生于“污…

Python(八十八)函数的参数传递

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

C++设计模式-单件(Singleton)

目录 C设计模式-单件&#xff08;Singleton&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-单件&#xff08;Singleton&#xff09; 一、意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 二、适用性 当类只能有一…

RK3588开发笔记(一):基于方案商提供的宿主机交叉编译Qt5.12.10

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133618273 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

最强中间件!Kafka快速入门(Kafka理论+SpringBoot集成Kafka实践)

自媒体文章上下架 需求分析 媒体端下架文章同时app端也下架文章的实现可以通过feign去调用&#xff0c;但这种实现耦合度太高&#xff0c;这里使用MQ进行解耦 自媒体端一旦上下架文章就发送消息给MQ&#xff0c;文章微服务在去读取消息根据消息内容上下架文章 MQ还可以流量削…

SSM - Springboot - MyBatis-Plus 全栈体系(二十二)

第四章 SpringMVC 五、SpringMVC 其他扩展 1. 全局异常处理机制 1.1 异常处理两种方式 开发过程中是不可避免地会出现各种异常情况的&#xff0c;例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题&#xff0c;甚至直接导致程序崩溃。…

嵌入式学习笔记(47)Nand的常见操作及流程分析

9.3.1坏块检查 (1)Flash使用之前一定要先统一擦除&#xff08;擦除的单元是块&#xff09;。Flash类设备擦除后里边全是1&#xff0c;所以擦干净之后读出来的值是0xFF (2)检查坏块的思路就是&#xff1a;先擦除&#xff0c;然后将整个块读出来&#xff0c;依次检测各字节是否…

【Java项目推荐之黑马头条】CSDN中的定时发布知道吧,你项目中的定时发布是如何实现的?

延迟队列精准发布文章 文章定时发布 延迟任务概述 什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发另一个事…

起号1个月后,我分析了一些AI数字人项目的红利期和优缺点

本期是赤辰第33期AI项目教程&#xff0c;底部准备了9月粉丝福利&#xff0c;可以免费领取。hi&#xff0c;同学们&#xff0c;AI的应用在各场景都已经呈井喷态势&#xff0c;好比就连近期的杭州亚运会开幕式都采用了数字人火炬手&#xff0c;AI技术的发展不断刷新着我们的脑洞上…