首页 > 其他分享 >2024.11.27 周三

2024.11.27 周三

时间:2024-11-27 19:11:59浏览次数:5  
标签:vector 2024.11 return cout int 27 周三 define row

2024.11.27 周三

  • Q1. 1000
    给定x,y,设ai=i^x,bi=i^y,问两个无穷序列a和b的最长公共子序列的长度。

  • Q2. 1400
    给定一条链,所有点未激活,在开始点放一棋子并激活,2人轮流操作:将棋子移动到相邻的未激活的点并激活。不能操作者输。问均最优策略的赢家。

  • Q3. 1600
    给你两个大小为n×m的矩阵a,b,其中元素的是n×m的排列,你可以任意进行行变换/列变换,问是否通过操作使得矩阵a变成矩阵b。

  • A1. 补:怎么感觉今天的题1000分的最难 >_<
    神秘位运算题 "看到本题的数据范围,可以猜想这是一道结论题,结合样例就出了。"
    [l,r]⊕x=[l′,r′]⊕y => [l,r]=[l′,r′]⊕(x⊕y)。令v=(x⊕y),即求最长的 [l,r]使得异或上v后依然连续。
    如果 v=abc100000,任意 l=cde100000,r=cde111111一定是最长的,答案为lowbit(v)。

  • A2. 补:我就说对不上样例得"仔细"重读题吧,读漏了。
    显然只有第一步操作有2种选择,其余操作没有选择,且奇数为必胜态。直接搜索两侧链的点数,若有奇数便可胜。

  • A3. 13mins-33mins 假思路:最初的想法是判断每一行的和和每一列的和,但是不严谨。行和只是必要条件,非充分。后又想到用行首元素vector存其余元素,然后发现判断困难。
    发现无论怎么交换同一行和同一列中的元素种类是不会改变的,只会改变相对位置。 因此答案就是判断a中每一行和每一列在b中是否有无序版。
    判断方式多样如哈希,我这里直接使用并查集把a每一行看成一个集合,在b中判断是否冲突,列同理。

A1.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     //
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
const int mod = 998244353;
const int N = 10 + 5e5;
void _();
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        _();
    return 0;
}

//  给定x,y,设ai=i^x,bi=i^y,问两个无穷序列a和b的最长公共子序列的长度。

//  神秘位运算题 "看到本题的数据范围,可以猜想这是一道结论题,结合样例就出了。"
//  [l,r]⊕x=[l′,r′]⊕y => [l,r]=[l′,r′]⊕(x⊕y)。令v=(x⊕y),即求最长的 [l,r]使得异或上v后依然连续。
//  如果 v=abc100000,任意 l=cde100000,r=cde111111一定是最长的,答案为lowbit(v)。
void _()
{
    int x, y;
    cin >> x >> y;
    auto lowbit = [](int x)
    {
        return x & -x;
    };
    cout << lowbit(x ^ y) << endl;
}

A2.

#include <bits/stdc++.h>
// #define int long long //
#define endl '\n' // 交互/调试 关
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
        _();
    return 0;
}

//  给定一条链,所有点未激活,在开始点放一棋子并激活,2人轮流操作:将棋子移动到相邻的未激活的点并激活。不能操作者输。问均最优策略的赢家。
//  我就说对不上样例得"仔细"重读题吧,读漏了。
//  显然只有第一步操作有2种选择,其余操作没有选择,且奇数为必胜态。直接搜索两侧链的点数,若有奇数便可胜。
void _()
{
    int n, t;
    cin >> n >> t;
    vector<vector<int>> e(n + 1);
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    int st = 0;
    cin >> st;
    vector<int> vis(n + 1);
    function<int(int)> dfs = [&](int u)
    {
        if (vis[u])
            return 0;
        vis[u] = 1;
        int cnt = 1;
        for (auto v : e[u])
            cnt += dfs(v);
        return cnt;
    };
    vis[st] = 1;
    bool f = 0;
    for (auto u : e[st])
        if (dfs(u) & 1)
            f = 1;
    cout << (f ? "Ron" : "Hermione") << endl;
}

A3.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 交互/调试 关
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

//  给你两个大小为n×m的矩阵a,b,其中元素的是n×m的排列,你可以任意进行行变换/列变换,问是否通过操作使得矩阵a变成矩阵b。

//  假思路:最初的想法是判断每一行的和和每一列的和,但是不严谨。行和只是必要条件,非充分。后又想到用行首元素vector存其余元素,然后发现判断困难。
//  发现无论怎么交换同一行和同一列中的元素种类是不会改变的,只会改变相对位置。 因此答案就是判断a中每一行和每一列在b中是否有无序版。
//  判断方式多样如哈希,我这里直接使用并查集把a每一行看成一个集合,在b中判断是否冲突,列同理。
//  13mins-33mins

// 带权并查集
vector<int> p, vs, es; // 集合数 点数 边数 (对一个连通块而言)
void init(int n1)      // p[x]不一定为根节点  find(x)一定是根节点
{
    int n = n1 + 2;
    p.assign(n, 0);
    vs.assign(n, 0);
    es.assign(n, 0);
    for (int i = 1; i <= n1; i++)
        p[i] = i, vs[i] = 1, es[i] = 0;
}
int find(int x) // 找到根节点
{
    if (p[x] == x)
        return x;
    int px = find(p[x]);
    return p[x] = px;
}
bool same(int a, int b)
{
    return find(a) == find(b);
}
void merge(int a, int b) // 合并集合
{
    int pa = find(a);
    int pb = find(b);
    if (pa == pb) // pa pb 均为根节点 p[pa]==pa
    {
        es[pa]++; // 1个集合 边+1
        return;
    }
    p[pb] = p[pa];        // 改变b的根节点
    vs[pa] += vs[pb];     // 将b合并进a
    es[pa] += es[pb] + 1; // 2个集合
}
int size(int a) //  集合内的元素的个数
{
    return vs[find(a)];
}
//  init(n);

void _()
{
    int n, m;
    cin >> n >> m;
    init(n * m);
    vector<vector<int>> a(n + 1, vector<int>(m + 1)), b(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            if (j - 1)
                merge(a[i][j], a[i][1]);
        }

    bool f = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> b[i][j];
            if (j - 1 && !same(b[i][j], b[i][1]))
                f = 0;
        }
    }
    init(n * m);
    for (int j = 1; j <= m; j++)
        for (int i = 1; i <= n; i++)
            if (i - 1)
                merge(a[i][j], a[1][j]);
    for (int j = 1; j <= m; j++)
        for (int i = 1; i <= n; i++)
            if (i - 1 && !same(b[i][j], b[1][j]))
                f = 0;
    cout << (f ? "YES" : "NO") << endl;
}
// void _()
// {
//     int n, m;
//     cin >> n >> m;
//     vector<vector<int>> a(n + 1, vector<int>(m + 1)), b(n + 1, vector<int>(m + 1));
//     map<int, vector<int>> a_row, b_row;
//     for (int i = 1; i <= n; i++)
//     {
//         int x;
//         for (int j = 1; j <= m; j++)
//         {
//             cin >> a[i][j];
//             if (j == 1)
//                 x = a[i][j];
//             a_row[x].push_back(a[i][j]);
//         }
//     }
//     for (int i = 1; i <= n; i++)
//     {
//         int x;
//         for (int j = 1; j <= m; j++)
//         {
//             cin >> b[i][j];
//             if (j == 1)
//                 x = b[i][j];
//             b_row[x].push_back(b[i][j]);
//         }
//     }
//     bool f = 1;
//     for (auto &[x, a] : a_row)
//     {
//         auto &b = b_row[x];
//         sort(a.begin(), a.end());
//         sort(b.begin(), b.end());
//         if (a != b)
//             f = 0;
//     }
//     cout << (f ? "YES" : "NO") << endl;
// }
// void _()
// {
//     int n, m;
//     cin >> n >> m;
//     vector<vector<int>> a(n + 1, vector<int>(m + 1)), b(n + 1, vector<int>(m + 1));
//     map<int, int> a_row, b_row, a_col, b_col;
//     for (int i = 1; i <= n; i++)
//     {
//         int s = 0;
//         for (int j = 1; j <= m; j++)
//         {
//             cin >> a[i][j];
//             s += a[i][j];
//         }
//         a_row[s]++;
//     }
//     for (int i = 1; i <= n; i++)
//     {
//         int s = 0;
//         for (int j = 1; j <= m; j++)
//         {
//             cin >> b[i][j];
//             s += b[i][j];
//         }
//         b_row[s]++;
//     }
//     for (int j = 1; j <= m; j++)
//     {
//         int s = 0;
//         for (int i = 1; i <= n; i++)
//             s += a[i][j];
//         a_col[s]++;
//     }

//     for (int j = 1; j <= m; j++)
//     {
//         int s = 0;
//         for (int i = 1; i <= n; i++)
//             s += b[i][j];
//         b_col[s]++;
//     }

//     int f = 1;
//     for (auto [s, cnt] : a_row)
//         if (cnt - b_row[s])
//             f = 0;
//     for (auto [s, cnt] : a_col)
//         if (cnt - b_col[s])
//             f = 0;
//     cout << (f ? "YES" : "NO") << endl;
// }

标签:vector,2024.11,return,cout,int,27,周三,define,row
From: https://www.cnblogs.com/jkkk/p/18572911

相关文章

  • 1127noip模拟赛(命运fate)
    智慧t2,我不智慧,赛时想到了一点点。。题意:给一个单调不降的序列\(a_1,a_2,...,a_n\)。给定一个整数\(x\)。求一个\(b\)序列使得任意\(\foralli(1<i\len)\a_i-b_i<a_{i+1}-b_{i+1}\)且\(\foralli<j<x\\b_i\leb_j.\forallx<j<i\\b_i\leb_j\)。做法:整理一......
  • 11.27 模拟赛
    复盘T1一眼不会。模拟样例的时候好像得到了一个对于每次询问\(\mathcalO(n)\)做的暴力算法。不太清楚。画了点图。差不多得到一点想法。发现用set维护连通块,总复杂度\(\mathcalO(n\log^2n)\),1e6肯定过不去。但应该能过80。写写试试。然后写了一坨。实际上这个时候......
  • 985研一学习日记 - 2024.11.26
    一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。日常1、起床6:002、健身1.5h3、LeetCode刷了0题今天没刷题,这几天应该都不咋会刷题了4、复盘22:30不复盘等于白学!!!学习和感想JUC并发编程1.JUC线程池概述和架构通过线程池......
  • 【快慢指针技巧】:高效解决链表和数组问题(26,83,27)
    ......
  • 2024年11月27日 比较字符的ASCII码值
    浅浅的随笔`#define_CRT_SECURE_NO_WARNINGS1//创建一个字符chara[10]//键盘输入十个字母并输出//找出ASCII最大值和最小值的字母//对数组进行排序(降序)#include<stdio.h>#defineN10intmain(){ chararr[N]={0};//创建数组 inti=0; printf("输入10个字......
  • 11月27日总结
    今天完成看了软件设计的实验内容实验25:访问者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容[实验任务一]:打包员在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。实验24:模板方法模式[实验任务一]:数据库连接对数据库的操作......
  • 2024.11.26 周二日常
    2024.11.26周二日常Q1.1200给定一数组k(代表n个人的倍率),设在每个人上投资为xi,若其胜利则获k*xi,最终一人胜利。问是否可以保证无论谁胜利,收益大于总投资的方案。(n<=20,k<=50)Q2.1300给定一数组,问最小的k使所有长度为k的区间按位或相等。Q3.1500给定一数组,定......
  • 2024.11.26
    要修改表中的主键字段名称,你需要执行以下步骤:删除现有的主键约束。修改字段名称。重新添加主键约束。以下是针对你的需求,对tb_task_assignment表进行修改的SQL语句:步骤1:删除现有的主键约束首先,你需要删除现有的主键约束。这通常涉及到查询数据库的元数据来找到主键约束......
  • 【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024,12
    第四届人工智能、机器人和通信国际会议(ICAIRC2024)20244thInternationalConferenceonArtificialIntelligence,Robotics,andCommunication重要信息会议官网:www.icairc.net三轮截稿时间:2024年11月30日23:59录用通知时间:投稿后1周左右会议检索:IEEE......
  • 2024.11.16 test
    B有三种比赛的场地,每种场地都给出选手能力的排名,每次交换两个人在某个场地的排名,或者查询某个人是否有安排比赛的方法使得他赢得比赛,即其他所有人都被某个没有被还击败的人击败过。考虑转化为图论,一个场地能力能力排\(i\)的向\(i+1\)建边,那么问题就变成了\(x\)出发能否遍......