首页 > 其他分享 >SMU Summer 2023 Contest Round 1

SMU Summer 2023 Contest Round 1

时间:2023-07-14 15:24:05浏览次数:38  
标签:Summer lena Contest int SMU Alice step1 Bob 步数

A. The Contest

题意:要做n道题,每道题花费时间a[i],但是只有几个时间段可以提交,问最早什么时间可以完成。

思路:直接计算做完全部的题目所花费的时间,然后找到可以提交的时间段,和左端取最大值,就能得出结果。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
 
const int N = 1e5;
int a,sum;
pair<int,int>p[N];
 
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a,sum+=a;
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>p[i].first>>p[i].second;
        if(sum<=p[i].second){
            cout<<max(p[i].first,sum)<<'\n';
            return 0;
        }
    }
    cout<<-1<<'\n';
    return 0;
}

B. The Golden Age

题意:n = ax + by,n为不幸年份,在l到r年份最长的连续幸运年份多长
思路:直接枚举x,y,求出所有不幸年份,再作差,注意要用 while ( r / x >= a[lena-1]),而不是while(r>=a[lena-1]*x) 这样会超出long long的范围。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100;
vector <LL> v;
LL a[N], b[N];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    LL x, y, l, r, lena, lenb;
    cin >> x >> y >> l >> r;
    a[0] = b[0] = 1;
    lena = lenb = 1;

    while ( r / x >= a[lena-1])
    {
        a[lena] = a[lena-1] * x;
        lena++;
    }
    while ( r / y >= b[lenb-1] )
    {
        b[lenb] = b[lenb-1] * y;
        lenb++;
    }
    v.clear();

    for (int i = 0; i < lena; i++)
        for (int j = 0; j < lenb; j++)
            if (a[i] + b[j] >= l && a[i] + b[j] <= r)
                v.push_back( a[i] + b[j] );
    sort (v.begin(), v.end());
    LL ans = 0;
    if (!v.size()) ans = r - l + 1;
    else
    {
        ans = max(v[0] - l, r - v[v.size() - 1]);
        for (int i = 1; i < v.size(); i++)
            ans = max(ans, v[i] - v[i - 1] - 1);
    }
    cout << ans << endl;


    return 0;
}

C. The Tag Game

题意:Alice 和 Bob 玩游戏,在一棵树上,Alice 在1节点,Bob在x节点上,Alice追上Bob游戏结束,Alice要让这段过程的步数尽可能的短, Bob 要让这一过程的步数尽可能的长,他们每一步可以选择移动一个节点,或者原地不动,求这段过程的步数是多少?

思路:既然Bob想让步数尽可能大,那么可以让Bob先手,Bob无路可走时就原地不动等待Alice追上他,当Alice追上Bob时,总步数就是Alice步数的两倍,并且当Alice追上Bob时,Alice经过的节点数一定大于Bob。可以用两次DFS求出两人到树上任意一点的步数step1,step2,再枚举每一点,当step2>step1时,求2*step1的最值,得出结果。

点击查看代码
#include <bits/stdc++.h>
#define N 200005
using namespace std;
int vis1[N],vis2[N];
vector<int> p[N];
int step1[N],step2[N]; //记录到某个点的步数
 
void dfs1(int x,int count){
    step1[x]=count;
    vis1[x]=1;
    for(int i=0;i<p[x].size();i++){
        if(vis1[p[x][i]]==0){
            count++;
            dfs1(p[x][i],count);
            count--;
        }
    }
    return ;
}
void dfs2(int x,int count){
    step2[x]=count;
    vis2[x]=1;
    for(int i=0;i<p[x].size();i++){
        if(vis2[p[x][i]]==0){
            count++;
            dfs2(p[x][i],count);
            count--;              //步数回溯
        }
    }
    return ;
}
 
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,x,a,b;
    cin>>n>>x;
    for(int i=0;i<n-1;i++){
        cin>>a>>b;
        p[a].push_back(b);
        p[b].push_back(a);
    }
    dfs1(1,0); dfs2(x,0);
    int sum=0;
    for(int i=1;i<=n;i++){
        if(step1[i]>step2[i])  //找step1[i]>step2[i],枚举相遇的点
            sum=max(sum,2*step1[i]);
    }
    cout<<sum<<endl;
    return 0;
}

D. Two Melodies待更新
E. Army Creation难度过高,暂不更新
F. Bipartite Checking难度过高,暂不更新

标签:Summer,lena,Contest,int,SMU,Alice,step1,Bob,步数
From: https://www.cnblogs.com/kingqiao/p/17553773.html

相关文章

  • AtCoder Beginner Contest 162
    AtCoderBeginnerContest162ABCD全暴力E数学题看不懂,感性理解F线性dp,非常基础我不会,寄E-SumofgcdofTuples(Hard)看了题解发现好多做法都是推一堆式子,我实在看不懂(卷积莫反啥啥的呜呜呜)然后看见这个感觉比较好感性理解:(来自洛谷题解)#include<bits/stdc++.h>#def......
  • Atcoder Regular Contest 114 F - Permutation Division
    显然分成\(k\)段以后,最大化形成的排列的字典序的策略是将所有段按第一个元素的大小降序排列。由于最终排列的字典序肯定\(\ge\)原排列的字典序,因此我们考虑最大化最终排列与原排列的LCP,这部分就考虑二分答案,记\(dp_i\)表示以\(p_1\)开始\(p_i\)结尾的LDS的长度,那么......
  • AtCoder Regular Contest 164 A~C
    A题都没做出来(被自已菜晕A.TernaryDecompositionA-TernaryDecomposition(atcoder.jp)题意给定一个正整数\(N\),问是否存在\(K\)个整数,使得\(N=3^{m_1}+3^{m_2}+...+3^{m_k}\)思路首先对于一个正整数\(N\),最多有\(N\)个整数使得正式成立,即\(m_i\)全为0。再对\(N\)进行三......
  • SMU Summer 2023 Contest Round 3
    SMUSummer2023ContestRound3A.CurriculumVitae题意就是要求\(1\)后面不能有\(0\)的情况下的子序列最长长度,也就是求一个最长不下降子序列,不过由于这是个\(01\)序列,也可以分别做一个前缀和求出\(0\)的数量,后缀和求\(1\)的数量,最后跑一遍循环,找一个最大值即可,这里......
  • 【DP】DMOPC '21 Contest 8 P5 - Tree Building
    ProblemLink给定\(n,m\)和一个长为\(m\)的代价序列,对于一棵\(n\)个节点,每个节点度数不超过\(m\)的树,定义它的代价为\(\sum\limits_{i=1}^na_{deg_i}\)。求代价最小的树的代价。\(n\le10^9,m\le3000,1\lea_i\le10^9\)。首先一眼变成选出\(n\)个\(a\)的和为......
  • AtCoder Beginner Contest 161
    AtCoderBeginnerContest161https://atcoder.jp/contests/abc161这套不算难,但是sb我还是写不出来是为什么呢F是个妙妙题C-ReplacingIntegerWA了一次所以放上来#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){lla,b;c......
  • AtCoder Grand Contest 012 D Colorful Balls
    洛谷传送门AtCoder传送门不错的题。bxEnder32k。我们发现交换有传递性,那么我们能交换就连边,答案是\(\prod\frac{(sz)!}{\prodc_i!}\),其中\(sz\)为连通块大小,\(c_i\)为这个连通块中第\(i\)种颜色出现次数。于是我们得到了一个\(O(n^2)\)的做法。发现很多遍是无用的......
  • UESTC 2023 Summer Training #02 Div.2
    Preface都给我丑完了这怎么办啊,被血虐了苦路西这场本来前面感觉都还可以,但是当中期看了眼C的题意后准备开C后就不对劲了起来最后1h扔掉一直T的C题去做H,结果因为被卡自然溢出的Hash一直挂到比赛结束,直接红温感觉这场策略问题挺大的,比如没有跟榜去写更加简单的E题(比赛的时候题......
  • AtCoder Regular Contest 164 E Segment-Tree Optimization
    洛谷传送门AtCoder传送门妙妙题。我们考虑如何方便地描述一棵广义线段树。不难想到使用断点描述,即对于一个结点\([l,r]\),它的左右儿子分别是\([l,mid],[mid+1,r]\),其中\(mid\in[l,r-1]\),然后把一层缩成一个\(2^{d-1}\)的序列,每一层都是上层对应结点的\(mid......
  • AtCoder Beginner Contest 309 G Ban Permutation
    洛谷传送门AtCoder传送门前置知识:[ARC132C]AlmostSorted看\(\geX\)不顺眼,怎么办呢!直接容斥!钦定\(j\)个位置满足\(|P_i-i|<X\),其余任意,就转化成了[ARC132C]AlmostSorted。具体一点就是,你设\(f_{i,j,S}\)表示前\(i\)位有\(j\)个位置满足\(|P_i-i|<......