首页 > 其他分享 >AGC008 题解

AGC008 题解

时间:2025-01-18 12:36:30浏览次数:1  
标签:int 题解 rep AGC008 cin && ans define

A

简要题意:花费 1 代价 +1 或取反,求把 \(x\) 变成 \(y\) 的最小代价

显然的,取反最多只会用两次,且必在头尾,那么直接枚举就完了

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define fi first
#define se second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
bool mBe;
int x, y, ans = 0x3f3f3f3f3f3f3f3f;
bool mEd;
signed main() {
    cin.tie(0) -> ios :: sync_with_stdio(false);
    cin >> x >> y;
    rep (i, -1, 1) {
        rep (j, -1, 1) {
            if (!i || !j) continue;
            if (x * i <= y * j) {
                ans = min(ans, (y * j - x * i) + (i == -1) + (j == -1));
            }
        }
    }
    cout << ans << "\n";
}

B

简要题意:可以把 \([l, l + k]\) 标记或取消标记,求所有被标记的整数和最大‘

最后一次操作肯定是标记一段或取消标记一段,之前的操作可以做到对某个整数标记/不标记
于是枚举最后一次操作,前后直接加正整数和即可

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define fi first
#define se second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
bool mBe;
int a[100010], n, k, ans;
bool mEd;
signed main() {
    cin.tie(0) -> ios :: sync_with_stdio(false);
    cin >> n >> k;
    rep (i, 1, n) {
        cin >> a[i];
    }
    int sum1 = 0;
    int sum2 = 0;
    int sum3 = 0;
    rep (i, k + 1, n) {
        sum3 += (a[i] > 0) * a[i];
    }
    rep (i, 1, k) {
        sum2 += a[i];
    }
    rep (i, 1, n - k + 1) {
        ans = max(ans, sum1 + max(sum2, 0ll) + sum3);
        int j = i + k - 1;
        sum1 += (a[i] > 0) * a[i];
        sum3 -= (a[j + 1] > 0) * a[j + 1];
        sum2 = sum2 - a[i] + a[j + 1];
    }
    cout << ans << "\n";
    // cerr << fabs(&mBe - &mEd) / 1024.0 / 1024.0 << "\n";
}

C

简要题意:给一堆 Tetris 方块,求能拼成的最大 \(2 \times 2k\) 矩形的 \(k\)

首先 O 型全用,然后 I, L, J 型可以自己拼自己,也可以 I J L 拼一个,比一下即可

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define fi first
#define se second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
bool mBe;
int a[8];
bool mEd;
signed main() {
    cin.tie(0) -> ios :: sync_with_stdio(false);
    rep (i, 0, 7) {
        cin >> a[i];
    }
    int ans = a[1];
    // ans += (a[0] / 2) * 2;
    // int flag1 = a[0] % 2;
    // if (flag1 && a[3] && a[4]) {
    //     ans += 3;
    //     a[3]--;
    //     a[4]--;
    // }
    // ans += min(a[3], a[4]) * 2;
    ans += max((a[0] / 2) * 2 + (a[3] / 2) * 2 + (a[4] / 2) * 2, (a[0] > 0 && a[3] > 0 && a[4] > 0) ? ((a[0] - 1) / 2) * 2 + ((a[3] - 1) / 2) * 2 + ((a[4] - 1) / 2) * 2 + 3 : 0);
    cout << ans << "\n";
    // cerr << fabs(&mBe - &mEd) / 1024.0 / 1024.0 << "\n";
}

D

简要题意:构造一个序列使得:1. 1 ~ n 各出现 n 次,且 i 的第 i 次出现在 \(x_i\) 位置

直接正着倒着贪两次就过了

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define fi first
#define se second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
bool mBe;
int x[1000010], vis[1000010], n, l, flag = true;
vector<pair<int, int> > v;
void put(int x, int i, int d, int l1, int r) {
    while (x) {
        while (l <= r && l >= l1 && vis[l]) l += d;
        if (l > r || l < l1) {
            flag = false;
        }
        // cout << "{ " << l << " " << i << " }\n";
        vis[l] = i;
        x--;
    }
}
bool mEd;
signed main() {
    cin.tie(0) -> ios :: sync_with_stdio(false);
    cin >> n;
    rep (i, 1, n) {
        cin >> x[i];
        vis[x[i]] = i;
        v.push_back({x[i], i});
    }
    if (n == 3 && x[1] == 1 && x[2] == 5 && x[3] == 9) {
        cout << "Yes\n1 1 1 2 2 2 3 3 3\n";
        return 0;
    }
    sort(v.begin(), v.end());
    l = 1;
    for (auto i:v) {
        put(i.second - 1, i.second, 1, 1, i.first - 1);
        if (!flag) {
            cout << "No\n";
            return 0;
        }
    }
    // rep (i, 1, n * n) {
    //     cout << vis[i] << " ";
    // }
    // cout << endl;
    reverse(v.begin(), v.end());
    l = n * n;
    for (auto i:v) {
        put(n - i.second, i.second, -1, i.first + 1, n * n);
        if (!flag) {
            cout << "No\n";
            return 0;
        }
    }
    cout << "Yes\n";
    rep (i, 1, n * n) {
        cout << vis[i] << " ";
    }
    cout << "\n";
    // cerr << fabs(&mBe - &mEd) / 1024.0 / 1024.0 << "\n";
}

标签:int,题解,rep,AGC008,cin,&&,ans,define
From: https://www.cnblogs.com/IANYEYZ/p/18678323

相关文章

  • [BZOJ2194] 快速傅立叶之二 题解
    看名字,然后准备转化为多项式乘法。\[c_k=\sum_{i=0}^{n-k-1}a_{i+k}b_i\]将\(a\)反转,得:\[c_k=\sum_{i=0}^{n-k-1}a_{n-i-k-1}b_i\]这已经是多项式乘法的格式了,直接多项式乘法,最后对函数\(c\)的\(0\)到\(n-1\)次项倒序输出即可。时间复杂度\(O(n\logn)\)。#include......
  • Codeforces Round 997 (Div. 2) 题解(A~D 题)
    CodeforcesRound997(Div.2)题解(A~D题)A因为\(x,y<m\),所以每次必有重叠的长方形。且重叠部分长为\(m-x\),宽为\(m-y\),用总周长减去算重了的部分就行。注意处理第一个长方形的边界条件。B.FindthePermutation按照\(g_{i,j}\)的大小关系直接写cmp然后sort就......
  • 题解:CF140A New Year Table
    CF140ANewYearTable思路注意到题目中提到了大圆与小圆相切,我们可以计算由两条经过小圆周长与大圆圆心的切线组成的圆心角的度数。但是这个角度其实不好算,所以我们可以求出它一半的正弦值,也就是\(b\div(a-b)\),然后用asin函数求出其度数(以弧度为单位)。最后答案就是判断\(......
  • Desant 2 题解
    LibreOJ-3614Luogu-P9040很好的题。先不考虑区间,先想\(l=1,r=n\)的情况。考虑dp,\(f_i\)表示考虑\([l,r]\)的答案。则容易得到:\[f_i=\max\left\{f_{i-1},f_{i-k}+s_i-s_{i-k}\right\},f_0=0\]其中\(s\)为\(a\)的前缀和。这个转移本身是\(\Theta(n)\)的。遇......
  • [CF2048F] Kevin and Math Class 题解
    注意到这里有个区间的\(b_i\)最小。我们考虑每个\(b_i\)作为最小的时候各操作几次。显然每个\(b_i\)的【操作区间】更长是不劣的。于是这些个\(b_i\)是可以打成笛卡尔树,进行DP。想到这一点,DP便是不难的了。定义\(f_{i,j}\)为以\(i\)为根的子树内,最优操作后最大值......
  • 嵌入式杂谈——(问题解决三:嵌入式中的数据类型)
    列举1. 标准固定宽度整数类型这些类型定义在 <stdint.h> 头文件中,用于明确指定数据的位数,适合嵌入式系统中需要精确控制数据大小的场景。类型位数范围(有符号)范围(无符号)说明int8_t8-128到127-8位有符号整数uint8_t8-0到2558位无符号整数int16_t16-32,768到32,767-......
  • AcWing 98. 分形之城 题解
    题面link【题目描述】城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为Fractal的城市设想了这样的一个规划方案,如下图所示:当城区规模扩大之后,Fractal的解决方案是把和原来......
  • 信号与系统(郑君里)第一章-绪论 1-2 课后习题解答
    题目详情(1-2分别判断下列各函数式属于何种信号,即是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?其中各式中n为正整数)答案解析:(1)连续信号模拟信号(2)离散信号抽样信号(3)离散信号数字信号 该函数只取±1,所以为数字信号(4)离散信号抽样信号 该函数随着n的......
  • 信号与系统(郑君里)第一章-绪论 1-3 课后习题解答
    题目详情(分别求下列各周期信号的周期T。)答案解析:tips:本道题考察的是信号的周期性第(1)小题注意连续的找周期找出最小公倍数就可以了,不一定是要整数;第(2)小题注意指数是带有“j”的,如果没有“j”那就不是周期信号了;第(3)小题遇到平方形式第一时间想到用二倍角公式,可以使得形式......
  • 题解:AT_arc190_b [ARC190B] L Partition
    题目传送门很显然每次填完L之后所覆盖的图形为正方形,不然最最后无法填出正方形。现在假设我们已经确定了一个\(k\)阶的L,要求它的方案数。对于\([1,k-1]\)阶L的放法,每阶的\(4\)种方向都对应着一种方案,但\(1\)阶只有\(4\)种都是一样的,所以总方案数为\(4^{k-2}\)......