ABC 341 A-F题解

D感觉出得很好,ABCEF经典,G不作评价不会哈哈
代码可能不太好,仅供参考

A Print 341

模拟

B Foreign Exchange

能往后面放就一直放,贪心即可

C Takahashi Gets Lost

因为N很小,所以支持每次跑全图的复杂度,建图根据题意bfs跑即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
void solved()
{
    int n,m,d;
    string s;
    cin>>n>>m>>d>>s;
    vector<string> g(n+1);
    vector<vector<int>> st(n+1,vector<int>(m+1)); 
    for(int i=1;i<=n;i++) cin>>g[i];
    for(int i=1;i<=n;i++) g[i]='W'+g[i];
    auto check=[&](int i,int j){
         int dx=i,dy=j;
         for(int i=0;s[i];i++){
            if(s[i]=='U') dx--;
            if(s[i]=='D') dx++;
            if(s[i]=='L') dy--;
            if(s[i]=='R') dy++;
            if(dx<1||dx>n||dy<1||dy>m||g[dx][dy]=='#'){
               pair<int,int> k={-1,-1};
               return k;
            }
         }
         pair<int,int> k={dx,dy};
         return k;
    };
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;g[i][j];j++){
            if(g[i][j]=='.'){
                auto [u,v]=check(i,j);
                if(u==-1) continue;
                if(!st[u][v]) st[u][v]=1,ans++;
            }
        }
    }
    cout<<ans<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
   //cin>>t;
    while (t--)
    {
        solved();
    }
}

D Only one of two

题意就是给你一个二个不同的数,除开他们公倍数,求能被他们整除的第k个数
思路:首先考虑公倍数一定是最小公倍数的倍数,假设第K个数为L,那么他满足的性质是什么呢?(L/N)+(L/M)-2(L/公倍数)=k。 可以看出,如果L成立,那么X>=L是一定满足:(X/N)+(X/M)-2(X/公倍数)>=k,故可以二分查找满足当前性质的最小数,即L本身 复杂度log

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
void solved()
{
    int n,m,k;
    cin>>n>>m>>k;
    if(n>m) swap(n,m);
    int l=1,r=m*k;
    int d=__gcd(n,m);
    d=n*m/d;
    auto check=[&](int mid){
        int a=(mid)/n;
        int b=(mid)/m;
        int c=(mid)/d;
        if(a+b-2*c>=k) return true;
        return false;
    };
    while(l<r){
        int mid=(l+r)>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
   //cin>>t;
    while (t--)
    {
        solved();
    }
}

E Alternating String

经典题目 01串翻转,根据题意考虑A[i]=(s[i]==s[i+1]?0:1),那么如果(r,l)是好串,那么A[l]+A[l+1]+....+A[r-1] 一定等于r-l,考虑操作1的影响,翻转只影响2个端点不影响中间的关系,操作2需要我们求区间和,考虑树状数组维护,操作1就是端点取反。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=5e5+10;
int tree[N];
void updata(int idx,int k){
    if(!idx) return ;
    while(idx<=N){
        tree[idx]+=k;
        idx+=(idx)&(-idx);   
    }
}
int query(int idx){
    int res=0;
    while(idx>0){
        res+=tree[idx];
        idx-=(-idx)&(idx);
    }
    return res;
}
int rangeq(int l,int r){
    return query(r)-query(l-1);
}
void solved(){
    int n,q;
    cin>>n>>q;
    string s;
    cin>>s;
    s='#'+s;
    for(int i=1;s[i+1];i++){
        if(s[i]==s[i+1]) updata(i,0);
        else updata(i,1);
    }
    while(q--){
        int op,l,r;
        cin>>op>>l>>r;
        if(op==1){
            if(rangeq(l-1,l-1)==1) updata(l-1,-1);
            else updata(l-1,1);
            if(rangeq(r,r)==1) updata(r,-1);
            else updata(r,1);
        }
        else{
            //cout<<rangeq(l,r-1)<<endl;
            if(l==r) cout<<"Yes"<<endl;
            else if(rangeq(l,r-1)==(r-l)) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }

}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
   //cin>>t;
    while (t--)
    {
        solved();
    }
}

F Breakdown

首先考虑一个问题,如果我从端点X发给,A B C,那么我能玩多次呢?,显然是 1+A的次+B的次+C的次,这是一个dp问题,题目限制我们不能全选,有和的限制,其实就是类似背包问题的体积限制,对于点X把所有满足条件的相邻点拿出来跑一个01背包即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=5e3+10;
int dp[N],a[N],w[N],st[N];
vector<int> e[N+1];
void dfs(int u){
    st[u]=1;
    vector<int> v,f(w[u]);
    for(auto &k:e[u]){
        if(w[k]>=w[u]) continue;
        if(dp[k]){
            v.push_back(k);
            continue;
        }
        dfs(k);
        v.push_back(k);
    }
    if(v.size()==0){
        dp[u]=1;
        return ;
    }
    for(int i=0;i<v.size();i++){
        for(int j=w[u]-1;j>=w[v[i]];j--){
            f[j]=max(f[j],f[j-w[v[i]]]+dp[v[i]]);
        }
    }
       dp[u]=f[w[u]-1]+1;
}
void solved(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        if(!dp[i]) dfs(i);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=dp[i]*a[i];
    }
    cout<<ans<<endl;
}
signed main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    //cout.tie(0);
    int t = 1;
   //cin>>t;
    while (t--)
    {
        solved();
    }
}
posted @   Keep2Y  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示