首页 > 其他分享 >Atcoder ABC321 笔记

Atcoder ABC321 笔记

时间:2023-09-27 19:25:45浏览次数:36  
标签:Atcoder cout int REP cin 笔记 color ABC321 ll

A - 321-like Checker \(\color{gray}{22}\)

直接模拟

void solve() {
    int n;
    cin >> n;
    int lst = -1;
    for(int i = n; i; i /= 10) {
        int u = i % 10;
        if(u <= lst) {
            cout << "No" << endl;
            return;
        }
        lst = u;
    }
    cout << "Yes" << endl;
}

B - Cutoff \(\color{gray}{220}\)

直接枚举分数,时间复杂度 \(O(n^2\log n)\)

void solve() {
    int n, x;
    cin >> n >> x;
    vector<int> a(n), b;
    REP(i, n - 1) cin >> a[i];
    FOR(i, 0, 100) {
        b = a;
        b[n - 1] = i;
        sort(ALL(b));
        int s = 0;
        FOR(i, 1, n - 2) s += b[i];
        if(s >= x) {
            cout << i << endl;
            return;
        }
    }
    cout << -1 << endl;
}

C - 321-like Searcher \(\color{brown}{591}\)

符合条件的数比较少,直接模拟。

void solve() {
    int k;
    cin >> k;
    vector<ll> a;
    REP(i, 1 << 10) {
        ll res = 0;
        ROF(j, 9, 0) {
            if(i >> j & 1) {
                res = res * 10 + j;
            }
        }
        a.push_back(res);
    }
    sort(ALL(a));
    cout << a[k + 1] << endl;
}

D - Set Menu \(\color{green}{806}\)

对于每一个数,会有可以直接加的和封顶的,
二分这个边界即可。

void solve() {
    int n, m, p;
    cin >> n >> m >> p;
    vector<int> a(n), b(m);
    REP(i, n) cin >> a[i];
    REP(i, m) cin >> b[i];
    sort(ALL(a));
    vector<ll> s(n + 1);
    FOR(i, 0, n - 1) s[i + 1] = a[i] + s[i];
    ll ans = 0;
    REP(i, m) {
        int u = lower_bound(ALL(a), p - b[i]) - BG(a);
        ans += s[u];
        ans += 1ll * u * b[i];
        ans += 1ll * p * (n - u);
    }
    cout << ans << endl;
}

E - Complete Binary Tree \(\color{blue}{1627}\)

枚举 lca,再二分距离为 \(k\) 的节点个数。

ll n, x, k;
ll calc(ll u, ll k) {
    if(u > n || k < 0) return 0;
    ll l = u, r = u;
    while(k--) {
        l <<= 1;
        r <<= 1; r |= 1;
        if(l > n) return 0;
    }
    if(r <= n) return r - l + 1;
    else return n - l + 1;
}
void solve() {
    cin >> n >> x >> k;
    ll lst = LINF << 1, ans = 0;
    while(x) {
        ans += calc(x, k);
        ans -= calc(lst, k - 1);
        k--;
        lst = x;
        x >>= 1;
    }    
    cout << ans << endl;
}

F - #(subset sum = K) with Add and Erase \(\color{blue}{1645}\)

第一种就是基本的背包
第二种直接倒过来操作即可

const int N = 5e3 + 5;
int q, k;
int f[N];
void solve() {
    cin >> q >> k;
    f[0] = 1;
    REP(ii, q) {
        string opt;
        int x;
        cin >> opt >> x;
        if(opt == "+") {
            ROF(i, N - 1, x) {
                f[i] = (f[i] + f[i - x]) % P;
            }
        }
        else {
            FOR(i, x, N - 1) {
                f[i] = (f[i] - f[i - x] + P) % P;
            }
        }
        cout << f[k] << endl;
    }
}

G - Electric Circuit \(\color{orange}{2439}\)

状压枚举不和其它点有连边的点集,
但是点集连变方案中有重复的,
需要枚举子集进行去重。

const int N = 17;
const int M = 1 << 17;
int n, m, ru[N], ch[N];
int sr[M], sc[M];
mint f[M], g[M], ans;
void solve() {
    cin >> n >> m;
    REP(i, m) {
        int x; cin >> x; x--;
        ru[x]++;
    }
    REP(i, m) {
        int x; cin >> x; x--;
        ch[x]++;
    }
    comb.init(m);
    FOR(i, 1, (1 << n) - 1) {
        REP(j, n) {
            if(i & (1 << j)) {
                sr[i] += ru[j];
                sc[i] += ch[j];
            }
        }
        if(sr[i] != sc[i]) continue;
        f[i] = g[i] = comb.fac[sr[i]];
        for(int j = i; j; j = (j - 1) & i) {
            if(j & (-i & i)) {
                f[i] -= f[j] * g[i ^ j];
            }
        }
        ans += f[i] * comb.fac[m - sr[i]];
    }
    cout << ans / comb.fac[m] << endl;
}

标签:Atcoder,cout,int,REP,cin,笔记,color,ABC321,ll
From: https://www.cnblogs.com/kevinlikescoding/p/17725981.html

相关文章

  • ACAM 学习笔记 | 附 YbtOJ 全部题解
    怎么有人现在才学ACAM呢。好像比SAM简单挺多啊,也不记得当时是哪里看不懂。AC自动机(✔)自动AC机(✘)概述ACAM(Aho–CorasickAutomaton),是用来解决多模式串匹配的字符串算法。它的结构是个DAG,其中点表示状态,边表示转移。这一点上各种自动机都是相同的。具体来说,可以感性......
  • AtCoder Grand Contest 025
    A-DigitsSum按题意模拟即可。#include<iostream>#include<cstdio>usingnamespacestd;constintINF=1061109567;intn;intcalc(intx){intres=0;while(x)res+=x%10,x/=10;returnres;}intmain(){scanf("%d",&......
  • AtCoder Grand Contest 026
    A-ColorfulSlimes2可以发现,对于连续的一段长度为\(m\)的相同的字符,我们可以花费\(\lfloor\frac{m}{2}\rfloor\)的代价将它改为符合要求的。#include<iostream>#include<cstdio>usingnamespacestd;constintN=105;intn;inta[N];intmain(){scanf("%d"......
  • AtCoder Grand Contest 022
    A-DiverseWord如果至少有一个字符没有出现过,只要在原字符串后面加入一个没有出现过的字符中最小的那个字符就好了。如果所有字符都出现过,找到一个尽量靠后的位置\(i\in[1,n)\),使得\(s_i\lts_{i+1}\),最优字符串将\(s_i\)换成\([i+1,n]\)里面比\(s_i\)大的最小的那个......
  • AtCoder Grand Contest 023
    A-Zero-SumRanges令\(s_n=\sum\limits_{i=1}^na_i\),相当于找满足\(l\ler,s_r-s_{l-1}\)的点对\((l,r)\)的个数,直接搞就完事了。#include<iostream>#include<cstdio>#include<unordered_map>usingnamespacestd;constintN=200005;intn;inta[N]......
  • AtCoder Grand Contest 024
    A-Fairness每次操作后\(a_i-b_i=b_{i-1}-a_{i-1}\),对\(k\)的奇偶性讨论一下即可。#include<iostream>#include<cstdio>usingnamespacestd;inta,b,c;longlongk;intmain(){scanf("%d%d%d%lld",&a,&b,&c,&k);if(k%2==0)......
  • AtCoder Grand Contest 021
    A-DigitSum2要么是\(n\)要么是\(n\)的第一位后面加上若干个\(9\)。#include<iostream>#include<cstdio>#include<cmath>usingnamespacestd;longlongn;intcalc(longlongx){if(x==0)return0;intsum=0;while(x)sum+=x......
  • AtCoder Regular Contest 102
    C-TriangularRelationship枚举\(a\bmodk\)的值,\(b\bmodk,c\bmodk\)的值也就确定了,算下贡献就好了。#include<iostream>#include<cstdio>usingnamespacestd;intn,k;intmain(){ scanf("%d%d",&n,&k); longlongans=0; for(inta=0;......
  • AtCoder Regular Contest 103
    C-////如果奇数和偶数出现的颜色的最大值相同一边取最大值和一边取次大值,否则两边都选最大值即可。#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;constintN=100005;intn,m;intv[N];intc[N];intmain(){ scanf("%d",&n); for(in......
  • openGauss学习笔记-82 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用准
    openGauss学习笔记-82openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT使用准备前提条件以下是使用openGaussMOT的软硬件前提条件。82.1硬件支持MOT支持最新硬件和现有硬件平台,支持x86架构和华为鲲鹏Arm架构。MOT与openGauss数据库支持的硬件完全对齐。更多信息请参......