首页 > 其他分享 >2022 China Collegiate Programming Contest (CCPC) Weihai Site EAJGCI

2022 China Collegiate Programming Contest (CCPC) Weihai Site EAJGCI

时间:2023-10-07 11:57:36浏览次数:42  
标签:Weihai int mi ll Contest Programming cin ++ vx

2022 China Collegiate Programming Contest (CCPC) Weihai Site

目录

VP概况

image
image
image

这场我一年之前做过,然后就没有去补题,今年重新和新队友们做做这场,开局还算顺利地过了两个签到,然后就是三道铜牌题,曾经一度卡题一个半小时,然后我做出了J,队友做出了数学和计算几何,在正赛算是可以拼手速拿到铜,但还不够,还要多多补题,其实VP的时候C可以写出来的,下蛋就真的不会了

E - Python Will be Faster than C++

模拟,存在 \(a_{n - 1} \geq a_n\) 无解,其余模拟即可

const int N = 1e7 + 20;
 
int a[N];
void solve()
{       
    int n, k;   cin>>n>>k;
    int i;
    for(i = 1; i <= n; i++)
        cin>>a[i];
    int cnt = 0;
    i = n;
    while(++cnt <= 1e7 && a[n - 1] >= a[n])
    {
        i++;
        a[i] = max(0, 2 * a[i - 1] - a[i - 2]);
        if(a[i] < k)
        {
            cout<<"Python 3."<<i<<" will be faster than C++\n";
            return;            
        }
    }
    cout<<"Python will never be faster than C++\n";
    return;
}

A - Dunai

记录每个位置有多少人,然后算出能组成多少支队伍,再和冠军选手取个min即可,赛时画了柱状图去理解

int n, m, c[10], b[10];
void solve()
{       
    cin>>n;
    set<string> S;
    for(int i = 1; i <= n * 5; i++)
    {
        string s;    cin>>s;
        S.insert(s);
    }
    cin>>m;
    for(int i = 1; i <= m; i++)
    {
        string s;    cin>>s;
        int a;  cin>>a;
        if(S.count(s))
            c[a]++;
        b[a]++;
    }
    int miv = min({b[1], b[2], b[3], b[4], b[5]});
    miv = min({miv, c[1] + c[2] + c[3] + c[4] + c[5]});
    cout<<miv<<'\n';
 
    return;
}

J - Eat, Sleep, Repeat

博弈,但是答案是求最多的操作次数的奇偶性相关

我的做法是对限制为0进行分段,这样就可以确定 \(a_i\) 最终会出现在哪一段内,对 a 排序,双指针去模拟这个过程

const int N = 3e5 + 20;
 
int a[N];
int n, k;
map<int, int> mp;
vector<int> vx;
set<int> S;
void solve()
{       
    mp.clear();
    vx.clear();
    S.clear();
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
 
    mp[-1] = 0;
    vx.push_back(-1);
    S.insert(-1);
 
    mp[1000000002] = 0;
    vx.push_back(1000000002);
    S.insert(1000000002);    
    for(int i = 1; i <= k; i++)
    {
        int x, y;   cin>>x>>y;
        mp[x] = y;
        if(y == 0)  
        {
            S.insert(x);
            vx.push_back(x);
        }
    }
    sort(a + 1, a + 1 + n);
    sort(vx.begin(), vx.end());
    int m = vx.size();
    queue<int> q[m + 2];
    for(auto it : vx)
    {
        int p = it + 1;
        for(int l = p; ; l++)
        {
            if(S.count(l))  break;
            if(mp.count(l) == 0)    
            {
                mp[l] = n;
                break;
            }
        }
    }
    for(int i = 1; i <= n; i++)
    {
        int pos = lower_bound(vx.begin(), vx.end(), a[i]) - vx.begin() - 1;
        q[pos].push(a[i]);
    }  
    ll res = 0;
    for(int i = 0; i < m; i++)
    {
        int p = vx[i] + 1;
        for(int l = p; ; l++)
        {
            while(mp[l] != 0 && !q[i].empty() && q[i].front() >= l)
            {
                mp[l]--;
                res += (q[i].front() - l);
                q[i].pop();
            }
            if(q[i].empty())
                break;
        }
    } 
    if(res % 2 == 1)
    {
        cout<<"Pico\n";
    }
    else
        cout<<"FuuFuu\n";
    return;
}

G - Grade 2

打表可以知道答案有循环节,求出这个循环节区间

typedef long long ll;
 
const int mod = 1e9 + 7;
const int N = 2e6 + 10;
 
ll mi = 1, s[N];
 
void init()
{
    ll x;   cin>>x;
    for(; mi <= x; mi *= 2);
    for(int i = 1; i <= mi; i++)
        s[i] = s[i - 1] + (__gcd(i * x ^ x, x) == 1);
}
 
void solve()
{       
    ll l, r;    cin>>l>>r;
    l--;
    ll res = r / mi * s[mi] + s[r % mi] - l / mi * s[mi] - s[l % mi];
    cout<<res<<'\n';
 
    return;
}
 
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int TC = 1;
    init();
    cin >> TC;    
    for(int tc = 1; tc <= TC; tc++)
    {
        //cout << "Case #" << tc << ": ";         
        solve();
    }
    return 0;
}

C - Grass

手玩数据可以知道,只要 5 个点不在一条直线上,那么答案一定存在,枚举这 5 个点谁做A点即可

证明看 官方题解

int n;
void solve()
{           
 
    cin>>n;
    vector<array<int, 2>> d; 
    for(int i = 1; i <= min(n, 4); i++)
    {
        int x, y;   cin>>x>>y;
        d.push_back({x, y});
    }
    bool ok = false;
    if(n > 4)
    {
        for(int i = 5; i <= n; i++)
        {
            int x, y;   cin>>x>>y;
            d.push_back({x, y});
            for(int j = 0; j < 5; j++)
            {
                set<array<int, 2>> S, a;
                for(int k = 0; k < 5; k++)
                {
                    if(j == k)  continue;
                    int tx = d[k][0] - d[j][0];
                    int ty = d[k][1] - d[j][1];
                    int g = __gcd(abs(tx), abs(ty));
                    tx /= g, ty /= g;
                    S.insert({tx, ty});
                }
                if(S.size() == 4 && ok == false)
                {
                    cout<<"YES\n";
                    cout<<d[j][0]<<" "<<d[j][1]<<'\n';
                    for(int k = 0; k < 5; k++)
                        if(j != k)
                            cout<<d[k][0]<<" "<<d[k][1]<<'\n';
                    ok = true;
                }
            }
            d.pop_back();
        }
    }
    if(!ok)
        cout<<"NO\n";
    return;
}

I - Dragon Bloodline

VP时没思路,认为是dp或者贪心,看了题解发现是贪心,也明白了贪心的正确性,对于每次贪心需要最多的元素,放生产效率最高的工具龙去生产

const int N = 2e5 + 10;
 
int n, k;
ll a[N], b[N], c[N], sb[N];
 
bool check(ll mid)
{
    priority_queue<ll, vector<ll>, less<ll>> q;
    for(int i = 1; i <= n; i++)
        q.push(a[i] * mid);
    for(int i = 0; i < k; i++)
        c[i] = b[i];
    int i = k - 1;
    while(q.size() >= 1)
    {
        ll t = q.top(); q.pop();
        if(i == -1) return false;
        ll need = max({1ll, t / (1 << i)});
        need = min(c[i], need);      
        t = t - need * (1 << i);
        c[i] = c[i] - need;
        if(t >= 1)
            q.push(t);
        if(c[i] == 0)
            i--;
    }
    return true;
}
void solve()
{       
    cin>>n>>k;
    ll l = 0, r = 0, t = 0;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
        t += a[i];
    }
 
    for(int i = 0; i < k; i++)
    {
        cin>>b[i];
        sb[i] = b[i] * (1 << i);
        r += sb[i];
    }
    r /= t;
    while(l < r)
    {
        ll mid = (l + r + 1) >> 1;
        if(check(mid))    l = mid;
        else r = mid - 1;
    }
    cout<<l<<'\n';
    return;
}

标签:Weihai,int,mi,ll,Contest,Programming,cin,++,vx
From: https://www.cnblogs.com/magicat/p/17745941.html

相关文章

  • 2022-2023 ICPC Central Europe Regional Contest
    The1stUniversalCup.Stage8:SloveniaD.Deforestation这道题出题人比较谜语人,对于一个分叉点,只能选择若干个儿子和父亲组成一组,剩下的儿子之间不能相互组合。所以从叶子节点开始贪心处理就好。对于一个父亲他有若干个儿子,就贪心的选择剩下部分更小的儿子。#include<bits......
  • The 2021 ICPC Asia Macau Regional Contest
    A.SoI'llMaxOutMyConstructiveAlgorithmSkills首先一行正一行反的把所有的行拼到一起,然后判断一下正着走时候合法不合法就反过来走就好。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;voidsolve(){intn;......
  • The 2022 ICPC Asia Jinan Regional Contest
    A.Tower首先用了dp验证出把一个数字变成另一个数字的最优解一定是能除就先进行除法,然后再使用加一减一。这样我们就有\(O(\logn)\)的复杂度求出把一个数变成另一个数的最小代价。然后就是猜测最终的目标一定是某个数除了若干次二得到的。所以就枚举一下目标即可。#include......
  • The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online (The 2nd Universal Cup
    The2018ACM-ICPCAsiaQingdaoRegionalContest,Online(The2ndUniversalCup.Stage1:Qingdao)J-PresstheButton\(1\leqa,b,c,d\leq10^6\)题解容易发现存在循环节,每次位于\(gcd(a,c)\)的倍数的位置所以我们考虑处理一个循环节内的情况如果\(v\le......
  • AtCoder Grand Contest 036 F Square Constraints
    洛谷传送门AtCoder传送门本质是\(p_i\in[l_i,r_i]\)的计数问题。当\(1\lei\len\)时,\(l_i\)才可能不等于\(1\)。考虑容斥,设钦定\(m\)个不满足条件(上界为\(l_i-1\)),其余任意(上界为\(r_i\))。然后按照上界排序后dp,设\(f_{i,j}\)为考虑前\(i\)个元素,已经......
  • 2017 China Collegiate Programming Contest Final (CCPC-Final 2017)
    Preface今天打学校统一要求的这场CCPC2017Final,直接被打爆了,各种数学题搞得人生活不能自理主要是H徐神开场就秒出了正确的思路,然后一心认准高斯消元然后一直想+写+调到结束都没卡过去比赛最后20min的时候祁神想到了更好写的基于施密特正交化的方法,可以碍于时间有限没调出来不......
  • AtCoder Beginner Contest 288 Ex A Nameless Counting Problem
    洛谷传送门AtCoder传送门考虑到规定单调不降比较难搞。先设\(g_t\)为长度为\(t\)的满足条件的序列个数(可重且有顺序)。求这个可以设个dp,\(f_{d,i}\)表示考虑到从高到低第\(d\)位,当前\(t\)个数中有\(i\)个仍然顶上界,并且之前的位都满足异或分别等于\(X\)的限制。......
  • C++模板元编程(C++ template metaprogramming)
    实验平台:Win7,VS2013Community,GCC4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++模板给C++语言提供了元编程的能力,模板使C++编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文)。普通用户对C++模板的使用可能不是很......
  • AtCoder Grand Contest 056 D Subset Sum Game
    洛谷传送门AtCoder传送门考虑若\(n\)是奇数怎么做。枚举Alice第一次选的数\(a_i\),然后考虑把剩下的数两两结成一个匹配,若Bob选了其中一个,Alice就选另一个。容易发现排序后奇数位和它右边的偶数位匹配最优。那么设奇数位的和为\(A\),偶数位的和为\(B\),此时Alice获胜......
  • AtCoder Beginner Contest 178 E
    AtCoderBeginnerContest178EE-DistMax曼哈顿距离最大点对\(ans=max(|x_i-x_j|+|y_i-y_j|)\)考虑去绝对值,4种情况。sort一下取max即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10;intx[N],y[N];intp[4][N];......