Codeforces Round 1019 (Div. 2) ABC

发布于:2025-05-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

A 模拟

思路

数组y是不同的,且所以xi * yi 相同,只有x数组全不同才可以满足要求

代码


LL n,m,k;


void solve() 
{
	map<LL,LL> mp;
	cin >> n;
	for (int i = 1;i <= n;i ++)
	{
		LL x;cin >> x;
		mp[x] ++;
	}
	
	cout << mp.size() << endl;
}


B 思维 !

思路


因为初始在0的位置,所以先在每个串前添加0 (方便统计原本的操作次数)
先统计原本需要的操作的次数,如果a[i]!=a[i - 1]不同 就+2(切换当前数字并按一下),如果a[i]==a[i-1]就+1(直接按一下)

随后考虑反转字串以减少操作次数,首找到第一个不同的数字,下标记为L,找一个后面第一个满足a[R] != a[L] 的R,且R不是最后一个数字,这样操作可使得,区间[L,R]反转后使得操作次数-2
如果R是最后一个数字时,[L,R]反转后只能使得操作次数-1,(因为R后面没有数字,使得不需要切换,直接按一下)

代码



const int N = 2e5 + 10;


LL n,m,k;

char a[N];

void solve() 
{
	//1101[0100100110111]00
	//1101[1110110010010]00
	
	//1110010010011011100
	//2112122122121221121 29
	
	//1101010010011011100
	//2122222122121221121 31
	
	//100 
	//221 5
	//001
	//112 4
	
	//10101
	//22222 10
	//01101
	//12122 8
	
	cin >> n;
	for (int i = 1;i <= n;i ++) cin >> a[i];
	
	LL cnt = 0;
	a[0] = '0';
	for (int i = 1;i <= n;i ++)
	{
		if (a[i] != a[i - 1]) cnt += 2;
		else cnt ++;
	}
	// cout << cnt << "==" << endl;
	
	for (int i = 1;i <= n - 1;i ++)
	{
		if (a[i] != a[i - 1])
		{
			int l = i;
			for (int r = l + 1;r <= n;r ++)
			{
				if (a[r] != a[l] &&  r != n  && a[r] != a[r + 1])
				{
					cout << cnt - 2 << endl;
					return;        
				}
				if (a[r] != a[l] && r == n)
				{
					cout << cnt - 1 << endl;
					return;
				}
			}
		}
	}
	
	cout << cnt << endl;
}


C 贪心+思维 !!

题目

是否存在l,r使得   med(med(a1,a2,…,al),med(al+1,al+2,…,ar),med(ar+1,ar+2,…,an))≤k.

med为中位数

思路

代码

const int N = 3e5 + 10;


LL n,m,k;
LL a[N],b[N];

bool check(LL a[])
{
	LL cur = 0;
	map<LL,LL> mp;
	
	for (int i = 1;i < n;i ++)//i < n的原因 :要留出一个数字作为第三块
	{
		cur += a[i];

		if (cur == 1 && (mp[0] || mp[1])) return true;
		if (cur == 0 && mp[0]) return true;
		if (cur >= 2) return true;
		
		mp[cur] ++;
	}
	return false;
}

void solve()
{
	cin >> n >> k;
	for (int i = 1;i <= n;i ++) cin >> a[i];
	for (int i = 1;i <= n;i ++)
	{
		a[i] = (a[i] <= k ? 1 : -1);
	}
	
	
	LL l = 2,cur = a[1];
	while(cur < 0 && l <= n) cur += a[l ++];
	// cout << l << endl;
	
	LL r = n - 1;
	cur = a[n];
	while(cur < 0 && r >= 1) cur += a[r --];
	// cout << r << endl;
	
	if (l <= r)//第一种情况
	{
		cout << "YES" << endl;
		return;
	}
	
	for (int i = 1;i <= n;i ++) b[i] = a[n + 1 - i];

	//第2,3中情况,本质一样,只不过顺序反转一下
	if (check(a) || check(b))
	{
		cout << "YES" << endl;
		return;
	}
	
	cout << "NO" << endl;
	
	
}