首页 > 其他分享 >Codeforces Round #815 (Div. 2)

Codeforces Round #815 (Div. 2)

时间:2022-12-03 17:22:22浏览次数:65  
标签:ch int LL cin Codeforces 数组 Div include 815

比赛链接

C

题意:给定一个大小为n*m的01矩阵,每次操作你可以消除一个L形(\(2*2\)矩阵 )内的所有1,每次必须保证消除至少一个1,求操作数的最大值。

核心思路:这个其实我们需要模拟两到三个样例来观察下规律,这里有个很重要的性质:当我们进行完第一次操作之后,我们会发现我们每次都可以消除一个1.并不是只能消除一个1,因为我们需要保证操作数最大,所以我们每次只能消除一个1.

接下来就是对于第一次操作的的一个贪心操作了,我们可以发现因为我们每次都是L式消1,所以我们可以枚举一个\(2*2\)的矩阵。因为其实就只有一下这几种情况:

1 1   1 0  1 1 1 0
1 1   1 0  1 0 0 0

下面细节看代码:

#include<bits/stdc++.h>
#include<unordered_map>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL;
const int N =550,M=50050;
LL inf = (1LL << 30)-1 ;
typedef pair<int, int> PII;
int  a[N][N];
int n, m;
int getNum()
{
	char ch;
	while (ch = getchar(), ch != '0' && ch != '1')
		return ch - 48;
}
void solve()
{
	cin >> n >> m;
	LL sum = 0;
	for(int i=1;i<=n;i++)
		for (int j = 1;j <= m;j++)
		{
			scanf("%1d", &a[i][j]);
			sum += a[i][j];
		}
	int cur = 4;
	for (int i = 1;i <= n - 1;i++)
		for (int j = 1;j <= m - 1;j++)
			cur = min(cur, a[i][j]+a[i + 1][j]+ a[i][j + 1]+ a[i + 1][j + 1]);
	cout << sum - max(0, cur - 2) << endl;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

D1

题意:给定一个a数组,定义b数组是a的子数组当且仅当b数组由a的下标递增而形成。要求一个美丽的b数组满足\(a_{b_p}\bigoplus b_{p+1}<a_{b_{p+1}} \bigoplus b_p\)  ,a[i]的范围是0 <= a[i] <= 200,求最长的美丽数列。

核心思路:首先我们需要明白最重要的点,那就是b数组即代表a数组中的下标,也代表a数组中的值。于是我们就把这个问题转化一个线性dp问题。

  1. 集合定义:f[i]为以i结尾的最长长度。

  2. 集合划分:线性dp问题一般都之和前一个状态有关系。所以我们只需要关注哪个状态可以转为这个状态。

  3. 状态转移方程:f[j]==max(f[j],f[i]+1).这个限制条件就是题目给的。

这里我们需要注意下j的一个枚举长度。因为\(x-y<x\bigoplus y<x+y\).然后我们可以根据一个限制条件来递推:

\[a[i]\bigoplus j<a[i]+j \\\\\\a[j]\bigoplus i<a[j]+i \\所以j<a[j]-a[i]+i \]

又因为a<200,所以j<400+i.

#include<bits/stdc++.h>
#include<unordered_map>
#define IOS std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL;
const int N = 2e6+ 10;
LL inf = (1LL << 30)-1 ;
typedef pair<int, int> PII;
int a[N];
int n, m;
int f[N];
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		for (int i = 0;i < n;i++)
			cin >> a[i];
		for (int i = 0;i < n;i++)
			f[i] = 1;
		for(int i=0;i<n-1;i++)//这里需要注意,因为后面的j=i+1,所以要给j留余地
			for (int j = i + 1;j < min(n, i + 400);j++)
			{
				if ((a[i] ^ j) < (a[j] ^ i))
					f[j] = max(f[j], f[i] + 1);
			}
		int ans = f[0];
		for (int i = 1;i < n;i++)
			ans = max(ans, f[i]);
		cout << ans << endl;
	}
}

标签:ch,int,LL,cin,Codeforces,数组,Div,include,815
From: https://www.cnblogs.com/xyh-hnust666/p/16948370.html

相关文章

  • Educational Codeforces Round 132 (Rated for Div. 2)
    https://codeforces.com/contest/1709C.RecoveranRBS题意:这里原本有一个合法的括号序列,现在将这个合法的括号序列中的一部分字符串替换为?你可以将?替换为(或者)......
  • Codeforces Round #832 (Div. 2)
    A.TwoGroups(CF1747A)题目大意给定一个整数数组\(a\),要求将\(a\)分成两部分\(s1,s2\),要求两部分的和的绝对值的差最大。即最大化\(|\sum(s_1)|-|\sum(s_2)|\)......
  • 关于图片溢出 div 最大宽度,但又不希望图片一直是 100%
    最近在开发我这个博客皮肤的时候,遇到一个小问题,就是图片超出div最大宽度,最开始我一直都是设置的图片宽度为100%,但这又不是我想的效果。用max-width:100%来代替wid......
  • Codeforces Round #816 (Div. 2)
    [比赛链接](Dashboard-CodeforcesRound#816(Div.2)-Codeforces)B题意:给定数组长度n,参数k,\(\sum_{1}^{n}a_i/k=b\),并且区间和是s。其中b和s都是题目给定的。核......
  • CodeForces - 476C-Dreamoon and Sums(数学思维)
    C.DreamoonandSums题解:设则有题目所求可得所以代码#include<bits/stdc++.h>typedeflonglongLL;usingnamespacestd;constintmod=1e9+7;intmain(){#ifndefO......
  • Pinely Round 1 (Div. 1 + Div. 2)(持续更新)
    Preface其实这场上周一就补了ABC,但是由于各种事情的堆积一直到今天才开始接着补D再不写博客的话可能题意都要忘光光了,赶紧来Rush一发A.TwoPermutations简单观察发现......
  • 29. Divide Two Integers
    Dividetwointegerswithoutusingmultiplication,divisionandmodoperator.Ifitisoverflow,returnMAX_INT.那么如果每次不仅仅减去1个除数,计算速度就会增加,但......
  • Codeforces Global Round 10 H. ZS Shuffles Cards
    题目链接设f[i]表示还有i个数不在集合内的期望步数,尝试列一下转移式,会发现式子由转移到下一轮的期望步数和之后的DP值组成,考虑DP的转移过程,就会发现答案为转移到下一轮的......
  • 世界杯火热进行中, 用一个div画个足球场助助兴
    四年一度的世界杯正在火热进行中,有没有熬夜看你喜欢的队伍比赛呢。在这欢庆的氛围中,我决定用代码参与一把世界杯,擦边参与,那就是用CSS画一个足球场,正常的用CSS布局肯定是非常......
  • 实现div元素滚动条默认滚动到最底部 - 使用场景 - 聊天信息框
    实现div元素滚动条默认滚动到最底端使用场景:聊天信息框需要了解几个属性和方法:scrollHeight:元素高度-包含滚动条隐藏部分clientHeight:元素可视高度-不包含滚动条隐......