首页 > 其他分享 >题解:【CF226D】The table

题解:【CF226D】The table

时间:2023-01-29 11:37:47浏览次数:62  
标签:cop int 题解 CF226D 答案 table 操作 100 翻转

题目链接

调整构造。

发现 \(n\) 和 \(m\) 较小只有 \(100\),因此可以考虑尝试进行修改从而不断逼近答案。

容易发现如果将某一行或列上的数字翻转,那么得到的新的和一定与原来的和异号,因此答案一定有解。在每次操作中,我们寻找是否有行或列和为负值,如果有就翻转。这样操作答案一定是单增的。

单次操作的时间复杂度为 \(O(n)\),一次操作至少能将答案增加 \(2\),又有 \(\lvert a_{i,j} \rvert \le 100\),所以整个矩阵中的值最小为 \(-100^3\),总的操作次数不会超过 \(500000\) 次,事实证明很难跑满。

特别的,在这种自适应的调整中会出现“撤销”的操作,即将同一行或列翻转两次,此时相当于不进行该操作,需要删掉。

\(Code\)

#include<bits/stdc++.h>
#define int long long
using namespace std;

inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
	while(isdigit(c)) s=(s<<1)+(s<<3)+(c^48),c=getchar();
	return s*w;
}

namespace LgxTpre
{
	static const int MAX=110;
	static const int mod=998244353;
	static const int INF=200707070707;
	
	int n,m;
	int a[MAX][MAX];
	
	int rsum[MAX],csum[MAX];
	set<int> rop,cop;
	inline int check()
	{
		for(int i=1;i<=n;++i)
			if(rsum[i]<0)
				return i;
		for(int i=1;i<=m;++i)
			if(csum[i]<0) 
				return i+n;
		return -1;
	}
	inline void print()
	{
		for(int i=1;i<=n;++i,puts(""))
			for(int j=1;j<=m;++j)
				cout<<a[i][j]<<" ";
		for(int i=1;i<=n;++i)
			cout<<rsum[i]<<" ";
		cout<<endl;
		for(int i=1;i<=m;++i)
			cout<<csum[i]<<" ";
		cout<<endl;
		getchar();
	}
	inline void solve()
	{
		while(1)
		{
			int p=check();
			if(p==-1) break;
			if(p<=n)
			{
				if(rop.find(p)!=rop.end()) rop.erase(p);
				else rop.insert(p);
				for(int i=1;i<=m;++i)
					rsum[p]-=a[p][i],csum[i]-=a[p][i],
					a[p][i]=-a[p][i],
					rsum[p]+=a[p][i],csum[i]+=a[p][i];					
			}
			if(p>n)
			{
				p-=n;
				if(cop.find(p)!=cop.end()) cop.erase(p);
				else cop.insert(p);
				for(int i=1;i<=n;++i)
					csum[p]-=a[i][p],rsum[i]-=a[i][p],
					a[i][p]=-a[i][p],
					csum[p]+=a[i][p],rsum[i]+=a[i][p];
			}
		}
		return;
	}
	
	inline void lmy_forever()
	{
		n=read(),m=read();
		for(int i=1;i<=n;++i)
			for(int j=1;j<=m;++j)
				a[i][j]=read(),
				rsum[i]+=a[i][j],csum[j]+=a[i][j];
		solve();
		cout<<rop.size()<<" ";
		for(auto it=rop.cbegin();it!=rop.cend();++it)
			cout<<*it<<" ";
		cout<<endl;
		cout<<cop.size()<<" ";
		for(auto it=cop.cbegin();it!=cop.cend();++it)
			cout<<*it<<" ";
		return;
	}
}

signed main()
{
	LgxTpre::lmy_forever();
	return (0-0);
}

标签:cop,int,题解,CF226D,答案,table,操作,100,翻转
From: https://www.cnblogs.com/LittleTwoawa/p/17072132.html

相关文章

  • 【题解】ABC287
    \(\text{AtCoderBeginnerContest287}\)AMajority无意义题,问同意的是不是占半数以上。BPostalCard无意义题,对一个字符串集合开桶,对应匹配另一个字符串集合。CPa......
  • P3070 [USACO13JAN]Island Travels G 题解
    题目传送门一道耗费了本蒟蒻与某机房卷王半天的恶心题题目描述给定一个图,求每个X连通块之间的最短Hamilton路径。假如您不知道Hamilton路径是什么分析这题本质......
  • 【题解】P4491 [HAOI2018]染色
    思路NTT优化二项式反演。首先考虑到求“正好有\(k\)种颜色出现\(S\)次”的方案数,所以可以考虑转化成求“至少有\(k\)种颜色出现\(S\)次”的方案数。形式化......
  • ABC 287 (E-Ex) 题解
    E我的做法对于每个串枚举他的答案,然后直接hash硬干就完了。卡一卡就过去了#include<bits/stdc++.h>usingnamespacestd;typedefunsignedlonglongull;const......
  • setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapsh
    setting.xml的mirror、mirrorOf和pom.xml的repositories、repository的关系关联snapshots带有时间错问题解决方案nexus3.8私有仓库https://blog.csdn.net/Michaelwubo/a......
  • [CF380C] Sereja and Brackets 题解
    [CF380C]SerejaandBrackets题解给定一个括号串\(s\)与\(m\)次询问。l,r回答字符串\(t=s_ls_{l+1}\dotss_r\)​的所有子序列中最长的合法括号串的长度。......
  • 【题解】[ABC286C] Rotate and Palindrome 题解
    更好的阅读体验洛谷题目传送门|AT原题传送门思路观察题目可以发现A操作最多只能执行\(n\)次,超过以后字符串又会回到初始状态。首先考虑A操作如何实现,一种办法......
  • 【题解】[IOI2018] werewolf 狼人
    题目分析这个题本身很简单,可能就是因为是IOI题所以看上去就难了些吧。其实题目就是让我们先走一段全部大于等于\(l\)的点然后再走一段全部小于等于\(r\)的点,那么能......
  • vxlan结合iptables-snat实现内网服务器公网访问
    如上图,有这样一种场景,我们经常遇到,局域网内有两台服务器,Server1和Server2,Server1可以通通网,Server2只能通内网,无法直接访问公网现在想Server2能访问到公网,怎么做?......
  • xhost: unable to open display ""问题解决
    一、需求xhost可是增强vnc的图形界面显示二、问题解决设置一下dispaly  通过执行exportDISPLAY=x.x.x.x:1,x.x.x.x指的是虚拟机ip地址,DISPLAY用来设置将图形显示......