首页 > 其他分享 >Codeforces Round 981 (Div. 3) 题解(A-E)

Codeforces Round 981 (Div. 3) 题解(A-E)

时间:2024-10-27 17:32:35浏览次数:1  
标签:int 题解 void 981 cin vector fi 卡题 Div

目录
Codeforces Round 981 (Div. 3)

分析

这场整体发挥都不好, 虽然题也抽象, 但是对于这些题完全没必要卡这么久. 正常至少能看到 \(\mathbf{F}\)

A

思路

因为边界 \(n\) 管辖 \(\pm\), 而 Sakurako 管辖 \(\{-1,-3,-5,-7...\}\), Kosuke 管辖 \(\{2,4,6,...\}\), 也就是说 Sakurako 管辖奇数, Kosuke 管辖偶数.

代码

void func(void)
{
	int n;
	cin >> n;
	cout << (n&1 ? "Kosuke\n" : "Sakurako\n");
}

B

思路

翻译题意后可知, 每次操作对一个子正方形的主对角线(左上到右下)都 \(+1\).

那么对于边长为 \(n\) 的正方形, 每次只需要操作 \(2n-1\) 条线(从左下或者右上点的边长 \(\le n\) 的正方形), 因为对于每条主对角线, 如果首尾相接就可以连起来, 那么可以将操作合并.

并且因为只需要让所有数为 \(+\), 所以只需统计每条上负数的最大值即可, 最后求和.

卡题原因

一时间没想到怎么处理对角线, 居然卡了半个小时.
注: 事实上下列代码也非常丑陋. 完全不符合我的代码风格.

代码

void func(void)
{
	int n,ans = 0;
	cin >> n;
	vector<vector<int>> a(n+2,vector<int>(n+2));
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			int stp;	cin >> stp;
			if(stp < 0)	a[i][j] = -stp;
		}
	}
	for(int i=2;i<=n;++i)
	{
		int stp = 0;
		int x = i,y = 1;
		while(x <= n)
		{
			stp = max(stp,a[x][y]);
			x++, y++;
		}
		ans += stp;
	}
	for(int i=1;i<=n;++i)
	{
		int stp = 0;
		int x = 1,y = i;
		while(y <= n)
		{
			stp = max(stp,a[x][y]);
			x++, y++;
		}
		ans += stp;
	}
	cout << ans << '\n';
}

C

思路

贪心
因为每个元素只能和对称元素交换, 所以可以把原始串拆成两部分 —— \(1 \sim n/2, (n+1)/2 \sim n\), 如果奇数串, 因为对称轴元素无法交互, 所以不用处理.

虽然题意描述是 \(a_j = a_{j+1}\) 扰动指数增加, 但是按 \(a_j = a_{j-1}\) 判断也可以, 那么对称轴左侧向左判, 右侧向右判断也无影响, 若是到了对称轴:

  • 若是奇数, 中间数不变化, 所以不影响结果.
  • 若是偶数, 分界点左右数互相判断, 也无影响.

设\(fi(i) = n - i + 1\)
那么每次只需要判断 \(i - 1\) 和 \(fi(i-1)\), \(i\) 和 \(fi(i)\).
设\(a_{i-1} = x_0, a_{fi(i-1)} = y_0, a_{i} = x_1, a_{fi(i)} = y_1\)

  • 若 \(x_0 = y_0\), 那么 \(x_1, y_1\) 在什么位置都不影响结果.
  • 若 \(x_1 = y_1\), 那么 \(x_0, y_0\) 在什么位置都不影响结果.
  • 若 \(x_0 = x_1\), 那么交换\(x_1, y_1\), 使得两个 \(x\) 不接触.
  • 若 \(y_0 = y_1\), 那么交换\(x_1, y_1\), 使得两个 \(y\) 不接触.

卡题原因

分析觉得需要尽量减少连续序列长度, 但是长度实际并没有影响.

code

int fi(int k)// 计算反转后的串
{
	return (n-k+1);
}

void func(void)
{
	
	cin >> n;
	vector<int> a(n+1),t(n+1);// 其实也没有新开的必要, 因为每次也是判断交换后的前一个数
	vector<PII> b(n/2+1);
	for(int i=n;i>=1;--i)	cin >> a[i];// 并没有反读的必要
	for(int i=1;i<=n/2;++i)
	{
		b[i].x = a[i],b[i].y = a[fi(i)];
	}
	int ans = 0;
	t[(n+1)/2] = a[(n+1)/2];
	for(int i=1;i<=n/2;++i)
	{
		t[i] = b[i].x,t[fi(i)] = b[i].y;
		if(t[i-1] == t[fi(i)+1] || b[i].x == b[i].y)	continue;
		if(b[i].x == t[i-1] || b[i].y == t[fi(i)+1])
		{
			swap(t[i],t[fi(i)]);
		}
	}
	for(int i=1;i<=n;++i)	if(t[i] == t[i-1])	ans ++;
	cout << ans << '\n';
}

D

思路

前缀和 贪心

前缀和维护上一次为 \(0\) 区间尾的下一个点开始到当前节点的前缀和.

贪心寻找每次最先出现的满足区间, 这样对后续区间的影响最小, 因为其尽可能靠左, 占用元素更少.

卡题原因

完全没想到在线, 还是抄小秦的才明白.

代码

void func(void)
{
	int n,ans = 0,sum = 0;
	cin >> n;
	vector<int> a(n);
	map<int,int> mp;
	for(auto &i : a)	cin >> i;
	for(int i=0;i<n;++i)	
	{
		sum += a[i];
		mp[sum] ++;
		if(mp[sum] == 2 || sum == 0)
		{
			ans ++;
			sum = 0;
			mp.clear();
		}
		
	}
	cout << ans << '\n'; 
}

E

思路

对于每个 \(i\), 可以通过 \(a_i\) 找到指向的元素, 那么互相指向的元素就可以构成一个环.

根据题意, 大小 \(\le 2\) 的环满足条件, 题面需要所有环 \(\le 2\).

可以计算, 一个 $> 2 $ 的环, 需要 \((size-1) / 2\) 次操作才能满足条件.
所以只需要计算每个环的操作此时, 求和即可.

wa原因

bitset开小了, 搞错了开法, <>内的是实际元素大小.
为什么小数据还一直报wa, 搞得我以为是模拟错了. 要不是看小秦代码对拍, 当晚都补不出来.

code

void func(void)
{
	int n;
	cin >> n;
	vector<int> a(n+1);
	for(int i=1;i<=n;++i)	cin >> a[i];
	bitset<N/32> vis;
	int tp = 1,ans = 0,p = 0;
	for(int i=1;i<=n;++i)
	{
		if(vis[i])	continue;
		vis[i] = true;
		tp = i, p = a[tp];
		vis[p] = true;
		int cnt = 1;
		while(p != tp)
		{
			p = a[p];
			cnt ++;
			vis[p] = true;
		}
		ans += (cnt-1)/2;
	}
	cout << ans << '\n';
}

标签:int,题解,void,981,cin,vector,fi,卡题,Div
From: https://www.cnblogs.com/zerocloud01/p/18508647

相关文章

  • P11234 [CSP-S 2024] 擂台游戏 题解
    P11234[CSP-S2024]擂台游戏题解前言作者在考场上用了约1h把前三道题做完了,然后用了约半小时想了带\(\log\)的做法,但是我决定放手一搏去想线性的做法,于是又想了有1h之后觉得想到了正解,然后我就一直写到了考试结束,但是最终没有调出来遗憾离场,因此写个题解来纪念一下。......
  • Codeforces Round 980 (Div. 2) 题解(A-D)
    目录A思路B思路wa原因C思路wa原因代码D思路未ac原因代码CodeforcesRound980(Div.2)A思路推方程式即可,勉强算贪心吧.需要使得\({a-x}\)最小,那么\(x\)就需要最小,而满足题目条件,需要\(a-x\geb-2x\)得出\(x\geb-a\),又因为需要\(a\)最大,所以\(......
  • 题解:P2013 无线电测向
    P2013无线电测向题目省流:求两条直线交点坐标使用样例数据作出下图:(图片来自@_MRCMRC_)图中红线和紫线为灯塔与船的连线,蓝线为船的航线。由输入可以知道灯塔A、B相对于\(x\)正半轴的角度\(\theta_A\)、\(\theta_B\)(逆时针方向)和它们分别的坐标\((x_A,y_A)\)、\((x_B,......
  • DYN / 消防局的设立 / Spread of Information / 将军令 题解
    前言四倍经验:[POI2011]DYN-Dynamite;[HNOI2003]消防局的设立;[ARC116E]SpreadofInformation;将军令。题意简述给你一棵\(n\)个结点的树和点集\(S\),你要选出\(k\)个关键点\(T\),求\(\min\max\limits_{u\inS}\min\limits_{v\inT}\operatorname{dis}(u,v)\)......
  • CSP-J 2024 复赛题解
    T1数据仅有52,极小的数据范围导致这题只有一个问题:如何简短方便的去重并统计。我选择了map做法:每个输入查找map中之前是否记录过此元素,如果记录过则证明已经拥有这张牌,反之则记录并将统计数增加。代码如下:#include<bits/stdc++.h>usingnamespacestd;intn;map<stri......
  • 10.26 吃 Div.2 水分
    10.26CodeforcesRound982(Div.2)Solve:A~D2(4/5)Rank:24Rating:\(2098+114=2212\)Pref:2554发挥评价:Good-果然还是Div.2善良啊!()随便做了前四道,没咋卡住,就这名次了,可惜C有一发罚时吃得不温不火,比较可惜。然后E1咋这么难。CF2027D1/D2长为\(n\)的序......
  • Stema练习题:十四届蓝桥杯STEMA考试Python真题试卷题解
    来源:十四届蓝桥杯STEMA考试Python真题试卷第一套编程第四题这个程序虽然代码量不大,但综合运用了多种基础算法和数据结构:贪心策略选择窗口、模拟现实过程、线性查找最小值、效率高(时间复杂度为O(N)O(N)O(N))。题目描述:编程实现:某服务大厅同时开放3个窗口为客户办理......
  • 在图像处理中,散度 div 具体的作用是什么
    在图像处理中,散度(divergence)通常用于量化一个向量场中的向量是如何相互远离或靠近的。图像可被视为矢量场,每一个像素点具有一定的矢量值,这些像素点的向量值可代表了不同的图像特性,如边缘、纹理等。在图像处理的环境下,散度在检测图像特征、边缘检测、图像分割以及光流估计等方面扮......
  • Codeforces Round 982 div2 个人题解(A~D2)
    CodeforcesRound982div2个人题解(A~D2)Dashboard-CodeforcesRound982(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#in......
  • CF102354B Yet Another Convolution 题解
    题目描述给定长为\(n\)的数列\(a,b\),求数列\(c\)满足:\[c_k=\max_{\gcd(i,j)=k}|a_i-b_j|\\\]数据范围\(1\len\le10^5,1\lea_i,b_i\le10^9\)。时间限制\(\texttt{6s}\),空间限制\(\texttt{256MB}\)。分析别被题目名字带偏了,这道题跟卷积没有一点关系。如果......