Codeforces Round 960 (Div. 2)(A-D)

A. Submission Bait

如果最大值有奇数个显然Alice赢,否则只需要看排序后是否存在n-i+1是否为奇数且a_{i}> a_{i-1}即可。

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
	cin >> n;
	rep(i, 1, n) cin >> a[i];
	sort(a + 1, a + n + 1);
	rep(i, 1, n)
	{
		if(a[i] > a[i - 1] && (n - i + 1) % 2 == 1)
		{
			cout << "YES" << endl;
			return;
		}
	}
	cout << "NO" << endl;
}
signed main()
{
	IOS;
	int t;
	t = 1;
	cin >> t;
	while(t -- )
	{
		solve();
	}
	return 0;
}

B. Array Craft

可以确定x和y这两个位置一定是1且x+1和y-1一定是-1,不难想到可以把y到x之间全填1,两边1和-1交叉填即可

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
	int x, y;
	cin >> n >> x >> y;
	rep(i, y, x) a[i] = 1;
	int now = 0;
	pre(i, y - 1, 1)
	{
		if(!now) a[i] = -1, now = 1;
		else a[i] = 1, now = 0;
	}
	now = 0;
	rep(i, x + 1, n)
	{
		if(!now) a[i] = -1, now = 1;
		else a[i] = 1, now = 0;
	}
	rep(i, 1, n) cout << a[i] << " ";
	cout << endl;
}
signed main()
{
	IOS;
	int t;
	t = 1;
	cin >> t;
	while(t -- )
	{
		solve();
	}
	return 0;
}

C. Mad MAD Sum

模拟一下发现从第三轮开始往后相当于把前一轮的数组删去最后一个数,因为假设数组为

9 5 6 4 4 4 4 5 6 9 9 9这样的,那么第一轮结束后数组为0 0 0 0 4 4 4 5 6 9 9 9,第二轮结束后数组为0 0 0 0 4 4 4 4 4 9 9发现5和6都变成了4,且这种情况很好推出只有前两轮会发生,所以模拟完前两轮依次删除最后一个数,统计贡献即可

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N];
void solve()
{
	cin >> n;
	rep(i, 1, n) cin >> a[i];
	map<int, int>mp;
	int ans = 0, res = 0;
	set<int>s;
	rep(i, 1, n) 
	{
		ans += a[i];
		mp[a[i]] ++ ;
		if(mp[a[i]] > 1) s.insert(a[i]);
		if(!s.size()) b[i] = 0;
		else 
		{
			auto it = s.end();
			it -- ;
			b[i] = *it;
		}
		res += b[i];//cout<<b[i]<<" ";
	}
	ans += res;
	mp.clear();
	s.clear();
	res = 0;
	rep(i, 1, n)
	{
		a[i] = b[i];
		mp[a[i]] ++ ;
		if(mp[a[i]] > 1) s.insert(a[i]);
		if(!s.size()) b[i] = 0;
		else 
		{
			auto it = s.end();
			it -- ;
			b[i] = *it;
		}
		res += b[i];//cout<<b[i]<<" ";
	}
	ans += res;
	pre(i, n, 1)
	{
		res -= b[i];
		if(res == 0) break;
		ans += res;
	}
	cout << ans << endl;
}
signed main()
{
	IOS;
	int t;
	t = 1;
	cin >> t;
	while(t -- )
	{
		solve();
	}
	return 0;
}

D. Grid Puzzle

a_{i}均大于2时,相邻两行需要的操作数不会小于2,因此每行都选1操作不会更劣,答案为n

a_{i}均小于等于2时,发现对相邻行贪心一边,能涂色就涂色,模拟一下就行。

以上两种特判完后,进行dp即可,dp_{i}表示前i行全涂成白色的最小操作数。

a_{i}> 2 时,这一行至少要两个1操作,直接用2操作显然更优,dp_{i}= dp_{i-1}+1

a_{i}=0 时, dp_{i}= dp_{i-1}

a_{i}\leq 2 时,发现当上一个小于等于2的位置j到当前位置i之间的数全都小于等于4且个数为偶数时,可以通过1操作使用i-j+1个操作,即dp_{i}= dp_{j-1}+i-j。记录上一个小于等于2的位置以及这段区间的最大值。

注意取min

#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define pre(x,a,b) for(int x=a;x>=b;x--)
#define ac puts("Yes")
#define wa puts("No")
#define int long long
#define endl "\n"
#define pb push_back
#define pii pair<ll, ll>
#define de cout<<1;
#define mem(a,x) memset(a,x,sizeof a)
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ull unsigned long long
#define eps 1e-6
#define RI register int
#define CI const int&
using namespace std;
const int mod=1e9 + 7;
const int N = 1e6 + 20;
int n, m, q;
int a[N], b[N], dp[N];
void solve()
{
	cin >> n;
	rep(i, 1, n) cin >> a[i];
	int f = 0;
	rep(i, 1, n) if(a[i] <= 2) f ++ ;
	if(!f)
	{
		cout << n << endl;
		return;
	}
	if(f == n)
	{
		int ans = 0;
		rep(i, 2, n)
		{
			if(a[i] && a[i - 1]) ans ++ , a[i] = 0, a[i - 1] = 0;
		}
		rep(i, 1, n) if(a[i]) ans ++ ;
		cout << ans << endl;
		return;
	}
	rep(i, 1, n) dp[i] = 1e9;
	dp[0] = 0;
	int j = 0, ma = 0;
	rep(i, 1, n)
	{
		if(a[i] == 0) dp[i] = dp[i - 1];
		dp[i] = min(dp[i], dp[i - 1] + 1);
		if(a[i] <= 2 && j && ma <= 4 && (i - j + 1) % 2 == 0) dp[i] = min(dp[i], dp[j - 1] + i - j);
		if(a[i] <= 2) j = i, ma = 0;
		else ma = max(ma, a[i]);
	}
	cout << dp[n] << endl;
}
signed main()
{
	IOS;
	int t;
	t = 1;
	cin >> t;
	while(t -- )
	{
		solve();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值