Codeforces Round #504 A.B.C.D( 模拟&&思维&&模拟&&线段树

本文解析了四道编程题目,包括通配符匹配、玩具对选择、括号子序列及序列变化等,提供了完整的代码实现及思路说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Single Wildcard Pattern Matching

题意:

判断字符串的小问题,trick点比较多,FST无数,最后过的C还少,, 多亏了写的时候仔细想了两遍,,,

//
// Created by team02 on 18-8-17.
//
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ls o<<1
#define rs o<<1|1
#define fi first
#define se second
#define CLR(a, b) memset(a, (b), sizeof(a))
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = (int)2e5+10;

int main() {
    int n,m;
    cin>>n>>m;
    string s1, s2;
    cin>>s1>>s2; int p=-1;
    for(int i =0;i<n;++i) if(s1[i]=='*') p=i;
    if(n>m+1) {
        cout<<"NO\n"; return 0;
    }
    if(n>m&&p==-1) {
        cout<<"NO\n"; return 0;
    }
    if(p==-1) {
        for(int i=0;i<max(n,m);++i) {
            if(s1[i]!=s2[i]) {
                cout<<"NO\n";
                return 0;
            }
        }
    }
    for(int i=0;i<n;++i) {
        if(s1[i]!=s2[i] && s1[i]!='*') {
            cout<<"NO\n";return 0;
        }
        if(s1[i]=='*') break;
    }
//    reverse(s1.begin(),s1.end());
//    reverse(s2.begin(),s2.end());
    m=m-1;
    for(int i = n-1; i>p; --i) {
        if(s1[i]!=s2[m]) {

            cout << "NO\n"; return 0;
        }
        m--;
    }
    cout << "YES\n";


    return 0;
}

B.Pair of Toys

题意:

1n1−n中挑出最多的对数使得他们的和为mm

简单的思维题

//
// Created by team02 on 18-8-17.
//
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ls o<<1
#define rs o<<1|1
#define fi first
#define se second
#define CLR(a, b) memset(a, (b), sizeof(a))
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = (int)2e5+10;

int main() {
    ll n,k; cin>>n>>k;
    ll v = k - 1;
    ll s = v / 2 + 1 + v % 2;
    ll end = min(v, n);
    cout<<max(end-s+1, 1LL*0)<<endl;
    return 0;
}

C.Bracket Subsequence

题意:

给一串括号,求长度为k的子串(且是括号配对的)

模拟一下, 维护一个栈记录每个括号的路径就可以了

//
// Created by team02 on 18-8-17.
//
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ls o<<1
#define rs o<<1|1
#define fi first
#define se second
#define CLR(a, b) memset(a, (b), sizeof(a))
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 2e5+10;

void F() {
    ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
}
int p[MAXN];
bool vis[MAXN];
int main() {
    int n,k; string s;
    cin>>n>>k>>s;
    stack<int> st;
    for(int i=0;i<n;++i) {
        if(s[i]=='(') st.push(i);
        else {
            p[st.top()]=i;
            p[i]=st.top();
            st.pop();
        }
    }
    for(int i=0;i<n;++i) {
        if(!vis[i]&&k>0)
            vis[i]=vis[p[i]]=true,k-=2;
    }
    for(int i=0;i<n;++i) if(vis[i]) cout<<s[i];
    cout<<"\n";
    return 0;
}

D.

题意:

一段长度为n的序列 经过了qq次变化,每次变化就是将[li,ri]区间内变为数字qq
为了增加难度, 最后变化后的序列其中的一些数字我们需要将它变为0

线段树维护一下两个相同数字之间的最小值就行了

//
// Created by team02 on 18-8-17.
//
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ls o<<1
#define rs o<<1|1
#define fi first
#define se second
#define pii pair<int,int>
#define CLR(a, b) memset(a, (b), sizeof(a))
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 2e5+10;

void F() {
    ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
}

int a[MAXN], vis[MAXN];
struct node{
    int l,r;
    int x;
}t[MAXN<<2];

inline void push_up(int o) {
    t[o].x=min(t[ls].x,t[rs].x);
}
inline void build(int l,int r, int o) {
    t[o].l=l,t[o].r=r;
    if(l==r) {
        if(a[l]==0) t[o].x=INF;
        else t[o].x=a[l];
        return;
    }
    int m=(l+r)>>1;
    build(l,m,ls);build(m+1,r,rs);
    push_up(o);
}
inline int query(int l,int r,int o) {
    if(t[o].l>=l&&t[o].r<=r) {
        return t[o].x;
    }
    int m=(t[o].r+t[o].l)>>1;
    if(r<=m) return query(l,r,ls);
    else if(l>m) return query(l,r,rs);
    else return min(query(l,m,ls),query(m+1,r,rs));
}

int main() {
    int n,q; cin>>n>>q;
    bool flag=true,flag1=true;
    for(int i=1;i<=n;++i) {
        cin>>a[i];
        if(a[i]==q) flag=false;
        if(!a[i]) flag1=false;
    }
    if(flag&&flag1) {
        cout<<" NO\n";return 0;
    }
    build(1,n,1);
    for(int i=1;i<=n;++i) {
        if(!vis[a[i]]) vis[a[i]]=i;
        else {
            if(query(vis[a[i]],i,1)<a[i]) {
                cout << "NO\n"; return 0;
            }
        }
    }
    cout<<"YES\n"; a[0]=1;
    for(int i=1;i<=n;++i) {
        if(flag && a[i]==0) {
            cout<<q<<" "; flag=false;
            a[i] = q;
            continue;
        }
        if(a[i]==0){
            cout<<a[i-1]<<" "; a[i]=a[i-1];
        }
        else cout<<a[i]<<" ";
    }

    return 0;
}
### 关于 Codeforces Round 839 Div 3 的题目与解答 #### 题目概述 Codeforces Round 839 Div 3 是一场面向不同编程水平参赛者的竞赛活动。这类比赛通常包含多个难度层次分明的问题,旨在测试选手的基础算法知识以及解决问题的能力。 对于特定的比赛问题及其解决方案,虽然没有直接提及 Codeforces Round 839 Div 3 的具体细节[^1],但是可以根据以往类似的赛事结构来推测该轮次可能涉及的内容类型: - **输入处理**:给定一组参数作为输入条件,这些参数定义了待解决的任务范围。 - **逻辑实现**:基于输入构建满足一定约束条件的结果集。 - **输出格式化**:按照指定的方式呈现最终答案。 考虑到提供的参考资料中提到的其他几场赛事的信息[^2][^3],可以推断出 Codeforces 圆桌会议的一般模式是围绕着组合数学、图论、动态规划等领域展开挑战性的编程任务。 #### 示例解析 以一个假设的例子说明如何应对此类竞赛中的一个问题。假设有如下描述的一个简单排列生成问题: > 对于每一个测试案例,输出一个符合条件的排列——即一系列数字组成的集合。如果有多种可行方案,则任选其一给出即可。 针对上述要求的一种潜在解法可能是通过随机打乱顺序的方式来获得不同的合法排列形式之一。下面是一个 Python 实现示例: ```python import random def generate_permutation(n, m, k): # 创建初始序列 sequence = list(range(1, n + 1)) # 执行洗牌操作得到新的排列 random.shuffle(sequence) return " ".join(map(str, sequence[:k])) # 测试函数调用 print(generate_permutation(5, 2, 5)) # 输出类似于 "4 1 5 2 3" ``` 此代码片段展示了怎样创建并返回一个长度为 `k` 的随机整数列表,其中元素取自 `[1..n]` 这个区间内,并且保证所有成员都是唯一的。需要注意的是,在实际比赛中应当仔细阅读官方文档所提供的精确规格说明,因为这里仅提供了一个简化版的方法用于解释概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值