cf1553F. Pairwise Modulo

cf1553F. Pairwise Modulo

题意:

给你一个数组a,a由n个不同的数组成,让你求出对应的数组p
数组p的定义为:
pk=∑1≤i,j≤kaimodajp_{k}=\sum_{1\leq i,j\leq k}a_{i} \mod a_{j}pk=1i,jkaimodaj

题解:

官方题解
首先我们需要拜托mod操作,一个常用公式:
xmody=x−y∗⌊xy⌋x \mod y = x - y * \lfloor \frac{x}{y} \rfloorxmody=xyyx
直接求p比较麻烦,我们规定i,j一个先后顺序,我们将pkp_{k}pk分成sks_{k}sktkt_{k}tk两个部分
sk=∑1≤i,j≤k,i>jaimodajs_{k}=\sum_{1\leq i,j\leq k,i>j}a_{i} \mod a_{j}sk=1i,jk,i>jaimodaj
tk=∑1≤i,j≤k,i<jaimodajt_{k}=\sum_{1\leq i,j\leq k,i<j}a_{i} \mod a_{j}tk=1i,jk,i<jaimodaj
也就是sks_{k}sk求的是编号大的数mod编号小的数的和,tkt_{k}tk则正好相反。
怎么求sks_{k}sk?
sk=sk−1+∑i=1k−1akmodai=sk−1+∑i=1k−1(ak−ai∗⌊akai⌋)s_{k}=s_{k-1}+\sum_{i=1}^{k-1}a_{k} \mod a_{i}=s_{k-1}+\sum_{i=1}^{k-1}(a_{k}-a_{i}*\lfloor\frac{a_{k}}{a_{i}} \rfloor)sk=sk1+i=1k1akmodai=sk1+i=1k1(akaiaiak)
我们将aka_{k}ak提出来会得到:
sk=sk−1+ak∗(k−1)−∑i=1k−1(ai∗⌊akai⌋)s_{k}=s_{k-1}+a_{k}*(k-1)-\sum_{i=1}^{k-1}(a_{i}*\lfloor \frac{a_{k}}{a_{i}} \rfloor)sk=sk1+ak(k1)i=1k1(aiaiak)
现在问题就是∑i=1k−1(ai∗⌊akai⌋)\sum_{i=1}^{k-1}(a_{i}*\lfloor \frac{a_{k}}{a_{i}} \rfloor)i=1k1(aiaiak)咋求
我们现在开始确定aia_{i}ai,然后看其对所有sks_{k}sk,k>i的贡献

  1. 对于所有的aka_{k}ak[ai,2∗ai)[a_{i},2*a_{i})[ai,2ai)贡献是−ai-a_{i}ai
  2. 对于所有的aka_{k}ak[2∗ai,3∗ai)[2*a_{i},3*a_{i})[2ai,3ai)贡献是−2∗ai-2*a_{i}2ai
  3. 对于所有的aka_{k}ak[d∗ai,(d+1)∗ai)[d*a_{i},(d+1)*a_{i})[dai,(d+1)ai)贡献是−d∗ai-d*a_{i}dai

这意味着可以强制所有合法的d并执行类似这样的更新:将x添加到范围[l,r]中的所有数字。这可以用线段树或树状数组
tkt_{k}tk的求法也超不多,但是有区别
在这里插入图片描述

时间复杂度:
M最大是3e5,每一次加一数进去会进行Mai\frac{M}{a_{i}}aiM次修改,而aia_{i}ai各不相同,所以M1+...+Mn=O(logn)\frac{M}{1}+...+\frac{M}{n}=O(logn)1M+...+nM=O(logn)
所以有O(M logn)更新操作,每次更新是O(log M),总复杂度为O(M log M log n)
代码中我维护了两个树状数组A和B

代码:

// Problem: F. Pairwise Modulo
// Contest: Codeforces - Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
// URL: https://codeforces.com/contest/1553/problem/F
// Memory Limit: 256 MB
// Time Limit: 4000 ms
// Data:2021-08-10 16:23:05#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f;
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 3e5 + 9;
const int M= 3e5;
struct Fenw
{ll w[maxn];Fenw(){fill(w + 1, w + maxn, 0ll);}ll lowbit(ll x){return x & (-x);}void update(int pos, ll x){for (; pos <= M; pos+= lowbit(pos)) {w[pos]+= x;}}ll get(int pos){ll res= 0;for (; pos > 0; pos-= lowbit(pos)) {res+= w[pos];}return res;}ll get(int l, int r){return get(r) - get(l - 1);}
} A, B;
void solve()
{int n;cin >> n;//A维护的是ak对[k+1,n],B维护的是区间[1,k-1]对ak的贡献ll pre= 0, ans= 0;//debug("测试", 1);for (int i= 1; i <= n; i++) {int x;cin >> x;ans+= x * (i - 1ll); //加的skans-= A.get(x); //s_2ans+= pre; //加的tkpre+= x;//debug("测试", 1);for (int j= x; j <= M; j+= x) {int l= j, r= min(M, j + x - 1); //枚举每个区间ans-= B.get(l, r) * j; //t_2A.update(l, x);//在l位置上加x}B.update(x, 1);printf("%lld ", ans);}printf("\n");
}
int main()
{//rd_test();solve();return 0;//Time_test();
}

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

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

相关文章

[ZJOI2011]营救皮卡丘(费用流 + 最短路)

problem luogu-P4542 solution 刚开始就直观感觉 dpdpdp 不动&#xff0c;却有个看似“理所当然”的贪心&#xff1a;每次跑 kkk 个人所在点到扩展据点的最短距离&#xff0c;然后让最近的人去破环那个据点。 啪啪敲完后小样例&#xff08;实在太水&#xff09;就过了&…

Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)

Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 Div. 2) 题号题目知识点AGame of LifeBLord of the ValuesCCompression and ExpansionDLove-HateECrypto LightsFFavorite GameGTry BookingHHopping Around the Array

Abp框架准备加入.NET Foundation

Abp团队正准备尝试将Abp项目加入.NET Foundation!既然申请了,必然有很大的自信能够成功,请大家等待好消息!Abp中文网会第一时间跟进.点击阅读原文查看最新进展.

[ZJOI2011] 道馆之战(树链剖分)

problem luogu-P4679 理解清楚题意又是一个世纪的更迭了 给定一个树&#xff0c;每个节点位置上实际放了两个节点。 然后若干次修改和查询。... 能走&#xff0c;#\## 不能走。 询问 u→vu\rightarrow vu→v 的简单路径上最长能走的距离。&#xff08;是强制从 uuu 开始&a…

[NOI2008] 志愿者招募(线性规划-对偶问题-费用流)

problem luogu-P3980 solution 志愿者连续工作 [si,ti][s_i,t_i][si​,ti​] 天&#xff0c;我们可以提炼出网络流二十四题中《最长k可重区间集问题》的模型。 同样地&#xff0c;把 1∼n1\sim n1∼n 天抽象成一条 1∼n11\sim n11∼n1 个点的链条。 源点 s→1s\rightarrow…

互达的集合(线段树)

problem 给定数组 l,rl,rl,r。求有多少个非空集合 SSS&#xff0c;满足 ∀i,j∈Sli≤j≤ri\forall_{i,j\in S}\ l_i\le j\le r_i∀i,j∈S​ li​≤j≤ri​。 集合内对于任意一个点而言&#xff0c;其余点均能被自己的范围覆盖到。 n≤2e5n\le 2e5n≤2e5。 solution 分享一下…

【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)

线性规划与对偶问题 原问题&#xff1a; min⁡{7x1x25x3}s.t.{x1−x23x3≥105x12x2−x3≥6xi≥0\min\{7x_1x_25x_3\} \\ s.t.\begin{cases} x_1-x_23x_3\ge 10\\ 5x_12x_2-x_3\ge 6\\ x_i\ge 0\end{cases} min{7x1​x2​5x3​}s.t.⎩⎪⎨⎪⎧​x1​−x2​3x3​≥105x1​2x2​−…

【学习笔记】DAG / 一般有向图的支配树 / 灭绝树

定义与声明 一个有向图 GGG。给定一个起点 sss&#xff0c;假设 sss 能到达所有点。 若去掉某个点 iii 后&#xff0c;sss 无法到达 jjj&#xff0c;则称 iii 为 jjj 的支配点。 显然支配点存在传递关系。 以 sss 为根&#xff0c;使得对于任意节点 iii&#xff0c;其树上祖…

[ZJOI2014] 星系调查(树上差分 + 数学推式子)

problem luogu-P3340 题面写得那么长&#xff0c;其实说白了就是求一条直线&#xff0c;使得若干个点到这条直线的距离平方的和最小&#xff0c;求这个最小值。 solution 我超爱数学&#xff0c;数学就是我的命&#xff0c;我一天不学数学我就难受&#xff01; 假设拟合出…

[ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

problem luogu-P3342 solution 你感觉这道题没考什么&#xff0c;又感觉考了什么 通过样例以及题面&#xff0c;我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息。 也就是说&#xff0c;我们需要通过输入的每个小方块相邻的编号的信息来建出这个立方体的…

cf1523A. Game of Life

cf1523A. Game of Life 题意&#xff1a; 包含n个元素的数组&#xff0c;数值为1或0&#xff0c;如果一个元素为0&#xff0c;并且其周围正好只有一个为1的元素&#xff0c;那么下一刻本元素也会变成1. 给你一个数值&#xff0c;问你m次时刻后数组的状态 题解&#xff1a; …

SignalR 中丰富多彩的消息推送方式

在上一篇 SignalR 文章中&#xff0c;演示了如何通过 SignalR 实现了简单的聊天室功能&#xff1b;本着简洁就是美的原则&#xff0c;这一篇我们也来聊聊在 SignalR 中的用户和组的概念&#xff0c;理解这些基础知识有助于更好的开发基于 SignalR 的应用&#xff0c;通过对用户…

Visual Studio 2019 使用 Live Share

一.前言Visual Studio 2019 在今天发布&#xff08;北京时间&#xff09;了&#xff0c;这次带来了一个比较有趣的 Live Share 功能&#xff0c;使用它可以进行更好的协作开发。主要功能&#xff1a;更多资料可看官方介绍&#xff1a;Visual Studio 实时共享什么是Visual Studi…

cf1523B. Lord of the Values

cf1523B. Lord of the Values 题意&#xff1a; 给你一个数组&#xff0c;有n个数&#xff0c;n为偶数&#xff0c;a1&#xff0c;a2…an 现在有两个操作&#xff1a; 对于i<j 操作1&#xff1a;aiaiaj 操作2&#xff1a;ajaj-ai 把原数组转换为-a1,-a2,-a3… 题解&#…

Asp.Net Core WebAPI使用Swagger时API隐藏与分组

1、前言为什么我们要隐藏部分接口&#xff1f;因为我们在用swagger代替接口的时候&#xff0c;难免有些接口会直观的暴露出来&#xff0c;比如我们结合Consul一起使用的时候&#xff0c;会将健康检查接口以及报警通知接口暴露出来&#xff0c;这些接口有时候会出于方便考虑&…

cf1526E. Oolimry and Suffix Array(未解决)

E. Oolimry and Suffix Array 题意&#xff1a; 给定n&#xff0c;k和长度为n的后缀数组si(0<si<n-1),求长度为n的由k种字母构成的字符串种&#xff0c;后缀数组为si的有多少种 题解&#xff1a; 题解看懂了一半。。。等会了再更新 代码&#xff1a;

P2572 [SCOI2010]序列操作

P2572 [SCOI2010]序列操作 题意&#xff1a; 一个长度为n的01序列&#xff0c;下标从0开始&#xff0c;现在有五种变换操作和询问操作&#xff1a; 0 l r 把[l,r]区间内的所有数全变成01 l r 把[l,r]区间内的所有数全变成12 l r把[l,]区间内所有数全部取反3 l r询问[l,r]区间…

为您的机器配置开发环境

软件准备在本期视频中&#xff0c;我们将安装所序言的软件&#xff0c;并为我们的电脑配置.NET Core开发环境。我们需要安装如下2个软件&#xff1a;一个编辑器.NET Core SDK&#xff08;Software Development Kit&#xff09;下载并安装.NET Core 开发编辑器我的是Windows操作…

[CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

problem luogu-P3160 solution 这么小的数据范围&#xff0c;非暴力不状压。暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了。 我们不妨从小到大填数字&#xff0c;这样如果局部极小值点还没有填的话&#xff0c;周围的九宫格就一定不能被填。 设 dp(s,i):dp(s,i):dp(s,i): 局…

基于Kubernetes 构建.NET Core 的技术体系

很多公司技术支持岗位的工作&#xff0c;如配置域名&#xff0c;部署环境&#xff0c;修改复位配置&#xff0c;服务重启&#xff0c;扩容缩容&#xff0c;梳理和完善监控&#xff0c;根据开发的需要查找日志等工作&#xff0c;需要和开发进行大量的沟通&#xff0c;如什么是外…