首页 > 其他分享 >河南萌新联赛2024第(二)场:南阳理工学院

河南萌新联赛2024第(二)场:南阳理工学院

时间:2024-07-24 21:07:41浏览次数:13  
标签:int cin 理工学院 2024 ++ vector 萌新 ans using

河南萌新联赛2024第(二)场:南阳理工学院

A-国际旅行Ⅰ_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

根据题意可以得知国与国之间互相联通所以从任意一个国家出发都可以到其他所有国家,故按照权值排序后输出就可以了。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, q;
    cin >> n >> m >> q;

    vector<int> a(n);

    for (int i = 0; i < n; i ++) {
        cin >> a[i];
    }

    vector g(n, vector<int>());

    for (int i = 0; i < m; i ++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    sort(a.begin(), a.end());

    while (q--) {
        int k;
        cin >> k;
        cout << a[--k] << '\n';
    }

    return 0;
}

D-A*BBBB_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

正解是现B的每一位都相同,然后模拟乘法发现,当B每一位相同时假设为 x,那么就是A乘x,然后B有多少位就往前移多少次,然后再用前缀和进行维护当前位数为多少。

不过 FFT直接秒了

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

#define L(x) (1 << (x))
const double PI = acos(-1.0);
const int N = 1e7 + 10;
double ax[N], ay[N], bx[N], by[N];
char sa[N / 2], sb[N / 2];
int sum[N];
int x1[N], x2[N];
int revv(int x, int bits) {
    int ret = 0;
    for (int i = 0; i < bits; i++) {
        ret <<= 1;
        ret |= x & 1;
        x >>= 1;
    }
    return ret;
}
void fft(double * a, double * b, int n, bool rev) {
    int bits = 0;
    while (1 << bits < n) ++bits;
    for (int i = 0; i < n; i++) {
        int j = revv(i, bits);
        if (i < j)
            swap(a[i], a[j]), swap(b[i], b[j]);
    }
    for (int len = 2; len <= n; len <<= 1) {
        int half = len >> 1;
        double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);
        if (rev) wmy = -wmy;
        for (int i = 0; i < n; i += len) {
            double wx = 1, wy = 0;
            for (int j = 0; j < half; j++) {
                double cx = a[i + j], cy = b[i + j];
                double dx = a[i + j + half], dy = b[i + j + half];
                double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
                a[i + j] = cx + ex, b[i + j] = cy + ey;
                a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;
                double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
                wx = wnx, wy = wny;
            }
        }
    }
    if (rev) {
        for (int i = 0; i < n; i++)
            a[i] /= n, b[i] /= n;
    }
}
int sol(int a[], int na, int b[], int nb, int ans[]) {
    int len = max(na, nb), ln;
    for (ln = 0; L(ln) < len; ++ln);
    len = L(++ln);
    for (int i = 0; i < len ; ++i) {
        if (i >= na) ax[i] = 0, ay[i] = 0;
        else ax[i] = a[i], ay[i] = 0;
    }
    fft(ax, ay, len, 0);
    for (int i = 0; i < len; ++i) {
        if (i >= nb) bx[i] = 0, by[i] = 0;
        else bx[i] = b[i], by[i] = 0;
    }
    fft(bx, by, len, 0);
    for (int i = 0; i < len; ++i) {
        double cx = ax[i] * bx[i] - ay[i] * by[i];
        double cy = ax[i] * by[i] + ay[i] * bx[i];
        ax[i] = cx, ay[i] = cy;
    }
    fft(ax, ay, len, 1);
    for (int i = 0; i < len; ++i)
        ans[i] = (int)(ax[i] + 0.5);
    return len;
}
string mul(string sa, string sb) {
    int l1, l2, l;
    int i;
    string ans;
    memset(sum, 0, sizeof(sum));
    l1 = sa.size();
    l2 = sb.size();
    for (i = 0; i < l1; i++)
        x1[i] = sa[l1 - i - 1] - '0';
    for (i = 0; i < l2; i++)
        x2[i] = sb[l2 - i - 1] - '0';
    l = sol(x1, l1, x2, l2, sum);
    for (i = 0; i < l || sum[i] >= 10; i++) {//进位
        sum[i + 1] += sum[i] / 10;
        sum[i] %= 10;
    }
    l = i;
    while (sum[l] <= 0 && l > 0)    l--; // 检索最高位
    for (i = l; i >= 0; i--)
        ans += sum[i] + '0'; // 倒序输出
    return ans;
}

void solve() {

    string a, b;
    cin >> a >> b;

    cout << mul(a, b) << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}

E-“好”字符_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

对于循环同构,我们只需要把 b 字符串再自加一遍就可以解决了。

对于当前某一个字符,我们把除了这个字符之外的都看作*号,b 中同理,那么问 b 中所有该字符是否和 a 中位置相同就变成了 a 是否是 b 中的一个子串,转化问题之后用字符串哈希或者 kmp 解决就行了。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

struct Kmp {
    vector<int> next;

    void getNext(string p) {
        int j = 0, k = -1, n = p.size();
        next.resize(n + 1);
        next[0] = -1;
        while (j < n) {
            if (k == -1 || p[j] == p[k]) {
                next[++j] = ++k;
            } else
                k = next[k];
        }
    }

    int kmp(string s, string p) {
        int n = s.size(), m = p.size();
        int i = 0, j = 0;

        while (i < n && j < m) {
            if (j == -1 || s[i] == p[j]) {
                i ++, j ++;
            } else {
                j = next[j];
            }
        }
        if (j == m) return i;
        else return -1;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    string a, b;
    cin >> a >> b;

    vector loca(30, vector<int>());
    vector locb(30, vector<int>());
    for (int i = 0; i < n; i ++) {
        loca[a[i] - 'a'].push_back(i);
        locb[b[i] - 'a'].push_back(i);
    }

    int ans = 0;
    for (int i = 0; i < 26; i ++) {
        if (loca[i].empty()) continue;
        if (loca[i].size() != locb[i].size()) continue;

        string sa = string(a.size(), '*'), sb = string(b.size(), '*');

        Kmp kmp;

        for (auto x : loca[i])
            sa[x] = i + 'a';
        for (auto x : locb[i])
            sb[x] = i + 'a';

        sb += sb;

        kmp.getNext(sa);

        ans += (kmp.kmp(sb, sa) != -1);
    }

    cout << ans << '\n';

    return 0;
}

F-水灵灵的小学弟_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

诈骗题,两人都是DHY

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;

    while(t--){

        i64 a,b;
        cin >> a >> b;
        cout << "DHY\n";

    }

    return 0;
}

G-lxy的通风报信_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

处理出 a 支军队两两互相的距离,因为 a 可能有 50 个点,所以不能用状压 dp,但是题中说起点终点不固定,所有只要找到一个总权值最小的方案把所有点连起来就好了,没错,那就是最小生成树了。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<string> s(n);
    for (auto &i : s)
        cin >> i;

    int cnt = 0;
    vector<pair<int, int>> a, b;
    map<pair<int, int>, int> mp;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < m; j ++) {
            if (s[i][j] == '*') {
                a.emplace_back(i, j);
                mp[ {i, j}] = cnt ++;
            }
        }

    const int u[] = {1, -1, 0, 0}, v[] = {0, 0, 1, -1};
    vector dis(cnt, vector<int>(cnt, -1));

    for (int i = 0; i < cnt; i ++) {

        auto [sx, sy] = a[i];

        vector vis(n, vector<bool>(m));
        queue<array<int, 3>> Q;
        Q.push({0, sx, sy});
        vis[sx][sy] = 1;
        dis[i][i] = 0;

        while (Q.size()) {
            auto [l, x, y] = Q.front();
            Q.pop();

            if (mp.count({x, y})) {
                dis[i][mp[ {x, y}]] = l;
            }

            for (int k = 0; k < 4; k ++) {
                int dx = x + u[k], dy = y + v[k];
                if (dx >= 0 && dx < n && dy >= 0 && dy < m && s[dx][dy] != '#' && !vis[dx][dy]) {
                    Q.push({l + 1, dx, dy});
                    vis[dx][dy] = 1;
                }
            }
        }
    }

    for (int i = 0; i < cnt; i ++) {
        for (int j = 0; j < cnt; j ++) {
            if (dis[i][j] == -1) {
                cout << "No\n";
                return 0;
            }
        }
    }

    vector<array<int, 3>> edge;
    for (int i = 0; i < cnt; i ++) {
        for (int j = 0; j < cnt; j ++) {
            if (i == j) continue;
            edge.push_back({dis[i][j], i, j});
        }
    }

    vector<int> fa(cnt);
    iota(fa.begin(), fa.end(), 0);

    sort(edge.begin(), edge.end());

    auto find = [&](auto self, int x)->int{
        return fa[x] == x ? x : fa[x] = self(self, fa[x]);
    };

    int ans = 0, num = 0;
    for (int i = 0; i < edge.size(); i ++) {
        auto [l, u, v] = edge[i];
        u = find(find, u), v = find(find, v);
        if (u != v) {
            fa[u] = v;
            ans += l;
            num ++;
        }
        if (num == cnt - 1) break;
    }

    cout << ans << '\n';

    return 0;
}

H-狼狼的备忘录_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

模拟。

把每个人的每个数字串的所有后缀存下来,每新加入一个数字串就去判断一下是不是现存某个字符串的后缀,又或者现存中某个数字串是它的后缀,是的话就把它删掉,换成这个。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    map<string, set<string>> ans, suf;
    for (int i = 0; i < n; i ++) {
        string s;
        cin >> s;

        int k;
        cin >> k;
        for (int j = 0; j < k; j ++) {
            string num;
            cin >> num;

            if (!suf[s].count(num)) {
                for (int p = 0; p < num.size(); p ++) {
                    if (ans[s].count(num.substr(p))) {
                        ans[s].erase(num.substr(p));
                    }
                }
                ans[s].insert(num);
                for (int p = 0; p < num.size(); p ++) {
                    suf[s].insert(num.substr(p));
                }
            }
        }
    }

    cout << ans.size() << '\n';
    for (auto [id, s] : ans) {
        cout << id << ' ' << s.size() << ' ';
        for (auto i : s)
            cout << i << " \n"[i == *s.rbegin()];
    }

    return 0;
}

I-重生之zbk要拿回属于他的一切_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

遍历一遍即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;

    string s;
    cin >> s;

    int ans = 0;
    for(int i = 0;i < s.size();i ++){
        if(s.substr(i,5) == "chuan")
            ans ++;
    }

    cout << ans << '\n';

    return 0;
}

J-这是签到_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)

思路

按题意计算每 \(i\times i\) 的矩阵行列式,取最小值即可。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

struct Matrix {
    i64 N;
    vector<vector<i64>> A;
    Matrix() { N = 0;}
    Matrix(int n) {
        N = n;
        A.resize(N + 1);
        for (int i = 0; i <= N; i ++)
            A[i].resize(N + 1, 0);
    }
    void init(vector<vector<i64>> a, int n) {
        A = a;
        N = n;
    }

    Matrix operator*(const Matrix &b) const {
        Matrix res(b.N);

        for (int i = 1; i <= b.N; ++i)
            for (int j = 1; j <= b.N; ++j)
                for (int k = 1; k <= b.N; ++k)
                    res.A[i][j] = (res.A[i][j] + A[i][k] * b.A[k][j]);
        return res;
    }
    Matrix qpow(i64 k) {
        Matrix res(N);

        //斐波那契数列初始化
        //res.A[1][1] = res.A[1][2] = 1;
        //A[1][1] = A[1][2] = A[2][1] = 1;

        //单位矩阵
        for (int i = 0; i <= N; i ++)
            res.A[i][i] = 1;

        while (k) {
            if (k & 1) res = res * (*this);
            (*this) = (*this) * (*this);
            k >>= 1;
        }
        return res;
    }
    //求行列式
    i64 det() {
        return DET(A, N);
    }

    i64 DET(vector<vector<i64>> arr1, int n) {
        i64 sum = 0;
        //i是第一行的列指标,M是余子式的值,sum是行列式的计算值
        if (n == 1)//一阶行列式直接得出结果
            return arr1[0][0];
        else if (n > 1) {
            for (int i = 0; i < n; i++) {
                //按照第一行展开
                i64 M = Minor(arr1, i, n);
                sum += pow(-1, i + 2) * arr1[0][i] * M;
            }
        }
        return sum;
    }
    i64 Minor(vector<vector<i64>> arr1, int i, int n) {
        vector arr2(n + 1, vector<i64>(n + 1));

        //以下为构造余子式的过程。
        for (int j = 0; j < n - 1; j++) {
            for (int k = 0; k < n - 1; k++) {
                if (k < i)
                    arr2[j][k] = arr1[j + 1][k];
                else if (k >= i)
                    arr2[j][k] = arr1[j + 1][k + 1];
            }
        }

        return DET(arr2, n - 1);
        //构造完后,余子式是一个新的行列式,返回DET函数进行计算。
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector a(10, vector<int>(10));
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < m; j ++)
            cin >> a[i][j];

    i64 ans = INT_MAX >> 1;

    Matrix Ma;
    for (int i = 1; i <= max(n, m); i ++) {
        vector ok(i, vector<i64>(i));
        for (int j = 0; j < i; j ++)
            for (int k = 0; k < i; k ++)
                ok[j][k] = a[j][k];
        Ma.init(ok, i);
        ans = min(ans, Ma.det());
    }

    cout << ans << '\n';

    return 0;
}

标签:int,cin,理工学院,2024,++,vector,萌新,ans,using
From: https://www.cnblogs.com/Kescholar/p/18321724

相关文章

  • NOI 2024 ~ 一定有 下一个 诗和远方
    Day-?PKUSC和THUSC都打的还不错,拿了两个一等约。当时在杭州感觉自己都要飘起来了,APIO再拿au可能真的要上天了,于是在群里立下flag:随后正如预期一般拿到了整整115分,收获了OI生涯第一块铜牌。想想去年五哥APIO打铁,最后NOIrk20的事,我认为优势在我。Day-1报到......
  • Wordpress安装到win10(2024年7月)
    目录1.wordpress介绍2下载应用2.1.wordpress2.2XAMPP 2.3PHPmyadmin3.配置应用3.1XAMPP进程3.2文件配置3.3phpmyadmin配置4.配置网页4.1数据库创建 4.2安装wordpress5.进入面板6.总结1.wordpress介绍WordPress是一个开源内容管理系统(CMS),它允许用户构......
  • Java后端开发知识点积累20240724
    1.使用流(Stream)API和lambda表达式来从一个dateBaseList列表中提取所有的title字段,并将这些title值收集到一个新的列表中dateBaseList.stream().map(InspectionManageEntity::getTitle).collect(Collectors.toList());2.@PathVariable注解作用@PathVariable是Spring框架中的......
  • 2024 | 大模型算法工程师相关面试题汇总及答案解析
    前言在准备大模型的面试时,我们需要对模型的基础理论、进阶应用、微调策略、以及特定技术如LangChain、参数高效微调(PEFT)等有深入的理解。这里给大家整理了一份详细的面试题,帮助大家提前进行面试复习,同时对自己的技术进行查漏补缺。一、大模型基础面试题目前主流的开源模......
  • 坐牢第十六天 20240724
    笔记1.二叉树的补充1.1二叉树的创建shu.h​​​​​​​​​​#ifndefSHU_H#defineSHU_H#include<myhead.h>typedefchardatatype;//定义节点类型typedefstructNode{datatypedata;//数据域structNode*L;//左孩子指针structNode*R;//右孩子指......
  • 坐牢第十五天 20240723
    一.笔记1.栈的补充 链式栈1>链式存储的栈,称为链式栈2>对于单链表而言,我们可以使用,使用头插头删完成一个栈,或者尾插尾删完成链式栈3>头插头删:链表的头部就是栈顶,链表的尾部就是栈底(常用)4>尾插尾删:链表的尾部就是栈顶,链表的头部就是栈底2.队列2.1队列介绍1>队列......
  • 2024年全国职业院校(中职组)技能大赛(ZZ052大数据应用与服务)持续更新中!
    2024年职业院校中职组ZZ052大数据应用与服务赛项赛题第01套【子任务一:基础环境准备】##模块一:平台搭建与运维(一)任务一:大数据平台搭建本模块需要使用root用户完成相关配置;所有组件均在/root/software目录下。1.子任务一:基础环境准备master、slave1、slave2......
  • 20240724【省选】模拟
    挂了四分,掉了一名,不过这也说明我的实力就只有这点,根本不够,果然以后还是直接【数据删除】得了。T1其实就是个树剖,每个点维护左右子树的最大深度以及左右子树内的最大答案,然后就…………没了?淦,也是实现问题,应该想到的。然后就是修改边权是改成\(w-a_p\),\(a_i\)是记录下来的\(i......
  • 学习pcie—20240724
    因为前一段时间看了xdma的IP核手册,发现只看xdma看不太懂,不清楚pcie的传输的流程,不了解报文格式,所以看看pcie手册,主要关注发送接收时序首先是pcieIP核与xdmaIP核的区别:IntegratedBlockforPCIExpress:7SeriesIntegratedBlockforPCIExpress是最基础的PCIeIP,实现的是......
  • 2024 牛客多校 3
    https://ac.nowcoder.com/acm/contest/81598睡到十点多起床,吃完早饭开打。。。下午倒是不困了,脑子还是不转a有个显然的贪心,没办法加速模拟,1WA1T后给zsy了。这种前期题没秒掉的话还是趁早丢出去吧h随机数据本地1.4s,牛客十连重测,以为卡卡常就行了,最后也没过。看榜很早......