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

SMU Summer 2023 Contest Round 2

时间:2023-07-14 19:46:38浏览次数:47  
标签:Summer typedef const ve Contest int SMU stk while

SMU Summer 2023 Contest Round 2

A - Treasure Hunt

思路:判断 Δx 和 Δy 能否分别整除 x 和 y ,求出需要的步数,两者的步数须同奇或同偶

#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=100+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;



void solve(){
    int x1,y1,x2,y2,x,y;
    cin>>x1>>y1>>x2>>y2>>x>>y;
    int dd1=abs(x2-x1),dd2=abs(y2-y1);
    int a,b;a=b=INF;
    if(dd1==0)a=0;
    else if(dd1%x==0)a=dd1/x;
    if(dd2==0)b=0;
    else if(dd2%y==0)b=dd2/y;
    if(a==INF||b==INF){
        cout<<"NO";return;
    }
    if(a==0){
        if(b%2)cout<<"NO";
        else cout<<"YES";
        return ;
    }
    if(b==0){
        if(a%2)cout<<"NO";
        else cout<<"YES";
        return ;
    }
    if((abs(a-b))%2==0){
        cout<<"YES";return ;
    }
    cout<<"NO";return;
}
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 - Makes And The Product

思路:对序列排序, ( i, 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=100+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;



void solve(){
    int n;
    vector<int>ve;
    map<int,int>mp;
    cin>>n;
    for(int i=0,x;i<n;++i){
        cin>>x;
        ve.push_back(x);mp[x]++;
    }
    sort(ve.begin(),ve.end());
    if(ve[0]==ve[1]&&ve[1]==ve[2]){
        int c=mp[ve[0]];
        cout<<c*(c-1)*(c-2)/2/3;return ;
    }
    if(ve[0]!=ve[1]&&ve[1]!=ve[2]){
        cout<<mp[ve[0]]*mp[ve[1]]*mp[ve[2]];return;
    }
    if(ve[0]!=ve[1]&&ve[1]==ve[2]){
        cout<<mp[ve[0]]*mp[ve[2]]*(mp[ve[2]]-1)/2;return;
    }
    if(ve[0]==ve[1]&&ve[1]!=ve[2]){
        int c=mp[ve[0]];
        cout<<c*(c-1)/2*mp[ve[2]];return ;
    }
}
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 - Really Big Numbers

思路:f[i]表示每个数转换后的值,可以看出f[i]是递增的,二分求出大于s的即可

#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=100+5,INF=0x3f3f3f3f,Mod=1e9+7;
const double eps=1e-6;


int n,s;
int l,r,mid;
bool check(int x){
    int sum=0,y=x;
    while(y){
        sum+=y%10;
        y/=10;
    }
    x-=sum;
    return x>=s;
}
void solve(){
    cin>>n>>s;
    l=1,r=n;
    while(l<=r){
        mid=l+r>>1;//cout<<mid<<' ';
        if(check(mid))r=mid-1;
        else l=mid+1;
    }
    int ans=0;
    if(l<=n){
        ans=n-l+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

 

D - Imbalanced Array

思路:求所有区间的最大值-最小值的和,可以转换为求所有数对区间的贡献,分别处理每个数对最大值和最小值的贡献,求和即可。

对于最大值的贡献,a[i]能贡献的范围在[l,r],a[l-1]为i前第一个大于a[i]的数,a[r+1]为i后第一个大于a[i]的数。最小值同理。

对于某些相同的数会出现贡献范围重复的情况,那么向前取相同,后不取相同的即可(反着取也行...)

对于找出前后大于/小于a[i]的[l,r],用单调队列维护即可。

#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;


void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;++i)cin>>a[i];
    vector<int>mal(n+1),mar(n+1),mil(n+1),mir(n+1);
    stack<int>stk;
    for(int i=1;i<=n;++i){
        while(stk.size()&&a[stk.top()]>a[i])stk.pop();
        if(stk.size())mil[i]=stk.top()+1;
        else mil[i]=1;
        stk.push(i);
    }
    while(stk.size())stk.pop();
    for(int i=n;i>=1;--i){
        while(stk.size()&&a[stk.top()]>=a[i])stk.pop();
        if(stk.size())mir[i]=stk.top()-1;
        else mir[i]=n;
        stk.push(i);
    }
    while(stk.size())stk.pop();
    for(int i=1;i<=n;++i){
        while(stk.size()&&a[stk.top()]<a[i])stk.pop();
        if(stk.size())mal[i]=stk.top()+1;
        else mal[i]=1;
        stk.push(i);
    }
    while(stk.size())stk.pop();
    for(int i=n;i>=1;--i){
        while(stk.size()&&a[stk.top()]<=a[i])stk.pop();
        if(stk.size())mar[i]=stk.top()-1;
        else mar[i]=n;
        stk.push(i);
    }
    int res=0;
    for(int i=1;i<=n;++i){
        int ma=(i-mal[i]+1)*(mar[i]-i+1)*a[i];
        int mi=(i-mil[i]+1)*(mir[i]-i+1)*a[i];
        res+=(ma-mi);
    }
    cout<<res;
}
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,ve,Contest,int,SMU,stk,while
From: https://www.cnblogs.com/bible-/p/17554470.html

相关文章

  • SMU Summer 2023 Contest Round 1
    SMUSummer2023ContestRound1A-TheContest思路:求出最短解决问题总时间,在所有区间找出大于等于总时间的最短时刻。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<strin......
  • 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\)的和为......