首页 > 其他分享 >The 2022 ICPC Asia Xi'an Regional Contest

The 2022 ICPC Asia Xi'an Regional Contest

时间:2023-09-30 10:44:06浏览次数:30  
标签:Xi return Contest int Regional cin hashv c2 c1

C. Clone Ranran

最优解一定是先复制,在做题。最多只需要复制大约 30 次,直接枚举即可

#include <bits/stdc++.h>

using namespace std;

#define int long long

int a , b, c;

void solve(){
    cin >> a >> b >> c;
    int res = LLONG_MAX;
    for( int i = 0 , t = 1 ; i < 31 ; i ++ , t *= 2 )
        res = min(res , a * i + (c + t  -1) / t * b);
    cout << res << "\n";
}

int32_t main(){
    int T;
    for( cin >> T ; T ; T -- )
        solve();
}

E. Find Maximum

所谓的\(f\)函数实际上就是把\(x\)转为三进制,三进制的长度加每一位数字之和。

所以最大值,一定长度和\(r\)相同,然后我们枚举\(r\)的每一位,把当前位减一,后面的位全部变成二。这样取最大值即可,同时要保证操作后的数字大于\(l\)

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int inf = 1e18;

using vi = vector<int>;

unordered_map<int, int> g;

int f(int x) {
    if (g[x] != 0) return g[x];
    if (x % 3 == 0) return g[x] = f(x / 3) + 1;
    else return g[x] = f(x - x % 3) + x % 3;
}

void solve() {
    int l, r;
    cin >> l >> r;

    vector<int> a;

    for (int x = r; x; x /= 3) a.push_back(x % 3);
    std::reverse(a.begin(), a.end());
    int res = a.size() + accumulate(a.begin(), a.end(), 0ll);

    vector<int> b;
    for (int x = l; x; x /= 3) b.push_back(x % 3);
    while( b.size() < a.size() ) b.push_back(0);
    std::reverse(b.begin(), b.end());

    for (int i = 0; i < a.size(); i++) {
        auto c = a;
        if( c[i] == 0 ) continue;
        c[i] --;
        for( int j = i + 1 ; j < a.size() ; j ++ ) c[j] = 2;
        if( c < b ) continue;
        res = max( res , (int)c.size() + accumulate( c.begin(), c.end() , 0ll ) - (c.front() == 0) );
    }
    cout << res << "\n";
    return;
}


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int t;
    g[0] = 1;
    for (cin >> t; t; t--)
        solve();

    return 0;
}

F. Hotel

根据性别数量,可以判断出住房的方案,在多个方案中取最优解即可。

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main(){
    ios::sync_with_stdio(false) , cin.tie(nullptr);
    int n , c1 , c2 , res = 0;
    cin >> n >> c1 >> c2;
    string s;
    for( int i = 1 , cnt ; i <= n ; i ++ ){
        set<char> sex;
        cin >> s;
        for( auto c : s ) sex.insert( c );
        cnt = min( 3 * c1 , 3 * c2 );
        if( sex.size() < 3 ){
            cnt = min( { cnt , c1 + c2 , c2 + c2 });
        }
        res += cnt;
    }
    cout << res << "\n";
    return 0;
}

G. Perfect Word

字符串哈希,然后枚举子串,判断子串是否存在即可。

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define mp make_pair
using hashv = pair<int, int>;

const hashv mod = mp(1e9 + 7, 998244353);
const hashv base = mp(13331, 23333);

hashv operator+(hashv a, hashv b) {
    int c1 = a.first + b.first, c2 = a.second + b.second;
    if (c1 >= mod.first) c1 -= mod.first;
    if (c2 >= mod.second) c2 -= mod.second;
    return mp(c1, c2);
}

hashv operator-(hashv a, hashv b) {
    int c1 = a.first - b.first, c2 = a.second - b.second;
    if (c1 < 0) c1 += mod.first;
    if (c2 < 0) c2 += mod.second;
    return mp(c1, c2);
}

hashv operator*(hashv a, hashv b) {
    return mp(a.first * b.first % mod.first, a.second * b.second % mod.second);
}

const int N = 1e5 + 5;
vector<hashv> p(N);

void hashStr(const string &s, vector<hashv> &v) {
    v.resize(s.size() + 1);
    for (int i = 1; i <= s.size(); i++)
        v[i] = v[i - 1] * base + mp(s[i - 1], s[i - 1]);
    return;
}

hashv getHash(int l, int r, const vector<hashv> &v) {
    if (l > r) return mp(0, 0);
    return v[r] - v[l - 1] * p[r - l + 1];
}

void init() {
    p[0] = mp(1, 1);
    for (int i = 1; i < N; i++)
        p[i] = p[i - 1] * base;
}


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    init();
    int n;
    cin >> n;
    vector<string> s(n);
    vector<vector<hashv>> hv(n);
    for (auto &i: s) cin >> i;
    set<hashv> vis;
    for (int i = 0; i < n; i++)
        hashStr(s[i], hv[i]), vis.insert(hv[i].back());
    int res = 0;
    for (int i = 0, len, f; i < n; i++) {
        len = s[i].size(), f = 1;
        if (len <= res) continue;
        for (int l = 1; f and l <= len; l++)
            for (int r = l; f and r <= len; r++)
                if (vis.count(getHash(l, r, hv[i])) == 0) f = 0;
        if (f) res = len;
    }
    cout << res << "\n";
    return 0;
}

J. Strange Sum

\(i\)取\(n\),即找最大的两个值

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main(){
    ios::sync_with_stdio(false) , cin.tie(nullptr);
    int n;
    cin >> n;
    vector<int> a(n);
    for( auto &i : a ) cin >> i;
    sort( a.begin() , a.end() , greater<int>() );
    cout << max( { 0ll , a[0] , a[0] + a[1] } );
}

L. Tree

题目相当于用最少的链和反链数量覆盖一棵有根树。

如果一个点被反链覆盖,但它的儿子没有被反链覆盖,因为必然存在一条链经过它的儿子,所以必然存在一条链经过它,将覆盖该点的反链调整为覆盖它的儿子,答案不会变劣。

因此,每添加一条反链,都相当于剥去当前树上的所有叶子。设 \(f_i\) 表示 \(i\) 的子树内最深的叶子与 \(i\) 的距离,这里距离定义为简单路径上的点数,容易证明 \(i\) 会被第 \(f_i\) 条反链覆盖。

假设我们不再添加反链,则每个叶子至少对应一条链,且每条链可以覆盖至少一个叶子,所以需要的链的数量为叶子数量。

如果我们用了 \(j - 1\) 条反链,那么 \(f_i = j\) 的节点 \(i\) 会裸露成叶子。因此,设 \(cnt_j\) 表示 \(f_i = j\) 的 \(i\) 的数量,则 \(\min\limits_{j = 1} ^ n cnt_j + j - 1\) 即为所求。时间复杂度 \(\mathcal{O}(n)\)。

#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;


void solve() {
    int n;
    cin >> n;
    vector<vi> e(n + 1);
    vi dis(n + 1, 0);
    for (int i = 2, x; i <= n; i++)
        cin >> x, e[x].push_back(i);

    auto dfs = [e, &dis](auto &&self, int x) -> void {
        for (auto y: e[x])
            self(self, y), dis[x] = max(dis[x], dis[y] + 1);
        return;
    };
    dfs(dfs, 1);

    vi cnt(dis[1] + 1);
    for (int i = 1; i <= n; i++)
        cnt[dis[i]]++;
    int res = INT_MAX;
    for (int i = 0; i <= dis[1]; i++)
        res = min(res, i + cnt[i]);
    cout << res << "\n";
}

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int TC;
    for (cin >> TC; TC; TC--)
        solve();
    return 0;
}

标签:Xi,return,Contest,int,Regional,cin,hashv,c2,c1
From: https://www.cnblogs.com/PHarr/p/17737665.html

相关文章

  • mlpack is an intuitive, fast, and flexible header-only C++ machine learning libr
    https://github.com/mlpack/mlpack README.md afast,header-onlymachinelearninglibraryHome | Documentation | Community | Help | IRCChat   Download: currentstableversion(4.2.1)mlpack isanintuitive,fast,andflexibleheader-......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite
    Preface久违地VP一场,由于CCPC桂林在即因此最近就自主VP一下去年的CCPC这场打的时候全队不在状态,签完到后我就因为A题一个cornercase没考虑到卡了快两个小时然后好不容易搞过去徐神上来有狂WAE题,最后也是喜提+11后面写的D题也是需要特判,好家伙又是快到比赛结束才看出来最后......
  • [CF762D] Maximum path 题解
    [CF762D]Maximumpath题解想法首先考虑问题的弱化版,如果不能往左走,能取到的最大值是多少。这个问题可以用一个显然的DP解决,\(f_{i,j}\)表示走到第\(i\)列,第\(j\)行,并且不会再访问这一列其它的方格,能取到的最大值。转移可以从三个方向考虑,以\(f_{i,1}\)为例,黑色是当......
  • Gym 104270 The 2018 ICPC Asia Qingdao Regional Programming Contest (The 1st Univ
    A.SequenceandSequenceB.KawaExam可以发现,对答案会产生影响的只有割边,把所有边双缩起来,然后就是一个森林。考虑一个树的时候怎么做,就是对于每条边求出这条边两端的众数个数,考虑线段树合并,每次动态维护子树内的众数和子树外的众数。#include<iostream>#include<cstdio>......
  • esxi上使用esxcli命令设置:虚拟交换机、端口组、vlan、物理接口
    创建虚拟交换机esxclinetworkvswitchstandardadd--vswitch-name=vSwitch2创建端口组esxclinetworkvswitchstandardportgroupadd--portgroup-name=VLAN3999--vswitch-name=vSwitch2设置端口组vlan号esxclinetworkvswitchstandardportgroupset-pVLAN3999--vlan-......
  • postgresql xid回卷预防及排查
    监控WITHmax_ageAS(SELECT2000000000asmax_old_xid,settingASautovacuum_freeze_max_ageFROMpg_catalog.pg_settingsWHEREname='autovacuum_freeze_max_age'),per_database_statsAS(SELECTdatname......
  • AtCoder Regular Contest 123 F Insert Addition
    洛谷传送门AtCoder传送门用\((x,y)\)表示\(Ax+By\),那么这个等价于SB树。那么直接在SB树上二分,遍历一遍找到\(n\)个点就好了。可以采用类似线段树查询的方式。于是现在还剩下一个子问题:给定\(a,b\),求\(ax+by\len\)且\(\gcd(x,y)=1\)的正整数\((x,y......
  • qoj6735. Tree (The 1st Universal Cup. Stage 22: Shaanxi)
    https://qoj.ac/contest/1287/problem/6735考虑定一个根,然后把每个点的点权附属在父边权上,让每条边的边权变成一个pair。这样,一个符合条件的路径需要满足的条件是:路径内所有边的边权pair相同,以及路径根节点(lca)的颜色符合。对于当前树上每个边权相同的连通块分开考虑。对......
  • vmare平台上esxi主机,搭建虚拟机ping不通网关
    环境描述:虚拟化平台:vmare5.5物理机系统:esxi虚拟机:centos7.5交换机2台:锐捷和华为机柜位置–》上面的交换机是华为的26机柜1台物理机ip10.1.1.1机柜位置–》上面的交换机是锐捷的12机柜3台物理机IP10.1.1.210.1.1.310.1.1.4物理机插了2个网线,a网线是物理机-管理网10.1.1.......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite GCHMAD
    2022ChinaCollegiateProgrammingContest(CCPC)MianyangOnsite目录2022ChinaCollegiateProgrammingContest(CCPC)MianyangOnsiteVP情况G-LetThemEatCakeC-CatchYouCatchMeH-LifeisHardandUndecidable,but...M-Rock-Paper-ScissorsPyramidA-......