首页 > 其他分享 >ABC306F 题解

ABC306F 题解

时间:2023-07-04 18:23:12浏览次数:49  
标签:ABC306F int 题解 sum 元素 tr long leq

题目链接

题目大意

对于 \(S_1 \cap S_2 = \emptyset\),

定义长度为 \(|S_1|+|S_2|\) 的序列 \(A\),为 \(S_1\cup S_2\) 排序后的结果。

定义二元函数 \(f(S_1,S_2)=\sum\limits_{1\leq i\leq |S_1|+|S_2|} i\times[A_i\in S_1]\) 。

给定 \(n\) 个大小为 \(m\) 的正整数集合 \(S\),求 \(\sum\limits_{1\leq i<j\leq n} f(S_i,S_j)\)

\(n\leq 1\times 10^4\)

\(m\leq 1\times 10^2\)

题目分析

注意到答案中要求 \(i<j\),

考虑对于计算每个集合中的每个数的对答案的贡献。

可以发现,元素 \(s\) 在 \(f(S_i,S_j)\) 的贡献就是 \(S_1\cup S_2\) 中小于 \(s\) 的数的个数+1。

所以对于共 \(n\times m\) 个元素,计算它们在每种合法的 \(f(S_i,S_j) (1\leq i<j\leq n)\) 的贡献即可。

具体来说,将所有元素从小到大排序并保存该元素属于第几个集合,从前到后依次扫描这些元素。

设第 \(i\) 个元素属于第 \(p\) 个集合,设前 \(i-1\) 个元素中属于集合 \(k\) 的元素个数有 \(cnt_k\)个,那么第 \(i\) 个元素对答案的贡献就是 \(\sum\limits_{p<j \leq n}{cnt_j+cnt_p+1}\)。

这个可以拆成关于 \(\sum\limits_{p<j\leq n} cnt_j\) 和 \(cnt_p\) 的形式。

这两个都可以用树状数组或线段树维护,支持区间求和单点加即可。

就做完了。

时间复杂度 \(\mathcal{O}(nm\log n)\)。

场上直接拿线段树写了,树状数组常数更小。

参考代码

#include<bits/stdc++.h>

using namespace std;

template<typename T>
void read(T &x){
	x=0;
	int sgn=0;
	char c=getchar();
	while(!isdigit(c)) sgn|=(c=='-'),c=getchar();
	while(isdigit(c)) x=x*10-'0'+c,c=getchar();
	if(sgn) x=-x;
}

const int N=1000010;

struct segment{
	struct node{
		int l,r;
		long long sum;
	};
	
	node tr[N<<2];
	
	#define ls u<<1
	#define rs u<<1|1
	
	void build(int u,int l,int r){
		tr[u].l=l,tr[u].r=r,tr[u].sum=r-l+1; //init 1,1,1,....
		if(l==r) return ;
		int mid=(l+r)>>1;
		build(ls,l,mid),build(rs,mid+1,r);
	}
	
	void add(int u,int pos){
		int l=tr[u].l,r=tr[u].r;
		if(l==r){
			tr[u].sum++;
			return ;
		}
		int mid=(l+r)>>1;
		if(pos<=mid) add(ls,pos);
		else add(rs,pos);
		tr[u].sum=tr[ls].sum+tr[rs].sum;
	}
	
	long long query(int u,int L,int R){
		int l=tr[u].l,r=tr[u].r;
		if(L<=l&&r<=R) return tr[u].sum;
		int mid=(l+r)>>1;
		long long ret=0;
		if(L<=mid) ret+=query(ls,L,R);
		if(mid<R) ret+=query(rs,L,R);
		return ret;
	}
	
	#undef ls
	#undef rs
}sgt;

int n,m,idx;

pair<int,int> p[N];
long long ans=0;

int main(){
	
	read(n),read(m);
	for(int i=1; i<=n; i++){
		for(int j=1,a; j<=m; j++){
			read(a);
			p[++idx]={a,i};
		}
	}
	
	sort(p+1,p+1+n*m);
	int t=n*m;
	sgt.build(1,1,n);
	for(int i=1; i<=t; i++){
		ans+=sgt.query(1,p[i].second+1,n)+((sgt.query(1,p[i].second,p[i].second)-1)*(n-p[i].second));
//		cout<<ans<<' ';
		sgt.add(1,p[i].second);
	}//cout<<endl;
	
	cout<<ans;
	
	return 0;
}

标签:ABC306F,int,题解,sum,元素,tr,long,leq
From: https://www.cnblogs.com/FreshOrange/p/17526674.html

相关文章

  • NOIP 模拟赛 2023.07.04 题解--zhengjun
    linkT1转化为\((b_i,a_i)\)与\((b_j,a_j)\)之间的斜率。发现性质(省略),只需要计算相邻两个点之间的答案即可,用set就行了。T2先找性质,发现即为\(a,b,c\)各有某一位是“独特”(即其他两个数这一位与之不一样)的。直接\(O(8^2n)\)记录各个状态,预处理转移优化一下即可。T......
  • 武汉理工大学第四届ACM校赛 部分题解
    比赛地址A.ST和TS回文问题题意:给出一个字符串s,进行q次操作,操作如下:1x:给字符串的末尾加上一个字符x2k:查询是否存在长度为k的字符串t,满足s+t==t+sSolution字符串哈希当k<n时,需检查s长度为k的前后缀是否相同,并且检查s长度为n-k的前后缀是否都是回文当k==n时,一定有解当k<......
  • 洛谷CF29B题解
    CF29B交通信号灯传送门题目很好理解,这里就不多说了,思路都在代码里#include<bits/stdc++.h>usingnamespacestd;doublel,d,v,g,r;intmain(){ cout<<fixed<<setprecision(8);//重置输出方式(保留8位小数) cin>>l>>d>>v>>g>>r; if(l<=d)cout<<......
  • P9431 [NAPC-#1] Stage3 - JRefreshers 题解
    传送门这个人赛时看错了几次题目导致样例调了1h。\(Sol1:n\leqslant10,T\leqslant10\)乱搞分。枚举跳跃的顺序,判断可不可行,最后取最大值,复杂度\(O((n-1)!)\)。\(Sol2:B\)感觉跟正解没什么关系,先说这个。特殊性质\(\mathbfB\):保证对于任意跳跃球\(u,v\),如......
  • [LOJ 6029]「雅礼集训 2017 Day1」市场 题解
    这道题恶心之处在于区间向下取整。这里给出两种思路:区间覆盖做法如果最大值和最小值向下取整后相等,则对此区间进行区间覆盖。我考场写的是这个,但是码错了,加上习惯不好,\(100\to64\),再加上烦了弱智错误,\(64\to9\),不给出代码。差值相等做法注意到相邻两数的向下取整的差值不......
  • [LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解
    首先不难想到一个贪心,就是先填出一个全黑的行,然后再用其填黑列。而且在其中“填出一个全黑的行步数”我们应该最小化。这个贪心的正确性证明如下:必要性:填黑列的必要条件为有一个全黑的行。充分性:“填黑列的步数”就是“非全黑列的数量”。显然,如果填出一个全黑的行的过程中......
  • Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题解决
    以下是报错日志解决方案确认以下配置是否都存在:1、配置文件有写mybatis配置2、启动类里加上Mapper扫描的注解(指向自己mapper存放的位置)3、删除SpringBootApplication注解的exclude属性:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,DataSourc......
  • P2202 题解
    前言题目传送门!更好的阅读体验?提供一个平衡树做法,虽然和std::set一个道理就是了。(那你为啥不写set!!!!)前置知识如何判断两个点对应的正方形相交?正方形的边长是\(k\),中心距离四条边就是\(\dfrack2\)了。中心要相隔严格小于两段\(\dfrack2\),显然只需满足:\[|X_p-X_q|,|Y_......
  • 【CF1621G】Weighted Increasing Subsequences 题解(优化树状数组)
    CF传送门|LG传送门。优化树状数组+反向处理。Solution发现直接做不好下手。难点主要在求出所有的上升子序列并计算它们分别的贡献。所以需要反向考虑每个单点在什么情况下产生贡献。一个单点会产生多少贡献。一个单点产生贡献的条件很容易得到。一个是在一个上升子序......
  • 题解 ARC163C【Harmonic Mean】
    没想出来什么优美的解法,来个乱搞。特判平凡情况\(n\le2\),其中\(n=1\)显然有\(1=\frac{1}{1}\),\(n=2\)无解。众所周知\(1=\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\cdots+\frac{1}{2^k}+\frac{1}{2^k}\)。注意到公式中除了\(\frac{1}{2^k}\)有重复外,其余项均无重复。容易......