首页 > 其他分享 >CF补题 981-Div.3

CF补题 981-Div.3

时间:2024-12-28 10:19:32浏览次数:5  
标签:元素 int 981 cin 补题 ans 序列 Div.3 include

CF补题 981-Div.3-20241226

Dashboard - Codeforces Round 981 (Div. 3) - Codeforces

A:

题目大意:\(x\) 从 \(0\) 开始,轮流将 \(x\) 前后移动 \(i*2-1\), 求最后移动出 $-n,n $ 的 $ i$

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		int x = 0;
		cin >> n;
		int i = 0;
		for (i = 1; x >= -n && x <= n; i++)
			x += (2 * i - 1) * pow(-1, i);
		if (i % 2 == 1) cout << "Kosuke" << endl;
		else cout << "Sakurako" << endl;
	}
	return 0;
}

转化方程为每次移动 \((2*i-1)*(-1)^i\) 个单位,最后对操作数 $ i$ 取余

B:

题目大意:给定一个矩阵,每次可以选取任意一条正斜线,使斜线上的数 \(+1\) ,求矩阵所以元素都大于 \(0\) 的操作数

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int a[505][505];
int dg[1010];//所有斜线上最小元素

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		cin >> n;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				cin >> a[i][j];
				dg[j - i + n] = min(dg[j - i + n], a[i][j]);//贪心更新
			}
		}
		int ans = 0;
		for (int i = 1; i < 2 * n; i++) ans -= dg[i];//累加答案
		cout << ans << endl;
		memset(dg, 0, sizeof dg);//多测清空
	}
	return 0;
}

贪心策略,每次记录当前输入的元素,更新该斜线上的最小值,最后所有斜线上的数之和,即所有的最大负数和 $ \sum_i^n min(dg_i)$

即至少操作这么多次,才能满足条件

C:

题目大意:给定一个序列,每次可以交换第 \(i\) 和第 \(n-i+1\) 个位置上的数,求使得序列上的元素满足任意 \(a_j=a_{j+1}\) 的最小组合

#include <iostream>
using namespace std;

int a[200010];

int main()
{
    int T;
    cin>>T;
    while (T--){
        int n;
        cin>>n;
        for (int i=1;i<=n;i++) cin>>a[i];
        int l=2,r=n-1;
        while (r>l){
            if (a[l]==a[l-1]||a[r]==a[r+1])
                swap(a[l],a[r]);
            l++;r--;
        }
        int ans=0;
        for (int i=2;i<=n;i++) 
            if (a[i]==a[i-1]) ans++;
        cout<<ans<<endl;
    }
    return 0;
}

双指针,贪心(?

两个指针从左右两边开始移动,如果存在 \(a_i=a_{i-1}\) 就交换,当前局部的最优解可以推出全局的最优解(?

证明有:

设序列 1 4 3 5 1 1 3 (干扰度为 \(1\)) ,定义l=1,r=n-2,此时序列中 a[l]=4,a[r]=1,不交换。两个指针向中间移动。移动后 a[l]=3,a[r]=1r与后一个元素相同,交换 lr ,序列为 1 4 1 5 3 1 3 全局干扰度减 \(1\) ,以此类推。。。

设序列 3 1 3 2 2 3 3 (干扰度为 \(2\)),定义l=1,r=n-2,此时序列中 a[l]=1,a[r]=3r和后一个元素相同,若 lr 交换,序列变为 3 3 3 2 2 1 3l 与前一个元素相同,则全局的干扰度没有变化。两个指针向中间移动,l与前一个元素相同,交换 lr3 3 2 2 3 1 3 ,全局的干扰度不变。 最终全局最优的干扰度就为 \(2\)

归纳发现,如果满足交换条件的 lr ,就一定要交换,交换后全局解一定不劣,要么为优要么不变

D:

题目描述:给出一段序列,计算不重叠区间 l,r 使得 \(\sum _{i=l}^r a_i=0\) 的最大区间个数

#include <iostream>
#include <map>
#include <set>
using namespace std;

long long a, b, ans;
set<long long> mem;

void init(void) {
    mem.clear();
    b = 0;
    mem.insert(0);
}

int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--) {
        ans = 0;init();
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> a;
            b += a;
            if (mem.count(b)) {
                ans++;
                init();
            }
            else
                mem.insert(b);
        }
        cout << ans << endl;
    }
    return 0;
}

前缀和+贪心,每个区间右端点越靠左越优,如果某元素前缀和与前面已经记录的相同,答案 +\(1\)

使用集合set来记录前缀和,注意要首项要加入 \(0\) ,因为序列头为 \(0\) 时,也可以算作答案区间

数据量较大时关同步流可以明显加速

  • 不开long long见祖宗

标签:元素,int,981,cin,补题,ans,序列,Div.3,include
From: https://www.cnblogs.com/dianman/p/18637229

相关文章

  • 省选训练赛 #9 题目 E 补题记录
    题意:一张\(n\timesm\)的网格图,行和列的间距为\(1\)。有\(n\timesm\)个激光器,每个激光器可以用\((X_1,X_2,X_3,X_4)\)表示,其中\(0\leX_1,X_2,X_3,X_4\le1\),表示是否向上、向右、向下、向左发射激光,每道激光长度为\(0.5\)。给定每种激光器的数量,求随机摆放这些激......
  • Codeforces Round 995 (Div. 3)(补题)
    CodeforcesRound995(Div.3)D.CountingPairs(离散化+二分)题目描述给你一个由\(n\)个整数组成的序列\(a\),其中序列的\(i\)-th元素等于\(a_i\)。同时还给出两个整数\(x\)和\(y\)(\(x\ley\))。如果满足以下条件,一对整数\((i,j)\)就会被认为是有趣的:\(1......
  • Codeforces Round 993 (Div. 4)(补题)
    CodeforcesRound993(Div.4)只选择对我有价值的题目记录E.InsaneProblem题目描述给定五个整数\(k\),\(l_1\),\(r_1\),\(l_2\)和\(r_2\),Wave希望你帮助她计算满足以下所有条件的有序对\((x,y)\)的数量:\(l_1\leqx\leqr_1\)。\(l_2\leqy\leqr_2\)。存在一......
  • CF补题 993-Div.4
    CF补题993-Div.4-20241221Dashboard-CodeforcesRound993(Div.4)-CodeforcesA:题目大意:给出一个\(n\),求有多少有序正整数数对\((a,b)\),使得\(a=n-b\)#include<iostream>#definestreampreset()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);usingnames......
  • PKUWC2024 D1T2 补题记录
    加深了一点点对同余最短路的理解。link考虑若对所有数\(+1\),那么\(f'_{1\dotsn}\)都会\(+(n-1)\),这启示我们可以根据最小值划分进行区间dp。设\(dp_{l,r,V}\)表示考虑数字\(f_{l\dotsr}\),区间\(f'_{l\dotsr}\)中已经整体减\(V\)还是否能全部减成\(0\)。每......
  • (补题)Codeforces Round 993 (Div. 4) E.Insane Problem
    显然不可暴力解出,因此是到数学题。已知$$y=x*k^n$$所以我们可以利用y的区间范围$$[l1,r1]$$得出x的新的区间范围$$[l2/k^n(向上取整),r2/k^n(向下取整)]$$接着与原来的范围取交集然后不断枚举n即可,注意k^n不可能超过y#include<iostream>#defineintlonglongusingnamespa......
  • CF补题 991-Div
    CF补题991-Div.3-20241210Dashboard-CodeforcesRound991(Div.3)-CodeforcesA:题目大意:给出\(n\)个字符串,求前多少个字符串的大小之和小于\(m\)#include<iostream>#include<string>usingnamespacestd;stringa[52];intmain(){ intT; cin>>T; w......
  • icpc2024昆明补题记录
    D套娃这个trick是真没见过,也难怪场上没几个人过这个代码这么简单的题题目大意给定一排\(n\)个套娃,套娃的大小互不相同。你可以将相邻两个套娃套在一起,问最多能套几次?\[n≤10^5\]题解发现可以\(O(n)\)的判断一个长度为\(n\)的套娃序列是否能合并成一个,接下来从左边开始......
  • cf补题日记
    听退役选手建议,补40道C、D题。(又又又开新专题。。。进度:2/100 原题1:Youaregivenastring ss,consistingofdigitsfrom 00 to 99.Inoneoperation,youcanpickanydigitinthisstring,exceptfor 00 ortheleftmostdigit,decreaseitby 11,and......
  • CF补题 964-Div.4
    CF补题964-Div.4-20241206Dashboard-CodeforcesRound964(Div.4)-CodeforcesA:题目大意:给定一个两位数正整数n,求其位数之和#include<stdio.h>intmain(){intn;scanf("%d",&n);while(n--){intx,sum=0;scanf("%d&quo......