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

SMU Summer 2023 Contest Round 1

时间:2023-07-14 19:46:30浏览次数:55  
标签:Summer typedef const Contest int SMU long solve dp

SMU Summer 2023 Contest Round 1

A - The Contest

思路:求出最短解决问题总时间,在所有区间找出大于等于总时间的最短时刻。

#include<bits/stdc++.h>
using namespace std;
#define  int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;



void solve(){
    int n,m,s=0,ans=-1;cin>>n;
    for(int i=0,x;i<n;++i){
        cin>>x;s+=x;
    }
    cin>>m;
    for(int i=0,l,r;i<m;++i){
        cin>>l>>r;
        if(ans==-1&&r>=s)ans=max(l,s);
    }
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

B - The Golden Age

思路:记录所有unlucky year,找出[l,r]里最大长度的连续lucky year

#include<bits/stdc++.h>
using namespace std;
#define  int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e6+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;



void solve(){
    int x,y,l,r;
    int ans=0;
    cin>>x>>y>>l>>r;
    set<int>se;
    for(__int128 a=1;a<=(__int128)r;a*=(__int128)x)
        for(__int128 b=1;a+b<=(__int128)r;b*=(__int128)y)
            se.insert((int)(a+b));
    int last=l;
    for(auto i:se){
        if(i<l)continue;
        ans=max(ans,i-last);
        last=i+1;
    }
    ans=max(ans,r-last+1);
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

 

 C - The Tag Game

思路:求出Alice 和 Bob 到各个点的最短路,若disA[i]<disB[i]说明Alice可以比Bob先到达i点,那么B追上A的时间即为disB*2,遍历所有点求出最大的时间

#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=2e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;

vector<int>dis1,dix;
vector<int>ve[N];
void dfs(int u,int fa,vector<int>&dis){
    dis[u]=dis[fa]+1;
    for(auto v:ve[u]){
        if(v==fa)continue;
        dfs(v,u,dis);
    }
}
void solve(){
    int n,x;cin>>n>>x;
    dis1=vector<int>(n+1,0);
    dix=vector<int>(n+1,0);
    for(int i=2,u,v;i<=n;++i){
        cin>>u>>v;
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
    dfs(1,0,dis1);
    dfs(x,0,dix);
    int ans=0;
    for(int i=2;i<=n;++i){
        if(dix[i]<dis1[i]){
            ans=max(ans,dis1[i]*2);
        }
    }
    cout<<ans-2;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

D - Two Melodies

题意:给一个序列,选出两个不重复的子序列,两个子序列中满足相邻的元素差为1或同余7,且两个子序列长度和最大。

思路:dp[i][j]表示以i和j结尾的子序列的最大长度。

这里固定i,dp[i][j]的状态转移:dp[i][k]+1(k<j),a[k]是所有能和a[j]相邻的元素中的dp[i][k]值最大的一个。

              k为0时,

直接找到a[k]的方法:用maxn[j]表示前j个元素中最大的dp[i][j]的值,maxm[j%7]表示前j个元素中最大的dp[i][j%7]的值。

更新maxn,maxm:每转移一次dp[i][j],更新下当前的maxn[j],maxm[j]

#include<bits/stdc++.h>
using namespace std;
#define  int long long
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=5e3+5,M=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;
typedef long long ll;


int dp[N][N];
int maxn[M],maxm[10];
void solve(){
    int n,ans=0;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=0;i<=n;++i){
        memset(maxn,0,sizeof maxn);
        memset(maxm,0,sizeof maxm);
        for(int j=1;j<=i;++j){
            maxn[a[j]]=max(maxn[a[j]],dp[i][j]);
            maxm[a[j]%7]=max(maxm[a[j]%7],dp[i][j]);
        }
        for(int j=i+1;j<=n;++j){
            dp[i][j]=max(dp[i][j],dp[i][0]+1);
            dp[i][j]=max(dp[i][j],maxn[a[j]-1]+1);
            dp[i][j]=max(dp[i][j],maxn[a[j]+1]+1);
            dp[i][j]=max(dp[i][j],maxm[a[j]%7]+1);
            dp[j][i]=dp[i][j];
            maxm[a[j]%7]=max(maxm[a[j]%7],dp[i][j]);
            maxn[a[j]]=max(maxn[a[j]],dp[i][j]);
            ans=max(ans,dp[i][j]);
        }
    }
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
View Code

 

标签:Summer,typedef,const,Contest,int,SMU,long,solve,dp
From: https://www.cnblogs.com/bible-/p/17554343.html

相关文章

  • SMU Summer 2023 Contest Round 3
    A.CurriculumVitae题意:给出一串01序列,可以删除任意个元素,使得1后面没有0思路:枚举01分界点,使得统计前面0的个数和后面1的个数,取最大值。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inta[110];intmain(){ios::sync_with_stdio(0),cin.tie(0),co......
  • AtCoder Beginner Contest 294
    A-Filter#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn;cin>>n;for(intx;n;n--){cin>&......
  • AtCoder Beginner Contest 309 - D(最短路)
    目录D-AddOneEdge法一:dijkstra法二:BFS+队列题目传送门:abc309前面的简单题就不放了D-AddOneEdge题意:给你一个无向图图,分为两个连通块,一个顶点数为n1(1~n1),一个顶点数为n2(n1+1~n1+n2),图中共有m条边。如果现在在两个连通块之间连接一条边,那么顶点1与顶点n1+n2......
  • SMU Summer 2023 Contest Round 1
    A.TheContest题意:要做n道题,每道题花费时间a[i],但是只有几个时间段可以提交,问最早什么时间可以完成。思路:直接计算做完全部的题目所花费的时间,然后找到可以提交的时间段,和左端取最大值,就能得出结果。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constint......
  • 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......