SMU Spring 2023 Contest Round 6

发布时间 2023-06-24 17:44:01作者: Ke_scholar

E. Expenditure Reduction

从左右往右找到包含B字符的最近位置,然后从这个位置有从右到左找回去找到包含完所有B字符的位置,这个区间就是答案

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define endl '\n'
#define int long long

using namespace std;

const int N = 1e6+10, M = 998244353;

//typedef long long ll;
typedef pair<int,int> PII;
int n,m,t,k;
map<int,int> mp;
priority_queue<int> QQ;
deque<int> Q;
int ksm(int a,int b,int mod){
    int res = 1;
    a %= mod;
    while(b){
        if(b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
void solve() {
   string a,b;
   cin >> a >> b;
   int l = 0, r = a.size() - 1, pos = 0;
   for(int i = 0;i < a.size();i++){
       if(a[i] == b[pos])
           pos++;
       if(pos == b.size()){
           r = i;
           break;
       }
   }
   pos --;
   //cout << pos << endl;
   for(int i = r;i >= 0;i--){
       if(a[i] == b[pos])
           pos--;
       if(pos == -1){
           l = i;
           break;
       }
   }
  //cout << l << ' ' << r << endl;
   cout << a.substr(l, r - l + 1) << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    cin >> Ke_scholar;
    while(Ke_scholar--)
        solve();
    return 0;
}
/*

 */
View Code

G. Gua!

签到题,注意细节.

#include<bits/stdc++.h>

//#define int long long
#define endl '\n'
#define PII pair<int,int>

using namespace std;

const int N = 2010,mod = 1e9 + 7;
int  n,s,v,m;

void solve() {
    int b, r, d, s;
    cin >> b >> r >> d >> s;
    if (b == 0||r==0) {
        if (d)cout << "gua!" << endl;
        else cout << "ok" << endl;
        return;
    }
    int x = (d + b - 1) / b;
    int y = r * s / 60 + 1;
    //cout << x << ' ' << y << endl;
    if (x <= y)cout << "ok" << endl;
    else cout << "gua!" << endl;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int Ke_scholar = 1;
    cin >> Ke_scholar;
    while(Ke_scholar--)solve();
    return 0;
}
View Code

H. Heirloom Painting

考虑最后一次涂色,必然会形成一个长度不小于 ? 的相同颜色的连续区间。因此如果不存在 长度不小于 ? 的相同颜色的连续区间,则必然无解。不难发现,每一段相同颜色的连续区间都是独 立的,假设其长度为 ??? ,则至少需要 ⌈ ??? / ? ⌉ 次涂色才能得到这段区间。

下面我们证明这一下界可以 达到:随便选择一个长度不小于 ? 的相同颜色的连续区间,作为最后涂色的区间。倒过来考虑,如 果已知下一次涂色最终留下颜色的区间,那么本次涂色最终留下颜色的区间可以与下一次涂色的区 间相邻,且长度不超过 ?,因此每一个长度为 ??? 的相同颜色连续区间,都可以恰好经过 ⌈ ??? / ? ⌉ 次涂 色得到。

因此将每个区间的贡献简单相加即可得到答案,总时间复杂度 ?(?)。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define endl '\n'
#define int long long

using namespace std;

const int N = 1e6+10, M = 998244353;

typedef unsigned long long ll;
typedef pair<int,int> PII;

int n,m,t,k;
map<int,int> mp;
priority_queue<int> QQ;
deque<int> Q;
void solve() {
    cin >> n >> m >> k;
    vector<int> a(n + 1), b(n + 1);
    int pos = 0;
    for(int i = 1;i <= n;i ++){
        cin >> a[i];
        if(a[i] != a[i - 1]){
            b[++pos] = 1;
        }else{
            b[pos]++;
        }
    }
    if(a[1] == a[n] && pos != 1){
        b[1] += b[pos--];
    }
    bool f = false;
    int ans = 0;
    for(int i = 1;i <= pos;i ++){
        if(b[i] >= k)
            f = true;
        ans += (b[i] + k - 1) / k;
    }
    cout << (f ? ans : (-1)) << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    cin >> Ke_scholar;
    while(Ke_scholar--)
        solve();
    return 0;
}
/*

 */
 
View Code

N. Nine Is Greater Than Ten

签到题.

void solve() {
    string s1,s2;
    cin >> s1 >> s2;
    if(s1 > s2){
        cout << s1 << '>' << s2 << endl;
    }
    else if(s1 < s2){
        cout << s1 << '<'  << s2 << endl;
    }
    else
        cout << s1 << '=' << s2 << endl;
}