首页 > 其他分享 >Educational Codeforces Round 17

Educational Codeforces Round 17

时间:2023-01-16 00:23:30浏览次数:65  
标签:Educational return 17 int s2 s1 Codeforces ans dir

Educational Codeforces Round 17

https://codeforces.com/contest/762

A. k-th divisor

#include <bits/stdc++.h>
#define ll long long

using namespace std;
ll n, k;

void get_div (ll x) {
    vector<ll> v;
    v.push_back (1);
    if (x != 1)     v.push_back (x);
    for (ll i = 2; i*i <= x; i++) {
        if (x % i == 0) {
            v.push_back (i);
            if (i !=  x / i) {
                v.push_back (x / i);
            }
        }
    }
    sort (v.begin (), v.end ());
    //cout << v.size () << endl;
    //for (auto i : v)    cout << i << ' ';  cout << endl;
    if (v.size () < k)      cout << -1;
    else    cout << v[k-1];
}

int main () {
    cin >> n >> k;
    get_div (n);
}

B. USB vs. PS/2

#include <bits/stdc++.h>
#define ll long long

using namespace std;
int a, b, c, n, cnt;
ll ans;
multiset<int> s1, s2;

int main () {
    cin >> a >> b >> c >> n;
    for (int i = 0; i < n; i++) {
        int x;
        string s;
        cin >> x >> s;
        if (s[0] == 'U')    s1.insert (x);
        else    s2.insert (x);
    }

    while (s1.size () && a > 0) {
        cnt ++, ans += *s1.begin ();
        s1.erase (s1.begin ()), a --;
    }
    while (s2.size () && b > 0) {
        cnt ++, ans += *s2.begin ();
        s2.erase (s2.begin ()), b --;
    }
    multiset<int> s;
    for (auto i : s1)   s.insert (i);
    for (auto i : s2)   s.insert (i);
    while (s.size () && c > 0) {
        cnt ++, c --;
        ans += *s.begin ();
        s.erase (s.begin ());
    }
    cout << cnt << ' ' << ans << endl;
}

C. Two strings

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
int posl[N], posr[N], ansr, ansl, n, m;

bool check (int l, int r) { //删掉[l,r]
    if (posl[l-1] < posr[r+1])    return true;
    return false;
}

int main () {
    string a, b;
    cin >> a >> b;
    n = a.size (), m = b.size ();
    a = ' ' + a, b = ' ' + b;
    ansl = 0, ansr = m + 1;
    for (int i = 0; i <= m + 1; i++)    posl[i] = n + 1;
    
    //预处理匹配
    for (int i = 1, j = 1; i <= m && j <= n; j++) {
        if (a[j] == b[i])   posl[i] = j, i ++;
    }
    for (int i = m, j = n; i >= 1 && j >= 1; j--) {
        if (a[j] == b[i])   posr[i] = j, i --;
    }

    //for (int i = 1; i <= m; i++)    cout << posl[i] << ' '; cout << endl;
    //for (int i = 1; i <= m; i++)    cout << posr[i] << ' '; cout << endl;

    if (posl[1] == n + 1 && posr[m] == 0) {
        cout << '-';
        return 0;
    }

    //if (posl[1] == n + 1) { //删前缀
        for (int i = 1; i <= m; i++) {
            if (posr[i] != 0) {
                ansl = 1, ansr = i - 1;
                break;
            }
        }
    //}
    //else if (posr[m] == 0) { //删后缀
        for (int i = m; i >= 1; i--) {
            if (posl[i] != n + 1) {
                if (m - i - 1 < ansr - ansl)    ansl = i + 1, ansr = m;
                break;
            }
        }
    //}
    //else {
        //二分枚举
        for (int l = 1; l <= m; l++) {
            int tl = l, tr = m;
            while (tl < tr) {
                int mid = tl + tr >> 1;
                if (check (l, mid))    tr = mid;
                else    tl = mid + 1;
                //cout << l << ' ' << tr << endl;
            }
            //cout << endl;
            if (check (l, tr)) {
                int r = tr;
                if (ansr - ansl > r - l)    ansl = l, ansr = r;
            }
        }
    //}

    if (!ansl)    cout << '-';
    else {
        //cout << ansl << ' ' << ansr << endl;
        for (int i = 1; i < ansl; i++)  cout << b[i];
        for (int i = ansr + 1; i <= m; i++) cout << b[i];
    }
}

//题意: 把b删掉一段连续的后,使其成为a的子序列,输出删去后满足条件的最长b
//优化枚举: 找到合法方案后, 删除更多依旧合法, 故枚举左端点, 二分右端点
//优化匹配: (核心: 每个b都有在a中对应的位置, 因为a不变所以可以记录位置)
//posl[i]: b中[1,i]的字符匹配到a里, 第i个元素在a中对应的位置(前缀匹配)
//posr[i]: b中[i,lenb]的字符匹配到a里, 第i个元素在a中对应的位置(后缀匹配)
//则匹配等价于check是否满足posl[l-1] < posr[r+1]即可

D. Maximum path

wa了但是明天再改好了

// LUOGU_RID: 99923265
#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N = 1e5 + 5, inf = -1e18;
int ans = -1e18;
int f[5][N][2]; //f[i][j][0]: 从下面走过来, f[i][j][1]: 从上面走过来
int a[5][N], s[5][N], n, m;

bool Range (int x, int y) {
    if (x < 1 || x > n || y < 1 || y > m)   return false;
    return true;
}

int dfs (int x, int y, int dir) {
    if (!Range (x, y))      return inf;
    if (f[x][y][dir] != inf)       return f[x][y][dir];
    f[x][y][dir] = max (dfs (x, y + 1, 0), dfs (x, y + 1, 1)) + a[x][y];
    if (dir)    f[x][y][dir] = max (f[x][y][dir], dfs (x - 1, y, 1) + a[x][y]);
    else        f[x][y][dir] = max (f[x][y][dir], dfs (x + 1, y, 0) + a[x][y]);
    return f[x][y][dir];
}

int query (int sx, int sy, int fx, int fy) { //求二位前缀和
    return s[fx][fy] - s[sx-1][fy] - s[fx][sy-1] + s[sx-1][sy-1];
}

signed main () {
    cin >> m;
    n = 3;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
            f[i][j][0] = f[i][j][1] = inf;
        }
    }
    //逆向做
    f[n][m][0] = f[n][m][1] = a[n][m];
    ans = dfs (1, 1, 0);

    if (m & 1) { //考虑往左拐一格的情况
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
            }
        }

        for (int i = 2; i <= m; i++) { //枚举在哪个点拐的
            //(1,i-1)到(n,i)的和 + (1,1)到(1,i-2)
            int sum = query (1, i - 1, n, i);
            if (i > 2)  sum += query (1, 1, 1, i - 2);
            if (i < m)  sum += f[n][i+1][1];
            ans = max (ans, sum);
        }
    }
    cout << ans << endl;
}

//偶数的时候可以被不返回的路径代替
//奇数的时候可以至多返回一次,且只往回走一格,可以枚举返回的位置,转化为子问题

E. Radio stations

F. Tree nesting

标签:Educational,return,17,int,s2,s1,Codeforces,ans,dir
From: https://www.cnblogs.com/CTing/p/17054528.html

相关文章

  • 【BFS】LeetCode 417. 太平洋大西洋水流问题
    题目链接417.太平洋大西洋水流问题思路问题可以转换成从四个边界出发,能和内部哪些点连通。因为涉及到两个可达性问题,所以用两个boolean类型矩阵分别记录一个点到太......
  • Educational Codeforces Round 120 (Rated for Div. 2) C,D
    EducationalCodeforcesRound120(RatedforDiv.2)C,DCC这个题目大意是给我们n个数,我们可以把ai变成ai-1,或者是把ai变成aj,而我们需要知道最少的操作数把n个数的和......
  • Tampermonkey for Mac(油猴Safari浏览器插件) 4.17.6162 中文版
    Tampermonkey插件破解版是一款浏览器脚本管理插件,支持大多常见浏览器,结合脚本大全网站greasyfork,能够方便的实现脚本旳一键安装、自动更新、快速启用等便捷功能,通过用户脚......
  • GYM 101522 La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
    C.Cheering题意:判断一个字符串中\(LSC\),\(PCMS\)哪个字符穿出现的次数多,如果一样多输出\(Tie\)思路:模拟就行signedmain(){std::strings;......
  • 永恒之蓝(MS17-010)的复现
     漏洞介绍:MS17-010又称永恒之蓝漏洞,利用Windows系统的SMB漏洞可以获取系统最高权限。最有名的安全事件就是不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒。攻击......
  • JDK17的下载安装与配置(详细教程)
    1.搜索JDK的官方网址​​​https://www.oracle.com/java/technologies/downloads/#jdk17​​​2.切换到window系统,根据自己电脑的系统进行切换。然后点击下载3.下载完成......
  • Codeforces 732 Div2 A-D题解
    感觉做过这场啊,要不就是看过A题AquaMoonandTwoArrays问前加后减能不能把A变成B,首先这个貌似是经典老题了,无论怎么操作数列总和不变,如果和不相同,变不了,其他情况暴力判......
  • ms17-010漏洞复现
    一、ms17-010漏洞复现(1)启用msf (2)搜索msf中和ms17-010漏洞相关的脚本   (3)使用ms17-010的辅助模块脚本(即搜到的3号模块)   (4)配置辅助模块脚本相关内容......
  • spark RPC超时造成任务异常 Attempted to get executor loss reason for executor id
    日志信息如下Attemptedtogetexecutorlossreasonforexecutorid17atRPCaddress192.168.48.172:59070,butgotnoresponse.Markingasslavelost.java.io.......
  • 17 一个重要的内置关系
    1.一个重要的内置关系:VueComponent.prototype.proto===Vue.prototype2.为什么要有这个关系:让组件实例对象vc 可以访问到Vue原型上的方法。3.关系解析......