2023NOIP A层联测6 数点

题目大意

给你一个排列 p p p,对于每一个 i i i,我们在平面上,放置一个点 ( i , p i ) (i,p_i) (i,pi)。对于坐标上下限都在 1 ∼ n 1\sim n 1n内的全体 ( n ( n + 1 ) 2 ) 2 (\frac{n(n+1)}{2})^2 (2n(n+1))2矩形,求每个矩形内部点数的 k k k次方之和。

形式化地,请你计算

∑ 1 ≤ l ≤ r ≤ n ∑ 1 ≤ d ≤ u ≤ n ∣ { i ∣ l ≤ i ≤ r ∨ d ≤ p i ≤ u } ∣ \sum\limits_{1\leq l\leq r\leq n}\sum\limits_{1\leq d\leq u\leq n}|\{i|l\leq i\leq r\vee d\leq p_i\leq u\}| 1lrn1dun{ilirdpiu}

1 ≤ n ≤ 1 0 5 , 1 ≤ k ≤ 3 1\leq n\leq 10^5,1\leq k\leq 3 1n105,1k3


题解

我们可以考虑拆贡献,点数的 k k k次方可以看成选 k k k个点的方案的线性组合。

什么意思呢?就是在这 n n n个点中有序地可重地选择 k k k个点,将所有包含这 k k k个点的矩形的贡献 + 1 +1 +1,注意所有从 n n n个点中有序地可重地选 k k k个点的方案都要被计算贡献。

为什么可以这样呢?对于每个矩形,设这个矩形内的点数为 t t t,在这个矩形中有序地可重地选 k k k个点的方案数为 t k t^k tk,也就是说这个矩形在上面计算贡献的时候将贡献加了 t k t^k tk次一。

下面,我们来求 k k k为不同的值时的答案。

k = 1 k=1 k=1

对每个点 ( x , p x ) (x,p_x) (x,px),答案的贡献增加 x × ( n − x + 1 ) × p x × ( n − p x + 1 ) x\times (n-x+1)\times p_x\times (n-p_x+1) x×(nx+1)×px×(npx+1)

k = 2 k=2 k=2

我们考虑选的两个点相同的情况和两个点不同的情况。

对于两个点相同的情况,这其实就是 k = 1 k=1 k=1的情况,每种情况会被算一次。

对于两个点不同的情况,我们可以分为顺序对和逆序对来考虑:

  • 对于顺序对 x < y , p x < p y x<y,p_x<p_y x<y,px<py,其贡献为 x × p x × ( n − y + 1 ) × ( n − p y + 1 ) x\times p_x\times (n-y+1)\times (n-p_y+1) x×px×(ny+1)×(npy+1),将 x × p x x\times p_x x×px存入树状数组中,再用 ( n − y + 1 ) × ( n − p y + 1 ) (n-y+1)\times (n-p_y+1) (ny+1)×(npy+1)来乘即可
  • 对于逆序对 x < y , p x > p y x<y,p_x>p_y x<y,px>py将排列翻转之后按顺序对的方法来做即可

因为选点是有序的,每种顺序对和逆序对都用两种选法被选到,所以两个点不同的情况的贡献要乘 2 2 2

k = 3 k=3 k=3

k = 1 k=1 k=1的贡献计算一次(三次选择同一个点), k = 2 k=2 k=2的贡献计算两次(三次选择两个不同的点),下面再考虑三次选择三个不同的点的贡献。

分为两种本质不同的情况:

情况1
------
|*   |
| *  |
|  * |
------

这种情况出现了 2 2 2次(按 i i i左右翻转,总共有 2 2 2次),用两个树状数组维护即可。

情况2
------
|  * |
|*   |
| *  |
------

这种情况总共出现了 4 4 4次(按 i i i左右翻转,按 p i p_i pi上下翻转,四个角度各一次,总共有 4 4 4次),用线段树来维护即可。可以在加入第一个点时直接在对应位置上加数,在加入第二个点时将其后缀乘上对应的数,再加入第三个点时查询前缀和。

因为选点是有序的,每种顺序对和逆序对都用六种选法被选到,所以两个点不同的情况的贡献要乘 6 6 6

时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

code

#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const long long mod=998244353;
int n,K,p[100005];
long long tr1[100005],tr2[100005];
long long s[500005],hv[500005],ly[500005];
int lb(int i){return i&(-i);
}
void pt1(int i,long long v){while(i<=n){tr1[i]=(tr1[i]+v)%mod;i+=lb(i);}
}
long long find1(int i){long long re=0;while(i){re=(re+tr1[i])%mod;i-=lb(i);}return re;
}
void pt2(int i,long long v){while(i<=n){tr2[i]=(tr2[i]+v)%mod;i+=lb(i);}
}
long long find2(int i){long long re=0;while(i){re=(re+tr2[i])%mod;i-=lb(i);}return re;
}
void build(int k,int l,int r){s[k]=hv[k]=ly[k]=0;if(l==r) return;int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);
}
void down(int k){s[lc]=(s[lc]+hv[lc]*ly[k])%mod;s[rc]=(s[rc]+hv[rc]*ly[k])%mod;ly[lc]=(ly[lc]+ly[k])%mod;ly[rc]=(ly[rc]+ly[k])%mod;ly[k]=0;
}
void ch(int k,int l,int r,int x,long long y){if(l==r&&l==x){hv[k]=y;s[k]=ly[k]=0;return;}if(ly[k]) down(k);int mid=l+r>>1;if(x<=mid) ch(lc,l,mid,x,y);else ch(rc,mid+1,r,x,y);hv[k]=(hv[lc]+hv[rc])%mod;s[k]=(s[lc]+s[rc])%mod;
}
void ts(int k,int l,int r,int x,int y,long long v){if(l>=x&&r<=y){ly[k]=(ly[k]+v)%mod;s[k]=(s[k]+v*hv[k])%mod;return;}if(ly[k]) down(k);int mid=l+r>>1;if(x<=mid) ts(lc,l,mid,x,y,v);if(y>mid) ts(rc,mid+1,r,x,y,v);s[k]=(s[lc]+s[rc])%mod;
}
long long find(int k,int l,int r,int x,int y){if(l>=x&&r<=y) return s[k];if(ly[k]) down(k);int mid=l+r>>1;long long re=0;if(x<=mid) re=(re+find(lc,l,mid,x,y))%mod;if(y>mid) re=(re+find(rc,mid+1,r,x,y))%mod;return re;
}
long long gt(){long long re=0;build(1,1,n);for(int i=1;i<=n;i++){re=(re+find(1,1,n,1,p[i])*(n-i+1)%mod*(n-p[i]+1)%mod)%mod;ts(1,1,n,p[i],n,p[i]);ch(1,1,n,p[i],i);}return re;
}
long long gt1(){long long re=0;for(int i=1;i<=n;i++){re=(re+1ll*i*(n-i+1)%mod*p[i]%mod*(n-p[i]+1)%mod)%mod;}return re;
}
long long gt2(){long long re=0;for(int i=1;i<=n;i++){re=(re+find1(p[i])*(n-i+1)%mod*(n-p[i]+1)%mod)%mod;pt1(p[i],1ll*i*p[i]%mod);}for(int i=1;i<=n;i++){tr1[i]=0;if(i<n-i+1) swap(p[i],p[n-i+1]);}for(int i=1;i<=n;i++){re=(re+find1(p[i])*(n-i+1)%mod*(n-p[i]+1)%mod)%mod;pt1(p[i],1ll*i*p[i]%mod);}for(int i=1;i<=n;i++){tr1[i]=0;if(i<n-i+1) swap(p[i],p[n-i+1]);}return re;
}
long long gt3(){long long re=0;for(int i=1;i<=n;i++){long long now=find1(p[i]);pt1(p[i],1ll*i*p[i]%mod);re=(re+find2(p[i])*(n-i+1)%mod*(n-p[i]+1)%mod)%mod;pt2(p[i],now);}for(int i=1;i<=n;i++){tr1[i]=tr2[i]=0;if(i<n-i+1) swap(p[i],p[n-i+1]);}for(int i=1;i<=n;i++){long long now=find1(p[i]);pt1(p[i],1ll*i*p[i]%mod);re=(re+find2(p[i])*(n-i+1)%mod*(n-p[i]+1)%mod)%mod;pt2(p[i],now);}for(int i=1;i<=n;i++){tr1[i]=tr2[i]=0;if(i<n-i+1) swap(p[i],p[n-i+1]);}re=(re+gt())%mod;for(int i=1;i<=n;i++)if(i<n-i+1) swap(p[i],p[n-i+1]);re=(re+gt())%mod;for(int i=1;i<=n;i++)p[i]=n-p[i]+1;re=(re+gt())%mod;for(int i=1;i<=n;i++)if(i<n-i+1) swap(p[i],p[n-i+1]);re=(re+gt())%mod;return re;
}
int main()
{freopen("points.in","r",stdin);freopen("points.out","w",stdout);scanf("%d%d",&n,&K);for(int i=1;i<=n;i++){scanf("%d",&p[i]);}if(K==1) printf("%lld",gt1());else if(K==2)  printf("%lld",(gt1()+2*gt2())%mod);else{printf("%lld",(gt1()+6*gt2()+6*gt3())%mod);}return 0;
}

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

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

相关文章

什么是云计算?云计算简介

其实“云计算”作为一个名词而言&#xff0c;那是相当成功滴。很多人都有听过。但提及云计算”具体是什么?很多人&#xff0c;知其然&#xff0c;却不知其所以然! 利用软件将这些成千上万不可靠的硬件组织成一个稳定可靠的IT系统&#xff0c;以此支撑其公司的IT基础服务。这家…

基于SpringBoot的靓车汽车销售网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 车辆展示管理 车辆品牌管理 用户交流管理 购物车 用户交流 我的订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的…

在PHP中,可以使用不同的加密算法(如MD5、SHA1、SHA256)结合RSA算法进行公钥加密和私钥解密。

下面是使用这三种算法进行加密和解密的示例代码&#xff1a; // 生成RSA密钥对 $keyPair openssl_pkey_new(array(private_key_bits > 2048,private_key_type > OPENSSL_KEYTYPE_RSA, ));// 获取私钥和公钥 openssl_pkey_export($keyPair, $privateKey); $publicKey o…

java拆分pdf

pom文件 <dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>主文件 import java.io.FileOutputStream;import com.lowagie.text.Document; import com.lowagie…

【初试396分】西北工业大学827学长经验分享

这个系列会邀请往届学长学姐进行经验分享~欢迎后台回复经验分享&#xff0c;进行投稿&#xff01; 经验贴征集&#xff1a;前人栽树&#xff0c;后人乘凉&#xff0c;上岸同学也是看着经验贴一点一点过来的&#xff0c;有偿征集各位同学的经验分享&#xff0c;以此来帮助更多的…

vite vue3 pwa 更新提醒

效果 vite-plugin-pwa插件启用pwa后默认会在后台自动更新应用&#xff0c;并在关闭所有已开启的页面并重新打开后激活 通过此方法可以以消息方式提醒用户手动刷新激活更新应用 方法 已经使用vite-plugin-pwa插件启用pwa 修改vite.config.ts export default defineConfig(…

论文阅读——Large Selective Kernel Network for Remote Sensing Object Detection

目录 基本信息标题目前存在的问题改进网络结构另一个写的好的参考 基本信息 期刊CVPR年份2023论文地址https://arxiv.org/pdf/2303.09030.pdf代码地址https://github.com/zcablii/LSKNet 标题 遥感目标检测的大选择核网络 目前存在的问题 相对较少的工作考虑到强大的先验知…

python自动解析301、302重定向链接

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 使用模块requ…

8 个 Promise 高级用法

在 js 项目中&#xff0c;promise 的使用应该是必不可少的&#xff0c;但我发现在同事和面试者中&#xff0c;很多中级或以上的前端都还停留在promiseInst.then()、promiseInst.catch()、Promise.all等常规用法&#xff0c;连async/await也只是知其然&#xff0c;而不知其所以然…

Rockchip平台 远程OTA服务搭建

Rockchip平台 远程OTA服务搭建 1. 概述 远程OTA升级服务是一种通过互联网远程更新Rockchip设备的固件和软件的方法。这种服务对于确保设备安全性、修复错误和添加新功能非常重要。 本文档将引导您完成在Rockchip平台上搭建远程OTA升级服务的过程。 在阅读本文的前&#xff…

python常用stl

列表 list lst = [] lst.append(6) lst.insert(index, value) lst.pop(index)lst.sort() lst.reverse() lst.extend(another_list) 注意 列表也可以像数组一样x[i], 但前提是列表非空(初始化过),否则会报错 17. 电话号码的字母组合 - 力扣(LeetCode) 字典 phoneMap= …

Vue3新的状态管理库-Pinia(保姆级别教程)

目录 1.什么是Pinia2.为什么使用Pinia3.创建项目4.检查Pinia的安装版本5.main.js引入Pinia6.定义Store-组合式API写法(推荐)7.getters的实现8.action的异步实现9.storeToRefs 1.什么是Pinia Pinia是Vue的专属的最新状态管理库, 是Vuex状态管理工具的替代品 vue.js官网 https:…

面试之并查集

输入和输出的注意点:scanf读取字符时会读取空格和回车 而scanf读字符串时会自动忽略空格和回车 并查集快速处理两类操作: 将2个集合合并询问两个元素是否在一个集合当中 几乎O(1)完成这两个操作 基本原理 每个集合用一棵树来表示,树根的编号就是整个集合的编号, 每个节点存储…

L14D6内核模块编译方法

一、内核模块基础代码解析 一个内核模块代码错误仍然会导致的内核崩溃。 GPL协议&#xff1a;开源规定&#xff0c;使用内核一些函数需要 1、单内核的缺点 单内核扩展性差的缺点减小内核镜像文件体积&#xff0c;一定程度上节省内存资源提高开发效率不能彻底解决稳定性低的缺…

【新品发布】四核A53超高性价比!RK3562系列核心板及开发板震撼上市

RK3562系列产品采用 Rockchip 新一代 64 位处理器 RK3562&#xff08;Quad-core ARM Cortex-A53&#xff0c;主频最高 2.0GHz&#xff09;&#xff0c;最大支持 8GB 内存&#xff1b;内置独立的 NPU&#xff0c;可用于轻量级人工智能应用&#xff0c;RK3562 拥有 PCIE2.1 / USB…

图文验证码怎么测试及自动化测试怎么解决验证码问题?

前言 在对安全性有要求的软件&#xff08;系统&#xff09;中都存在验证码&#xff0c;那我们应该怎么进行测试呢&#xff0c;在自动化测试中又该怎么通过验证码使自动化顺利进行下去呢&#xff1f; 首先&#xff0c;来简单认识下验证码 测试验证码&#xff0c;首先我们应当…

Redis客户端通信RESP协议

ESP是Redis序列化协议&#xff0c;Redis客户端RESP协议与Redis服务器通信。 RESP协议在Redis 1.2中引入&#xff0c;但在Redis 2.0中成为与Redis服务器通信的标准方式。这个通信方式就是Redis客户端实现的协议。 RESP实际上是一个序列化协议&#xff0c;它支持以下数据类型&a…

提升职场竞争力,掌握高级开发面试知识!

Java后端开发技能&#xff1a; JVM&#xff1a;内存模型、类加载机制、双亲委派、垃圾回收算法、垃圾回收器、空间分配担保策略、可达性分析、强软弱虚引用、GC的过程、三色标记、跨代引用、内存泄漏与溢出多线程&#xff1a;集合、Synchronized、ThreadLocal、AQS、线程池JVM…

Docker私有仓库打开2375端口(linux)

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker.service文件 vi /usr/lib/sys…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中&#xff0c;跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而&#xff0c;由于各国法律法规、文化差异以及运输环节的复杂性&#xff0c;企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题&#xff0c;一些专业的物流公司推出了“…