首页 > 其他分享 >UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)

UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)

时间:2024-06-23 11:32:30浏览次数:24  
标签:Summer typedef Beginner Contest int LL long solve include

A - Count Takahashi (abc359 A)

解题思路

遍历判断即可

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;


void solve(){
    int n;cin>>n;
    int res=0;
    while(n--){
        string s;
        cin>>s;
        res+=(s=="Takahashi");
    }
    cout<<res<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


B - Couples (abc359 B)

解题思路

枚举i和i+2,判断颜色是否相等

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;


void solve(){
    int n;cin>>n;
    vector<int>a(2*n);
    for(int i=0;i<2*n;i++){
        cin>>a[i];
    }
    int res=0;
    for(int i=0,j=2;j<2*n;i++,j++){
        res+=(a[i]==a[j]);
    }
    cout<<res<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


C - Tile Distance 2 (abc359 C)

解题思路

可以发现,dy是一定需要的代价,我们可以计算在dy的代价下,我们能够到达的最左端和最右端l,r,如果x2在这个范围内答案就是0,否则再加上横着走的代价

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;


void solve(){
    LL x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    LL dy=abs(y1-y2);
    
    LL l,r;
    if((x1+y1)%2==0){
        l=x1-dy,r=x1+1+dy;
    }else{
        l=x1-1-dy,r=x1+dy;
    }
    
    if(l<=x2 and x2<=r){
        cout<<dy<<endl;
    }else{
        cout<<(min(abs(r-x2),abs(l-x2))+1>>1)+dy<<endl;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


D - Avoid K Palindrome (abc359 D)

解题思路

不管时间复杂度的话,搜索显然是正确的,然后尝试用DP优化,如果能够正确维护状态,那么就可以用DP优化,这里只有最后k个数需要维护,于是我们可以状压维护

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;

const int N=1100,mod=998244353;
LL f[N][N];
bool st[N];
int n,k;

LL add(LL a,LL b){
    return (a+b)%mod;
}

void solve(){
    cin>>n>>k;
    string s;cin>>s;
    s='?'+s;

    for(int i=0;i<(1<<k);i++){
        vector<int>v(k);
        for(int j=0;j<k;j++)v[j]=i>>j&1;
        vector<int>rv=v;
        reverse(rv.begin(),rv.end());
        st[i]=(v==rv);
    }

    char op[2]={'A','B'};
    f[0][0]=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<(1<<k);j++){
            for(int t=0;t<2;t++){
                if(s[i+1]==op[t] or s[i+1]=='?'){
                    int nj=((j<<1)&((1<<k)-1))+t;
                    if(i+1>=k and st[nj])continue;
                    f[i+1][nj]=add(f[i+1][nj],f[i][j]);
                }
            }
        }
    }

    LL res=0;
    for(int j=0;j<(1<<k);j++)res=add(res,f[n][j]);
    cout<<res<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


E - Water Tank (abc359 E)

解题思路

通过把玩样例,可以发现这是一个单调栈的过程,维护即可

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
const int INF=0x3f3f3f3f;

const int N=2e5+10;
LL a[N];
int n;

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<PLL>stk;
    LL sum=0;
    for(int i=1;i<=n;i++){
        LL cnt=1;
        sum+=a[i];
        while(stk.size() and stk.back().first<=a[i]){
            auto [v,c]=stk.back();
            stk.pop_back();
            sum-=v*c;
            sum+=a[i]*c;
            cnt+=c;
        }
        stk.push_back({a[i],cnt});
        cout<<sum+1<<' ';
    }
    cout<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


F - Tree Degree Optimization (abc359 F)

解题思路

我们假设连接了一个以1为根的菊花图,此时除了1以外,其余的点的d都是1,然后通过移动连向1的边,发现可以实现任意点d的加1,于是我们先将所有点的d设置为1,剩余的n-2个d贪心的去挑,用优先队列维护每个点的代价

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>
#include<stdlib.h>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
const int INF=0x3f3f3f3f;

int n;

LL qr(LL x){
    return x*x;
}

void solve(){
    cin>>n;
    vector<LL>a(n),c(n,1);
    LL res=0;
    for(int i=0;i<n;i++)cin>>a[i],res+=a[i];
    priority_queue<PLL,vector<PLL>,greater<PLL>>q;
    
    auto cal = [&](int i){
        return ((c[i]+1)*(c[i]+1)-(c[i]*c[i]))*a[i];
    };

    for(int i=0;i<n;i++){
        q.push({cal(i) , i});
    }

    for(int i=0;i<n-2;i++){
        auto [v1,id1]=q.top();
        q.pop();
        res+=v1;
        c[id1]++;
        q.push({cal(id1) , id1});
    }
    cout<<res<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


G - Sum of Tree Distance (abc359 G)

解题思路

树上2个点a,b之间的距离可以转化为dep(a)+dep(b)-2dep(lca(a,b)),这里也是一样,我们分别对dep(a)+dep(b)和2dep(lca(a,b))进行求和,前面的直接扫一遍即可,后面的可以枚举每个点作为lca,然后使用启发式合并来计算贡献

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>
#include<stdlib.h>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
const int INF=0x3f3f3f3f;

const int N=2e5+10;
vector<int>G[N];
map<int,int> p[N];
LL sum[N],cnt[N],d[N];
int a[N];
int n;
LL res;

void dfs(int u,int fa){
    for(auto &v:G[u]){
        if(v==fa)continue;
        d[v]=d[u]+1;
        dfs(v,u);
    }
}

void dfs2(int u,int fa){
    for(auto &v:G[u]){
        if(v==fa)continue;
        dfs2(v,u);
        if(p[u].size()<p[v].size())swap(p[u],p[v]);
        for(auto [v,c]:p[v]){
            res-=2ll*p[u][v]*c*d[u];
            p[u][v]+=c;
        }    
    }
    res-=2ll*p[u][a[u]]*d[u];
    p[u][a[u]]++;
}


void solve(){
    cin>>n;
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    for(int i=1;i<=n;i++)cin>>a[i];
    dfs(1,-1);
    for(int i=1;i<=n;i++){
        res+=sum[a[i]]+d[i]*cnt[a[i]];
        sum[a[i]]+=d[i],cnt[a[i]]++;
    }
    dfs2(1,-1);
    cout<<res<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    // cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


标签:Summer,typedef,Beginner,Contest,int,LL,long,solve,include
From: https://www.cnblogs.com/F-beginner/p/18263172

相关文章

  • 创新实训(七)——比赛(Contest)内部逻辑处理
    比赛部分比赛部分包含比赛列表显示、单个比赛内部信息显示、比赛管理、比赛人员以及比赛报名页面这五个代码主要代码文件。此外在内部逻辑处理时还使用了model和lib下的部分配置代码比赛列表比赛列表包含“正在进行或即将到来的比赛”和“已结束的比赛”这两部分具体代码实现......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • AtCoder Beginner Contest 359 解题报告
    AtCoderBeginnerContest359吐槽:A-F还算正常,G题你tm给我放了个出过的板子(ABC340G)是几个意思啊???ASimulate.#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl'\n'#definePBemplace_back#definePPBpop_back#defineMPmake_pai......
  • AtCoder Beginner Contest 357-F
    Problem同步于博客ProblemYouaregivensequencesoflength\(N\),\(A=(A_1,A_2,\ldots,A_N)\)and\(B=(B_1,B_2,\ldots,B_N)\).Youarealsogiven\(Q\)queriestoprocessinorder.Therearethreetypesofqueries:1lrx:Add\(x\)toeachof......
  • 2023 Jiangsu Collegiate Programming Contest, National Invitational of CCPC (Huna
    题目思路来源乱搞ac题解枚举gcd,gcd一定是x的因子,由于lcm+gcd=x,有lcm/gcd+1=x/gcd,还有lcm/gcd>=1枚举lcm/gcd=y,显然如果gcd>1,让gcd和lcm同除以gcd即可,所以可以认为gcd=1,问题转化为,大小为k的集合,k个不同的数,满足gcd=1,且lcm=y的方案数,然后写了个大暴力容斥,没想到过了…......
  • AtCoder Beginner Contest 358
    A-WelcometoAtCoderLandvoidsolve(){strings,t;cin>>s>>t;if(s=="AtCoder"&&t=="Land"){cout<<"Yes\n";return;}cout<<"No\n&qu......
  • square869120Contest #3 G Sum of Fibonacci Sequence
    洛谷传送门AtCoder传送门特判\(n=1\)。将\(n,m\)都减\(1\),答案即为\[[x^m]\frac{1}{(1-x-x^2)(1-x)^n}\]若能把这个分式拆成\(\frac{A(x)}{(1-x)^n}+\frac{B(x)}{1-x-x^2}\)的形式,其中\(\degA(x)\len-1,\degB(x)\le1\),那么答案就是好算的。......
  • AtCoder Beginner Contest 357
    ABC357总结AtCoderBeginnerContest357A-SanitizeHands翻译有一瓶消毒剂,正好可以消毒\(M\)双手。\(N\)名外星人陆续前来消毒双手。\(i\)个外星人(\(1\leqi\leqN\))有\(H_i\)只手,想把所有的手都消毒一次。请计算有多少个外星人可以给所有的手消毒。在这里,即......
  • SuntoryProgrammingContest2024(AtCoder Beginner Contest 357)
    A-SanitizeHands题意:给定一个序列和m,问m按顺序减去这个序列,m>=0情况下最多能减多少个数思路:前缀和+prev(upper_bound())总结:disinfectan(消毒ji),disinfect(消毒,杀毒),aliens(外星人),voidsolve(){ intn,m; cin>>n>>m; vector<int>a(n); for(inti=......
  • summer-data介绍
    官网地址:https://www.summer-data.com代码库地址:https://gitee.com/hahan2020/summer-datasummer-data是什么?summer-data设计用于替代mybatis和hibernate。从个人角度挑一些它们和springjdbc-template的缺点,这些缺点是我创作summer-data的原因。mybatis需......