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

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

题目问 ∣ 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.xdnf.cn/news/150077.html

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

相关文章

Flow Chart 的中文意思是什么?请说出自然界中河流的三种流动方式。事件驱动是什么?

目录 Flow Chart 的中文意思是什么? 请说出自然界中河流的三种流动方式。 事件驱动是什么? 请介绍一下 亚特兰大这座城市 Flow Chart 的中文意思是什么? 流程图 请说出自然界中河流的三种流动方式。 自然界中的河流可以以多种不同的方式流动&#xff0c;以下是其中三…

在Linux中软链接和硬链接的区别是什么?

2023年10月6日&#xff0c;周五晚上 目录 软链接(SymbolicLink):硬链接(HardLink):区别: 软链接(SymbolicLink): 软链接本身只是一个指向其他文件或目录的指针,不占用任何磁盘空间。软链接的修改或删除不会影响原文件。软链接可以指向不同文件系统中的文件。 硬链接(HardLink…

c++运算符重载实现

#include <iostream> #include <cstring> using namespace std; class myString { private:char *str;int size; public://无参构造myString():size(10){str new char[size]; //构造出一个长度为10的字符串strcpy(str,""); //赋值为空串}//有…

微信小程序开发缺少中间证书问题(腾讯云、阿里云等做服务器)

项目使用nginx做负载均衡后&#xff0c;不再采用原来直接用jar包的方式直接开启对应端口&#xff0c;所以需要重新从云服务器上下载证书&#xff0c;写入到Nginx读取的证书路径上即可。

stm32之HAL库操作PAJ75620

一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输&#xff0c;本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势&#xff0c;包括 右&#xff1a;编码为 0x01左&#xff1a;编码为 0x0…

[GXYCTF2019]禁止套娃 无回显 RCE 过滤__FILE__ dirname等

扫除git 通过githack 获取index.php <?php include "flag.php"; echo "flag在哪里呢&#xff1f;<br>"; if(isset($_GET[exp])){if (!preg_match(/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i, $_GET[exp])) {if(; preg_replace(/[a-z,_]\(…

redis实战-实现用户签到UV统计

BitMap功能演示 我们针对签到功能完全可以通过mysql来完成&#xff0c;比如说以下这张表 用户一次签到&#xff0c;就是一条记录&#xff0c;假如有1000万用户&#xff0c;平均每人每年签到次数为10次&#xff0c;则这张表一年的数据量为 1亿条 每签到一次需要使用&#xff08…

支付环境安全漏洞介绍

1、平台支付逻辑全流程分析 2、平台支付漏洞如何利用&#xff1f;买东西还送钱&#xff1f; 3、BURP抓包分析修改支付金额&#xff0c;伪造交易状态&#xff1f; 4、修改购物车参数实现底价购买商品 5、SRC、CTF、HW项目月入10W副业之路 6、如何构建最适合自己的网安学习路线 1…

ArcGIS Engine:鹰眼图的拓展功能-点击和矩形+坐标状态栏

目录 01 前言 02 鹰眼图的控制功能 03 显示当前鼠标的地理坐标 01 前言 说是拓展&#xff0c;不过是忘记了实验还有附加实验.这里补上. 前文不再赘述,上一节查看&#xff1a;ArcGIS Engine&#xff1a;视图菜单的创建和鹰眼图的实现_炒茄子的博客-CSDN博客 这里加上三个功能…

elementui修改message消息提示颜色

/* el弹出框样式 */ .el-message {top: 80px !important;border: 0; }.el-message * {color: var(--white) !important;font-weight: 600; }.el-message--success {background: var(--themeBackground); }.el-message--warning {background: var(--gradientBG); }.el-message--…

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

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

【16】c++设计模式——>建造者(生成器)模式

什么是建造者模式? 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象&#xff0c;且对象的创建与表示是分离的。这样&#xff0c;同样的构建过程可以创建不同的表…

黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)

参考文章1&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2&#xff1a;https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念&#xff08;数据库DataBase&#xff08;DB&#xff09;、数据库管理系统DataBase Management Sy…

数据分析视角中的商业分析学习笔记

数据分析一大堆&#xff0c;结果却是大家早就知道的结论&#xff1f;是工具和方法出问题了吗&#xff1f;真正原因可能是你的思维有误区。 为什么分析的这么辛苦&#xff0c;得出的结论大家早知道&#xff0c;谁谁都不满意&#xff1f;核心原因有3个&#xff1a; 分析之前&am…

UGUI交互组件Toggle

一.Toggle对象的构造 Toggle和Button类似&#xff0c;是交互组件的一种 如果所示&#xff0c;通过菜单创建了两个Toggle&#xff0c;Toggle2中更换了背景和标记资源 对象说明Toggle含有Toggle组件的对象Background开关背景Checkmark开关选中标记Label名称文本 二.Toggle组件属…

总结三:计算机网络面经

文章目录 1、简述静态路由和动态路由&#xff1f;2、说说有哪些路由协议&#xff0c;都是如何更新的&#xff1f;3、简述域名解析过程&#xff0c;本机如何干预域名解析&#xff1f;4、简述 DNS 查询服务器的基本流程是什么&#xff1f;DNS 劫持是什么&#xff1f;5、简述网关的…

Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建

前言: apollo planning2.0 在新版本中在降低学习和二次开发成本上进行了一些重要的优化,重要的优化有接口优化、task插件化、配置参数改造等。 GNU symbolic debugger,简称「GDB 调试器」,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端…

VUE3照本宣科——package.json与vite.config.js

VUE3照本宣科——package.json与vite.config.js VUE3照本宣科系列导航 前言一、package.json1.name2.version3.private4.scripts5.dependencies6.devDependencies 二、vite.config.js1.plugins2.resolve.alias3.base4.mode 三、VUE3照本宣科系列总结 VUE3照本宣科系列导航 1.VU…

ZRTP交叉编译与移植

1 ZRTP源码下载 这里采用的是libzrtp来自于freeswitch&#xff1a;libs/libzrtp。 2 ZRTP交叉编译 zrtp编译比较简单&#xff0c;采用configure进行编译在根目录心中zrtp编译脚本&#xff0c;只需要指定交叉编译工具链和安装地址即可。脚本如下所示&#xff1a; unset CC C…

三一充填泵:煤矿矸石无害化充填,煤炭绿色高效开采的破局利器

富煤贫油少气是我国的能源禀赋特征&#xff0c;决定了我国以煤炭为主的能源结构&#xff0c;煤炭为国民经济发展提供了重要的基础。煤炭开采过程会对土地、地下水、空气等环境造成较大的污染&#xff0c;但大宗固废煤矸石无害化充填的技术手段可以有效改善这样的情况&#xff0…