首页 > 其他分享 >The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jinan)补题记录

The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jinan)补题记录

时间:2024-03-31 20:22:51浏览次数:27  
标签:Regional int ++ Jinan back else 括号 补题 s1

The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jinan)

D. Largest Digit

题意:给定两个范围la, ra, lb, rb,求在两个范围内选任意两个数相加,求最大的数位

思路:暴力枚举即可,遇到9跳出循环

void solve(){
    ll la, ra, lb, rb;
    cin >> la >> ra >> lb >> rb;
    ll ans = 0;
    for(ll i = la; i <= ra; i ++){
        for(ll j = lb; j <= rb; j ++){
            ll res = 0;
            ll u = i + j;
            while(u){
                res = max(res, u % 10);
                u /= 10;
            }
            ans = max(ans, res);
            if(ans == 9) break;
        }
        if(ans == 9) break;
    }
    cout << ans << '\n';
}

I. Strange Sorting

题意:给定一个长度为 n 的排列,可以至多选择⌊n / 2⌋个(l, r),并且 al < ar ,将(l, r)范围内的数字按照升序排序,求将整个排列完成升序排序的一个方案

思路:每次找当前第一个 a[i]!=i 的数字然后找最后的 a[j]<a[i] 的数字,对这个区间进行排序,在给定的范围内能完成排序

void solve(){
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i ++) cin >> a[i];
    vector<PII> ans;
    for(int i = 1; i <= n; i ++){
        if(a[i] != i){
            int p = i;
            for(int j = i + 1; j <= n; j ++){
                if(a[j] < a[i]) p = j;
            }
            sort(a.begin() + i, a.begin() + p + 1);
            ans.push_back({i, p});
        } 
    }
    cout << ans.size() << '\n';
    for(auto [x, y] : ans){
        cout << x << ' ' << y << '\n';
    }
}

A. Many Many Heads

题意:给定一个括号序列,包含[]()这四种,你可以对括号进行左右变化任意次,但是不能改变括号的种类,问是否存在且仅存在一种合法的括号序列

思路:赛时和队友想的做法是:先把当前的括号序列进行构造变成一个合法的括号序列,然后进行判断每对括号内是否存在两对相同类型的括号序列在同一深度

深度的定义:例如这样的括号序列 ([])([]),我们对他们进行编号:1,2,3,4,5,6,7,8,那么1,4,5,8的括号位于0深度,2,3,6,7括号的深度为1

如果存在同样深度的两对括号,例如(.......)(......)那么这两对括号一定能够组成另外一种合法的情况

那么为什么一定会出现这种情况呢?这和一开始我们构造的方法有关系:我们定义一个存储符号的数组 a,当a为空,我们把第一个放入的括号都变成向右的括号,然后检测之后加入的括号类型,如果是类型相同的括号就配对为一对,否则加入对应类型的向右的括号,所以同一层内只要合法是不会出现(())这种的情况

然后接下来就是:对深度进行检测,如果当前同一深度的不存在相同的,就把这一层清空,因为后面有可能还会进入这个深度

void solve(){
    string s, s1;
    cin >> s;
    vector<char> a;
    for(int i = 0; i < s.size(); i ++){
        if(a.size() == 0){
            if(s[i] == '(' || s[i] == ')'){
                a.push_back('(');
                s1 += '(';
            } 
            else{
                a.push_back('[');
                s1 += '[';
            }
        }//空先放左括号 
        else{
            if(a.back() == '('){
                if(s[i] == '(' || s[i] == ')'){
                    s1 += ")";
                    a.pop_back(); 
                }
                else{
                    a.push_back('[');
                    s1 += '[';
                }
            }
            else if(a.back() == '['){
                if(s[i] == '[' || s[i] == ']'){
                    s1 += "]";
                    a.pop_back(); 
                }    
                else{
                    a.push_back('(');
                    s1 += '(';                    
                }            
            }
        }//对应匹配 
    }
    
    int p = 0, q = 0;//记录当前深度 
    map<int, int> x, y;
    //x是圆括号的深度,y是方括号的深度 
    for(auto c:s1)
    {
        if(c == '(') p ++; 
        else if(c == '[') q ++;//左边界出现,当前深度++ 
        else if(c == ')'){
            x[q] ++;
            if(x[q] >= 2){
                cout << "No\n";
                return;
            }//对应深度出现了两对 
            y[p] = 0;//这个深度合法就要清空 
            p --;//回到上一个深度 
        } 
        else if(c == ']'){
            y[p] ++;
            if(y[p] >= 2){
                cout << "No\n";
                return;
            }
            x[q] = 0;
            q --;
        } 
    }
    cout << "Yes\n";
}

补题:正解很简单,判断三个连续相同的和两个以上长度大于等于2的连续段会造成多种结果即可

void solve() {
    int n;
    string s;
    cin >> s;
    n = s.size();
    int cur = -1, cnt = 0, sum = 0;
    bool ok = true;
    for(int i = 0; i < n; i ++){
        int now = 0;
        if(s[i] == '[' || s[i] == ']') now = 1;
        if(now == cur){
            cnt ++;
            if(cnt >= 3) ok = false;
            if(cnt == 2) sum ++;
        }
        else{
            cur = now, cnt = 1;
        }
    }
//    cout << sum << '\n';
    if(!ok || sum >= 3) cout << "No\n";
    else cout << "Yes\n";
} 

pending......

标签:Regional,int,++,Jinan,back,else,括号,补题,s1
From: https://www.cnblogs.com/RosmontisL/p/18107197

相关文章

  • 2024.3.31补题
    SMU2024spring天梯赛2(补题)https://pintia.cn/problem-sets/1772539187410104320/exam/overview7-10红色警报错误:①没写②用的unordered_map<>判断的联通条件。只要有城市和它相连就判它在城市群里,只对了样例。。。③不会深搜。。。#include<bits/stdc++.h>using......
  • CodeTonRound8-BC1C2补题
    B-BessieandMEX思路:顺,逆填都可以.见代码注释voidsolve(){//补B--不用str.find来维护,这个是o(n)的。用set的count()orfind()来维护,这两个都是o(logn)的intn;cin>>n;////顺着填:填的数字=MEX.find('0')-aior填了MEX[MEX.find('0')]='1',之后MEX.f......
  • 日常训练补题
    7-10红色警报-SMU2024spring天梯赛2(补题)(pintia.cn)题解:这题是一道暴力思维题我们需要先统计一下最初的点的连通块然后在一个个删除,每删除一次就跑一个并查集,在统计连通块的个数,然后对比前一次,看看连通块有没有变多即可#include<bits/stdc++.h>//#pragmaGCCopti......
  • 2024SMUSpring天梯2补题
    L2-2:红色警报题意:只要连通块数目减少就输出RedAlert,主要是连通块数目..intn,m,k;unordered_map<int,int>mark;vector<int>vct[505];boolvis[505];voiddfs(intx){for(autov:vct[x]){if(!vis[v]&&!mark[v]){vis[v]=1;dfs(......
  • 2023ICPC沈阳区域赛I题Three Rectangles补题
    题意有一个(0,0)(左下角)到(H,W)(右上角)的矩形区域,给出3个小矩形的h和w,要求3个矩形盖住矩形区域的放置方案:要求3个矩形不能旋转,只能放到整点上,不能超出矩形区域,可以重叠。mod1e9+7。H,W范围1e9,\(1\leqh_i\leqH,1\leqw_i\leqW\)分析及实现由3个小矩形盖住大矩形,通过思考......
  • 2024年天梯成信小赛--L2-3,L2-4补题
    L2-3:Gwen的小剪刀题意:思路:二分美感度+克鲁斯卡尔intn,m,sum0;typedefstructmyp{intu,v;intb,h;};boolcmp(mypa,mypb){returna.h<b.h;}myparr[200005];intfa[100005];intfind(intx){// if(x==fa[x])returnx;// returnfa[x]=find(fa[x......
  • 2024年天梯成信校赛补题
    1-1代码胜于雄辩嘿嘿 L1-2收水费思路:分类讨论 L1-3日期思路:模拟 L1-4回文数思路:翻转后判断是否相等 L1-5yihan的新函数思路:模拟 L1-6二进制思路:二进制每位最多进位1,模拟下二进制加法即可 L1-7大山中的学院思路:统计每个山脉对空地的贡献 L1-8堆积木思......
  • 2024年3月18日 快速幂+补题
    快速幂longlongqpow(longlonga,longlongb){longlongres=1;while(b){if(b&1)res=res*a;a=a*a;b>>=1;}returnres;}快速幂加速矩阵计算应用于计算定长k路、斐波那契数列、求解递推式子题目:https://www.luogu.com.cn/problem/P1962htt......
  • 开学二周(日常补题训练)
    pta天梯专栏7-11龙龙送外卖-SMU2024spring天梯赛1(补题)(pintia.cn)题解:首先我们先建个图然后存一下各个节点的父亲节点我们细看这个最短路可以发现,当全部节点加进来,那么最短路就是每一个节点跑两遍然后最深的那个节点最后才跑,这样就只需要1遍所以我们首先把每一个节......
  • 单独补题-数正方形
    数正方形题意:做法:发现边长为1的正方形,中间不能放正方形。边长为2的正方形中间可以放1个正方形...以此类推。又容易计算出边长为x的正方形在n*n的矩阵中有几个。constintmod=1e9+7;voidsolve(){//JP8692[蓝桥杯2019国C]数正方形--思维..intn,ans=0;......