首页 > 其他分享 >CF1553F. Pairwise Modulo

CF1553F. Pairwise Modulo

时间:2023-06-25 09:45:54浏览次数:35  
标签:right Modulo int ch ln CF1553F tag Pairwise left

终于过了,感觉还是有点东西的。

首先我们有一个很好想的 \(O(n(\ln A+\sqrt{A})\log n)\) 的做法。首先这个式子能写成 \(p_i=\sum\limits_{j=1}^i\sum\limits_{k=1}^i\left(a_j-a_k\left\lfloor\dfrac{a_j}{a_k}\right\rfloor\right)\) 的形式。前面求和那部分是简单的,我们主要去想怎么求 \(\sum\limits_{j=1}^i\sum\limits_{k=1}^i\left(a_k\left\lfloor\dfrac{a_j}{a_k}\right\rfloor\right)\)。思考这个在 \(p_{i-1}\) 转移到 \(p_i\) 时是怎么变化的:不难发现新增的贡献可以看成两部分:\(\sum\limits_{j=1}^{i-1}\left(a_i\left\lfloor\dfrac{a_j}{a_i}\right\rfloor\right)\) 和 \(\sum\limits_{j=1}^{i-1}\left(a_j\left\lfloor\dfrac{a_i}{a_j}\right\rfloor\right)\)。前面的可以枚举 \(\left\lfloor\dfrac{a_j}{a_i}\right\rfloor\) 的值,后面的可以整除分块,再加上一个 BIT 数数的 \(\log n\),总时间复杂度 \(O(n(\ln A+\sqrt{A})\log n)\)(\(\ln n\) 是因为 \(a_i\) 两两不同)。

显然,这玩意是过不了的(Time limit exceeded on test 7),思考怎么优化。发现都是整除分块 \(\sqrt{n}\) 的复杂度拖慢了我们的速度,如果我们能用类似求前面一部分的方法去解决后面一部分就可以做到 \(O(n\ln n\log n)\) 了。那么,能做到吗?

假设当前枚举到 \(a_j\),考虑它会让后面的 \(a_i\) 对它产生多少贡献。可以枚举 \(\left\lfloor\dfrac{a_i}{a_j}\right\rfloor=x\),那么当 \(a_i\) 在 \([x\cdot a_j,(x+1)\cdot a_j)\) 范围内时就会有 \(x\cdot a_j\) 的影响,这就是一个区间加单点求和,也是 BIT 的拿手好戏。总时间复杂度 \(O(n\ln n\log n)\)。

题外话:BIT 判边界好麻烦,我用的线段树。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18,SIZ=3e5;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct segtree{
	#define ls p<<1
	#define rs p<<1|1
	#define lson l,mid,ls
	#define rson mid+1,r,rs
	struct Node{
		int s,tag;
	}c[1210005];
	void pushup(int p){
		c[p].s=c[ls].s+c[rs].s;
	}
	void pushdown(int l,int r,int p){
		if(!c[p].tag)return;
		int siz=r-l+1,ln=siz-(siz>>1),rn=siz>>1;
		c[ls].tag+=c[p].tag,c[rs].tag+=c[p].tag;
		c[ls].s+=ln*c[p].tag,c[rs].s+=rn*c[p].tag;
		c[p].tag=0;  
	}
	void build(int l,int r,int p){
		c[p].tag=0;
		if(l==r){c[p].s=0;return;}
		int mid=(l+r)>>1;
		build(lson),build(rson);
		pushup(p);
	}
	void update(int l,int r,int p,int L,int R,int k){
		if(L>R)return;
		if(L<=l&&r<=R){c[p].s+=(r-l+1)*k,c[p].tag+=k;return;}
		int mid=(l+r)>>1;pushdown(l,r,p);
		if(L<=mid)update(lson,L,R,k);
		if(R>mid)update(rson,L,R,k);
		pushup(p);
	}
	int query(int l,int r,int p,int L,int R){
		if(L>R)return 0;
		if(L<=l&&r<=R)return c[p].s;
		int mid=(l+r)>>1,res=0;pushdown(l,r,p);
		if(L<=mid)res+=query(lson,L,R);
		if(R>mid)res+=query(rson,L,R);
		return res;
	}
	#undef ls
	#undef rs
	#undef lson
	#undef rson
}Tr1,Tr2;
int a[200005];
signed main(){
	int n=read();Tr1.build(0,SIZ,1),Tr2.build(0,SIZ,1);
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1,sum=0,res=0;i<=n;i++){
		res+=sum+a[i]*(i-1);res-=Tr2.query(0,SIZ,1,a[i],a[i]);
		for(int j=0;j*a[i]<=SIZ;j++)res-=Tr1.query(0,SIZ,1,j*a[i],min(SIZ,(j+1)*a[i]-1))*j*a[i];
		for(int j=0;j*a[i]<=SIZ;j++)Tr2.update(0,SIZ,1,j*a[i],min(SIZ,(j+1)*a[i]-1),j*a[i]);
		sum+=a[i];Tr1.update(0,SIZ,1,a[i],a[i],1);
		printf("%lld ",res);
	}
	return 0;
}

标签:right,Modulo,int,ch,ln,CF1553F,tag,Pairwise,left
From: https://www.cnblogs.com/xx019/p/17501745.html

相关文章

  • Add Modulo 10(数论,思维,数学,规律)
    思路:找规律情况一:尾数为5或0为5时进行一次操作变成0的情况。而尾数是 0 时操作无意义,所有数必须相等。情况二:尾数为 1,3,7,9可进行一次操作变成情况三。情况三:尾数为 2,4,6,8我们通过找规律发现:2⇒4⇒8⇒16⇒224⇒8⇒16⇒22⇒246⇒12⇒14⇒18⇒268⇒16⇒22⇒24⇒28......
  • AtCoder Regular Contest 134 E Modulo Nim
    洛谷传送门AtCoder传送门It'sallMAGIC这种题目一般先考虑局面要满足什么条件能必胜,然后根据这个性质来计数。如果把黑板上的数写成一个集合\(S\),那么:\(\varnothing\)为必胜态,\(\{1\},\{2\}\)显然为必败态,打表发现其他单元素集合都为必胜态;如果\(\existsx\inS,x......
  • 迁移学习(PAT)《Pairwise Adversarial Training for Unsupervised Class-imbalanced Dom
    论文信息论文标题:PairwiseAdversarialTrainingforUnsupervisedClass-imbalancedDomainAdaptation论文作者:WeiliShi,RonghangZhu,ShengLi论文来源:KDD2022论文地址:download 论文代码:download视屏讲解:click1摘要提出问题:类不平衡问题;解决方法:提出了一......
  • nn.PairwiseDistance
    nn.PairwiseDistance是PyTorch中的一个计算两个张量之间的距离(distance)的函数。它可以用于计算两个向量之间的欧氏距离、曼哈顿距离等。该函数的实现基于PyTorch的nn.Module模块,因此可以方便地集成到神经网络中,并且支持自动求导。以下是一个使用nn.PairwiseDistance计算两个向量之......
  • pairwise损失_triplet损失_提升精排模型的trick
    多标签importtorchimporttorch.nnasnnimporttorch.optimasoptimclassRankModel(nn.Module):def__init__(self,num_features):super(RankMode......
  • 「解题报告」ARC134E Modulo Nim
    真的不想写这题,感觉这种题出的很怪。但是今天模拟赛出了,所以我还是写一下吧。首先我们只关心当前所有数的集合,有多少我们不关心。设这个集合为\(S\)。观察样例,感觉可以......
  • 推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwis
    0.前言召回排序流程策略算法简介推荐可分为以下四个流程,分别是召回、粗排、精排以及重排:召回是源头,在某种意义上决定着整个推荐的天花板;粗排是初筛,一般不会上复杂模型......
  • [ABC232G] Modulo Shortest Path
    ProblemStatementWehaveadirectedgraphwith$N$vertices,calledVertex$1$,Vertex$2$,$\ldots$,Vertex$N$.Foreachpairofintegerssuchthat$1\leqi......
  • 题解 [AGC047C] Product Modulo
    显然不能暴力算两两的乘积,而积取模而结果不取模提示我们模数肯定有用。所有为\(0\)的\(a_i\)对答案不会产生任何贡献,可以直接删除,下文不再考虑这种情况。同时我们约定......
  • 「ARC134E」Modulo Nim
    题目点这里看题目。有一个长度为\(n\)的非负整数序列\(\{a_i\}_{i=1}^n\),Amily和Bonnie会在上面玩一个游戏。双方会轮流执行如下操作,且Amily先手:设\(M=\max......