首页 > 其他分享 >AtCoder Beginner Contest(abc) 310

AtCoder Beginner Contest(abc) 310

时间:2023-10-28 14:13:10浏览次数:35  
标签:AtCoder abc int 310 long tie Pi dp define




B - Strictly Superior

难度: ⭐

题目大意

给定n个商品的价格, 每个商品还有若干个属性, 请问是否存在一个商品是另外一个商品的上位品; 上位品的定义分两种, 一是价格相同, 但是商品A的属性不仅包括了商品B的属性, 还比商品B多了至少一个属性; 二是如果两商品的属性相同, 但是商品A的价格比商品B便宜, 则A也是B的上位品;

解题思路

数据不大, 暴力即可;

神秘代码

#include<bits/stdc++.h>
//#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e3 + 10;
typedef pair<int, int> PII;
int n, m;
int p[N], c[N],f[N][N];
int check(int a, int b) {
    for (int i = 1, j=1; i <= c[a]; i++) {
        while (j <= c[b] && f[b][j] < f[a][i]) j++;
        if (f[b][j] > f[a][i] || j > c[b]) return 0;
        else j++;
    }
    if (c[a] == c[b]) return 1;
    else return 2;
}
signed main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> p[i] >> c[i];
        for (int j = 1; j <= c[i]; j++) {
            cin >> f[i][j];
        }
        sort(f[i] + 1, f[i] + 1 + c[i]);
    }
    bool f = false;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (p[j] < p[i]) {
                int res = check(i, j);
                if (res != 0) {
                    f = true;
                    break;
                }
            }
            else if (p[j] == p[i]) {
                int res = check(i, j);
                if (res == 2) {
                    f = true;
                    break;
                }
            }
        }
        if (f) break;
    }
    if (f) cout << "Yes";
    else cout << "No";
    return 0;
}




C - Reversible

难度: ⭐

题目大意

给定n个字符序列, 问这n个序列中一共有多少个不同的序列; 对于序列的相同定义为如果一个序列与另一个序列或它的反转序列相同, 那么就可以判定为相同: abc=abc=cba;

解题思路

对于每个序列, 我们可以保存它和它反转序列中字典序较大的那个即可;

神秘代码

#include<bits/stdc++.h>
//#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 2e5 + 10;
typedef pair<int, int> PII;
int n, m;
set<string> st;
signed main(){
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        string str = s;
        reverse(s.begin(), s.end());
        st.insert(max(str,s));
    }
    cout << st.size();
    return 0;
}




D - Peaceful Teams

难度: ⭐⭐⭐

题目大意

给定编号为1~n的n个人, 要求把他们分到t个组中, 但是其中有m对死对头, 死对头不能在一个组中, 请问一共有多少种分组方法, 由于组没有编号, 所以要注意去重;

解题思路

由于n的范围很小, 所以可以考虑用dfs; 该题的难点主要在于去重, 笨方法是遍历所有可能, 最后除以t的全排列, 但是这样大概率会超时; 所以要考虑在dfs的时候去去重; 对于每个人, 我们要限制住他可以选择的组别范围; 因为要去重, 所以我们要按顺序来, 不可以跳; 如果现在已经有x个组, 那么当前这个人可以选择这x个组, 或者去一个没人的组x+1, 但注意按照去重规则他不能去x+2; 按照这样的规则最后出来的就不会有重复;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e3 + 10;
typedef pair<int, int> PII;
int n, t, m, ans = 0;
int a[50], b[50], vis[50]; 
void dfs(int k, int mx) {
    if (k == n + 1) {
        if (mx != t) return;
        for (int i = 1; i <= m; i++) {
            if (vis[a[i]] == vis[b[i]]) return;
        }
        ans++;
        return;
    }
    for (int i = 1; i <= mx + 1; i++) {
        vis[k] = i;
        dfs(k + 1, max(i, mx));
        vis[k] = 0;
    }
}
signed main() {
    cin >> n >> t >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a[i] >> b[i];
    }
    dfs(1, 0);
    cout << ans;
    return 0;
}




E - NAND repeatedly

难度: ⭐⭐⭐

题目大意

现在给定一个长为n的由0/1组成的数列P; 我们定义一种运算A^B: 0^1=1, 1^0=1, 0^0=1, 1^1=0; f(1,n)意思是((((P1P~2~)P3)P~4~)...Pn); 现在要遍历该数列, 把所有f(i,j) (i: 1~n, j: i~n)的值加起来输出; 注意: 当i=j时不会进行^运算, 其结果就是Pi本身;

解题思路

由于n的范围较大, 二重循环肯定会超时, 所以我们要去找规律; 根据定义我们可以看出, 0和任何数运算结果都是1; 也就是说如果Px=0, 那么所有f(i,x)的值都是1; 根据这个规律我们可以用dp进行求解; dp[i]的状态表示为所有右边界是Pi的区间的运算值的和; 根据i和j的范围可以知道所有右边界是第i位的区间(长度大于1)一共有i-1个; 当Pi=0时, 由前面得到规律知道此时dp[i] = i - 1; 当Pi=1时, 可以根据以Pi-1为右边界的区间进行求解; 如果该区间的运算结果为1, 那么再和1运算结果就是0, 反之如果为0的话结果就是1; 而dp[i-1]的值就意味着有多少个以Pi-1为右边界的区间的值是1, 所以我们用(i - 1) - dp[i - 1]就得到了以Pi-1为右边界的区间运算值为0的个数, 这就是以Pi为右边界的区间的运算值总和, 再加上Pi也是1, 所以dp[i] = (i - 1) - dp[i - 1] + 1

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10;
typedef pair<int, int> PII;
int n, m, res;
int f[N], dp[N];
signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        char c;
        cin >> c;
        f[i] = c - '0';
    }
    for (int i = 1; i <= n; i++) {
        if (f[i] == 1) dp[i] = (i - 1) - dp[i - 1] + 1;
        else dp[i] = i - 1;
        res += dp[i];
    }
    cout << res;
    return 0;
}




F - Make 10 Again

题目大意

解题思路

神秘代码


标签:AtCoder,abc,int,310,long,tie,Pi,dp,define
From: https://www.cnblogs.com/mostimali/p/17794033.html

相关文章

  • ABC219H Candles
    很显然的区间dp+费用提前计算。但是每个位置上的\(a_i\)还有一个上限的机制,走到某个位置上时似乎还需要判断该\(a_i\)是否已被减完。但其实不需要,因为一旦选到负的\(a_i\),就一定不再是最优解了,所以我们可以将走到\(a_i\)不大于\(0\)的位置时的决策看作不选,否则看作选,那......
  • 20231005比赛
    T14883.灵知的太阳信仰Description在炽热的核熔炉中,居住着一位少女,名为灵乌路空。据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量——核能。核焰,可融真金。咳咳。每次核融的时候,空都会选取一些原子,排成一列。然后,她会将原子序列分成一些段,并将每段进行一次......
  • AtCoder Beginner Contest 325
    感觉错失了上分机会A-Takahashisan(abc325A)题目大意给定姓和名,输出尊称,即姓+san。解题思路按照题意模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(......
  • 20231027
    23/10/27NOIP模拟赛总结时间安排:7:40-8:30看T1,没啥思路,一开始以为是组合数,写了个递推求组合数发现是最简单的DP,测样例,手搓了几组小样例都过了。8:30-8:50T2只会模拟,写的get函数有点麻烦,耽误了一些时间。9:00-9:30看T3T4都没想到,去写T5暴力。9:30-10:20T5暴力取模的地方......
  • 20231027NOIP训练赛
    20231027NOIP训练赛时间安排7:40-9:20写T19:20-10:20写T210:20-11:10写T3T411:10-11:50写T5总结T1写挂了,T3的set超时了题解T1简单DP题T2把加转化为差分,差分数组进行区间加操作,用线段树维护T3用一个栈维护一下没有被匹配的字符即可T4结论题,答案要么删掉一个点,要......
  • 20231027
    20231027NOIP#25总结时间安排7:40~8:10看题\(A\)一眼切,\(B,C,D,E\)都不会。8:10~8:30写\(A\),但这个题坑真多。8:30~8:50写\(C\),这个好像是原题。8:50~9:50写\(B\),带些许数学的模拟,有点难写。9:50~10:35写\(E\)的前两档,但第二档做法假了。10:35~11:30反应了......
  • [ABC299G] Minimum Permutation
    ABC229G洛谷链接atcoder链接容易发现如果最终答案有两个相邻的数\(b_i,b_{i+1}\)满足\(b_i>b_{i+1}\)且\(b_i\)之后出现过,则显然可以找到另一个不劣的答案不满足这个性质先说一个错误的结论:从前往后考虑,用链表维护答案,对于加入的一个数\(a_i\),如果之前在\(a_j\)出现......
  • AtCoder Beginner Contest 216 H Random Robots
    洛谷传送门AtCoder传送门下文令\(n\)为原题中的\(K\),\(m\)为原题中的\(N\)。首先概率转方案数,最后除\(2^{nm}\)即可。考虑一个指数级暴力:枚举每个bot的终点\(y_i\)(因为存在不能相交的限制,需要满足\(y_1<y_2<\cdots<y_n\)),相当于为每个bot选一个\((0,x_i)......
  • ABC219 H 区间dp 费用提前计算
    ABC219H跟关路灯很像。很容易注意到我们拿走的只能是一个区间,观察n的范围发现区间dp是个好想法。朴素的想法是定义\(f_{i,j,k,0/1}\)为拿走i到j里面的所有数,走了k秒,现在在i/j的方案数。然后发现k太大了。咱当时的想法是希望优化复杂度,把k去掉结果发现不能保证正确性。......
  • 20231026打卡·
    上午的课程是算法与数据结构中的图。图是一种非常重要的数据结构,用于描述事物之间的关系和连接。在这门课上,我们学习了图的基本概念、表示方法以及常见的图算法。通过理论讲解和实践编程练习,我对图的理解和应用有了更深入的认识。图算法对于解决许多实际问题都非常有用,我会在日常......