首页 > 其他分享 >CF2053F Earnest Matrix Complement 题解

CF2053F Earnest Matrix Complement 题解

时间:2024-12-30 15:58:29浏览次数:6  
标签:ch 颜色 ll int 题解 Complement 行中 Earnest void

我也不知道显不显然,有一个重要性质是:一定存在一种最优方案,使得每一行的 \(-1\) 填的都是同一个数。

证明的话直接调整即可,假设现在我们有一个最优方案,并且第 \(i\) 行填着不同的数,我们将每一种颜色 \(u\),按 \(c_{u,i-1} + c_{u,i+1}\) 排个序,意思就是每多一个颜色 \(u\) 都会加上面的贡献,将其他颜色都调整为一个 \(c_{u,i-1} + c_{u,i+1}\) 最大的颜色,答案一定不会变小。

这样就好办了。设 \(f_{i,j}\) 为第 \(i\) 行中所有空位填的都是颜色 \(j\) 的最大权值。直接列出转移方程:

设 \(a_i\) 为第 \(i\) 行中 \(-1\) 的数量,\(b_{i,j}\) 为第 \(i\) 行中颜色 \(j\) 的数量。

\[f_{i,j} = \max_{c=1}^{k}(f_{i-1,c} + b_{i,c} \times a_{i-1} + a_i \times a_{i-1}[j = c]) + b_{i-1,j} \times a_i \]

简单研究一下这个式子,发现其中只有 \(O(m)\) 次单点加,全局加和全局取 \(\max\)。然后维护全局 \(\max\)。此时我的大脑已经停转了,直接上线段树维护即可,时间复杂度 \(O(nm\log{k})\)。

代码

#include<bits/stdc++.h>
inline void rd(){}
template<typename T,typename ...U>
inline void rd(T &x,U &...args){
	int ch=getchar();
	T f=1;x=0;
    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();
	x*=f;rd(args...);
}
#define pii std::pair<int,int>
#define fir first
#define sec second
typedef long long ll;
const int N=6e5+5;
int T,n,m,k;
std::map<int,int> mp[N];
struct node{ll val,tg,mx;}t[N<<2];
inline void Addtag(int i,ll tg,ll mx){
	t[i].val=std::max(t[i].val,mx)+tg;
	t[i].mx=std::max(t[i].mx,mx-t[i].tg);
	t[i].tg+=tg;
}
inline void PushDown(int i){
	if(t[i].tg||t[i].mx){
		Addtag(i*2,t[i].tg,t[i].mx);
		Addtag(i*2+1,t[i].tg,t[i].mx);
		t[i].tg=t[i].mx=0;
	}
}
inline void PushUp(int i){
	t[i].val=std::max(t[i*2].val,t[i*2+1].val);
}
void Build(int i,int l,int r){
	t[i].tg=t[i].mx=t[i].val=0;
	if(l==r)return;
	int mid=(l+r)>>1;
	Build(i*2,l,mid);Build(i*2+1,mid+1,r);
}
void Update(int i,int l,int r,int x,ll v){
	if(l==r)return t[i].val+=v,void();
	int mid=(l+r)>>1;PushDown(i);
	if(x<=mid)Update(i*2,l,mid,x,v);
	else Update(i*2+1,mid+1,r,x,v);
	PushUp(i);
}
inline void Solve(){
	rd(n,m,k);
	Build(1,1,k);
	for(int i=1;i<=n;i++){
		mp[i].clear();
		for(int j=1;j<=m;j++){
			int x;rd(x);
			++mp[i][x];
		}
		if(i==1)continue;
		for(pii p:mp[i]){
			if(p.fir<0)continue;
			Addtag(1,1ll*p.sec*mp[i-1][p.fir],0);
			Update(1,1,k,p.fir,1ll*p.sec*mp[i-1][-1]);
		}
		ll tmp=t[1].val;
		Addtag(1,1ll*mp[i][-1]*mp[i-1][-1],0);
		Addtag(1,0,tmp);
		for(pii p:mp[i-1]){
			if(p.fir<0)continue;
			Update(1,1,k,p.fir,1ll*p.sec*mp[i][-1]);
		}
	}
	printf("%lld\n",t[1].val);
}
signed main(){
	rd(T);
	while(T--)Solve();
	return 0;
}

标签:ch,颜色,ll,int,题解,Complement,行中,Earnest,void
From: https://www.cnblogs.com/11-twentythree/p/18641449

相关文章

  • DataGrip 2024.3安装详细教程与激活方法(附常见问题解决)
    DataGrip概述DataGrip是一款功能强大的,适用于关系数据库和NoSQL数据库的强大跨平台工具温馨提示:本文中的方法仅供学习交流使用,如果条件允许,请支持正版软件。删除旧版本DataGrip如果您的电脑中已经安装了旧版本的DataGrip,建议首先将其完全卸载。操作步骤如下(如果未安装......
  • PyInstaller打包exe提示文件缺失,无法找到文件/文件夹路径的问题解析(为什么PyInstaller
    文章目录......
  • AT_abc237_g [ABC237G] Range Sort Query 题解
    题目传送门前置知识珂朵莉树/颜色段均摊解法观察到只有\(=x\)的位置才是重要的,而其他位置上的数具体是什么并不重要,我们只需要关注其大小关系。第一遍将\(\gex\)的数看做\(1\),将\(<x\)的数看做\(0\)。第二遍将\(>x\)的数看做\(1\),将\(\lex\)的数看做\(1\)。......
  • 题解:P11487 「Cfz Round 5」Gnirts 10
    枚举\(S\)每个前缀,计算其对答案的贡献。把枚举出来的前缀\(S[1\dotsi]\)看成已有的串,我们要插入一些字符使得它有\(n\)个\(0\),\(m\)个\(1\),且\(S[1\dotsi]\)为\(T\)的子序列,而\(S[1\dotsi+1]\)不是。问方案数(统计到最后答案的时候要乘长度)。发现在\(1\)前......
  • P6272 [湖北省队互测2014] 没有人的算术 题解
    本文参考了湖北省队互测Week1解题报告,在部分之处说明可能不如原题解,如有错误请指出。洛谷上的题面缺失了特殊性质,不过原题的特殊性质还是比较具有启发性的,下面是原题面中的数据范围测试点\(1\)考察选手的读题能力。按照题目提供的比较方式暴力递归即可。测试点\(2\sim......
  • LeetCode1.两数求和 C题解(简单)
    两数求和1.原题目题目示例2.思路解析3.具体操作1.原题目题目LeetCode题库的第1题题目为:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两......
  • [CF2053C] Bewitching Stargazer 题解
    我们不妨直接递归模拟算答案。定义\(f(l,r)\)表示左右端点为\(l,r\)的答案。记\(mid\gets\lfloor\frac{l+r}{2}\rfloor\),于是:\[f(l,r)=\begin{cases}f(l,mid)+f(mid+1,r)&(r-l+1)\equiv0\pmod2\\f(l,mid-1)+f(mid+1,r)+mid&{\text{otherwi......
  • [CF2043C] Sums on Segments 题解
    我们先想全是\(\pm1\)的。令区间内最小子段和为\(mn\),最大子段和为\(mx\),注意到\([mn,mx]\)内的数全都能被凑出来。证明:我们在区间\([l,r]\)内任意取一个子区间\([l',r']\)。定义【扩展】为将一个区间左边或右边添加一个数。定义【收缩】为将一个区间左边或右边去......
  • [题解](更新中)AtCoder Beginner Contest 386(ABC386) A~E
    A-FullHouse2容易发现,答案为Yes\(\iff\)输入中恰好出现了\(2\)种不同的数,可以用set等数据结构来计算不同元素的个数。点击查看代码#include<bits/stdc++.h>usingnamespacestd;set<int>se;signedmain(){ for(inti=1,a;i<=4;i++){ cin>>a; se.insert(a); } c......
  • Win11小图标显示空白问题解决方法
    Win11小图标显示空白问题解决方法近期,不少升级到Windows11系统的用户遇到了一个桌面图标显示的问题:当将文件夹的查看方式设置为“小图标”时,软件图标无法正常显示,而是一片空白;但将查看方式切换到“中图标”或更大时,图标则能正常显示。这个问题困扰了不少用户,影响了桌面整......