首页 > 其他分享 >AtCoder Beginner Contest 342

AtCoder Beginner Contest 342

时间:2024-03-02 17:55:39浏览次数:24  
标签:AtCoder Beginner int cin long 342 tie dis define




B - Which is ahead?

难度: ⭐

题目大意

给定n个人的位置顺序, 现有m次询问, 给出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 = 2e5 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n, m, k;
int p[N];
signed main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        p[x] = i;
    }
    cin >> m;
    for(int i = 1; i <= m; i++){
        int a, b;
        cin >> a >> b;
        if(p[a] < p[b]) cout << a << endl;
        else cout << b << endl;
    }
	return 0;
}




C - Many Replacement

难度: ⭐⭐⭐

题目大意

现有字符串s, 现有m次操作, 每次操作给出两个字符a, b; 要求把字符串s中所有的a都换成b; 最后输出字符s

解题思路

本题可以用哈希来做, 开一个长度为26的数组p[26]用来表示此时的字母x表示的是哪个字母, 初始当然都是自己; 每次修改时, 先遍历26个字母, 看都有谁的p[i] = a, 然后把它们都改成b即可; 最后输出s的时候输出每个字母所对应的p即可;

神秘代码

#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, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n, m, k;
string s;
int p[N];
signed main(){
    cin >> n >> s >> m;
    for(int i = 0; i < 26; i++) p[i] = i;
    while(m--){
        char a, b;
        cin >> a >> b;
        for(int i = 0; i < 26; i++){
            if(p[i] == a - 'a') p[i] = b - 'a';
        }
    }
    for(int i = 0; i < n; i++){
            printf("%c", p[s[i] - 'a'] + 'a');
        }
	return 0;
}




D - Square Pair

难度: ⭐⭐⭐

题目大意

给定n个数字Ai, 问有多少个满足条件的二元组(i, j), 条件如下
一是Ai * Aj是一个平方数;
二是i < j;

解题思路

暴力做法是O(n2)显然会超时, 所以要从平方数下手; 已知定理, 任何一个数都可以化为多个质数的乘积; 如果a * b是一个平方数并且a != b的话, 我们把组成a和b的质数都列出来, 并且让两者同一质数的数量相加, 那么我们会发现所有质数的数量都是偶数, 因为这样才会相乘是一个平方数; 由这一发现还不足以解题, 所以我们可以先把a和b进行化简, 拿a来说, 把组成a的质数列出来之后可以把其中数量大于等于2的质数数量减到0或1, 用代码实现就是遍历小于a的平方数, 让a减去其中可以被a整除的; 化简完后我们发现a = b, 这样我们就可以解题了; 把所有数化简后遍历数组, 对于数字a, 结果res就加上cnt(a) - 1; cnt(a)指数组中a的数量; 又因为二元组要求i < j; 所以最后res要除以二;
本题还有个特殊情况就是0, 0可以和任何数搭配, 所以只需要关心i < j即可; 对于下标i, 我们用cnt[i]记录前i个数字中有几个0; 对于每个0, 我们将其看作二元组的前一个; 所以结果加上n - cnt[i]即可;

神秘代码

#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, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n, m, res;
string s;
int p[N], cnt[N];
map<int, int> mp;
signed main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> p[i];
        for(int j = 2; j * j <= p[i]; j++){
            while(p[i] % (j * j) == 0){
                p[i] /= (j * j);
            }
        }
        mp[p[i]]++;
        cnt[i] = cnt[i - 1] + (p[i] == 0);
    }
    int a = 0, b = 0, c = n - 1;
    for(int i = 1; i <= n; i++){
        if(p[i] == 0) {
            a += n - cnt[i];
        }
        else b += (mp[p[i]] - 1);
    }
    cout << a + b / 2;
	return 0;
}




E - Last Train

难度: ⭐⭐⭐⭐

题目大意

现有n个车站, 每个车站都有6个属性, l, d, k, c, A, B; 从时刻l开始发车, 每隔时间d发一辆, 一共发k辆; 并且火车是从A点前往B点, 所需时间是c; 设F(x)指从车站x的车最晚什么时候出发可以到车站n;

解题思路

因为所有车站的目标都是n, 那么我们可以从车站n开始反向进行最短路dijkstra; 找到从v出发可以到达u的最晚的一班车; 如果v的l + c > F(u); 则说明从v来的车赶不上u的满足条件的最晚的那班车; 否则我们找的车次就是num = min((F(u) - (l + c)) / d, k - 1); 然后就可以用l + num * d来更新F(u);

神秘代码

#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, mod = 998244353, inf = 2e18;
typedef pair<int, int> PII;
int n, m, res;
string s;
struct node{
    int u, l, d, k, c;
};
node P[N];
vector<node> v[N];
int dis[N];
void dijkstra(){
    for(int i = 1; i <= n; i++) dis[i] = -inf;
    priority_queue<PII> heap;
    heap.push({inf, n});
    dis[n] = inf;
    while(heap.size()){
        PII t = heap.top();
        heap.pop();
        int id = t.second;
        for(auto x : v[id]){
            int y = dis[id] - (x.l + x.c); 
            if(y < 0) continue;
            int num = x.l + min(y / x.d, x.k - 1) * x.d;
            if(num > dis[x.u]){
                dis[x.u] = num;
                heap.push({dis[x.u], x.u});
            }
        }
    }
}
signed main(){
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        int l, d, k, c, a, b;
        cin >> l >> d >> k >> c >> a >> b;
        v[b].push_back({a, l, d, k, c});
    }
    dijkstra();
    for(int i = 1; i < n; i++){
        if(dis[i] == -inf) cout << "Unreachable" << endl;
        else cout << dis[i] << endl;
    }
	return 0;
}




F - Black Jack

难度: ⭐⭐⭐⭐

标签:AtCoder,Beginner,int,cin,long,342,tie,dis,define
From: https://www.cnblogs.com/mostimali/p/18048987

相关文章

  • AtCoder DP Contest vp 记录
    题单。A从\(i-1\)与\(i-2\)转移即可。#include<bits/stdc++.h>usingnamespacestd;intn;inth[100031];intdp[100031];intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>h[i]; memset(dp,0x3f,sizeof(dp)); dp[1]=0; for(inti=1;i<......
  • ABC342
    Clink我们可以把所有字母都存上,代表换到最后这个字母换成什么了,当然最开始就是它本身。那么,把\(c\)改成\(d\)的时候,就只要把所有等于\(c\)的都改成\(d\)就行了。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,q;chars[200005];inta[30];signed......
  • p3426-solution
    P3426Solutionlink考虑dp。设\(dp_i\)表示至\(i\)的字符串的答案。KMP求出nxt数组,那么显然\(dp_i\)要么等于\(i\)要么等于\(dp_{nxt_i}\)。什么时候\(dp_i\)等于\(dp_{nxt_i}\)呢?这时这个字符串一定由一个与\(nxt_i\)有相同\(dp\)值的前缀再印上一个bo......
  • AtCoder Regular Contest 172
    Preface开学了小溜一下之前没打的ARC,结果这场后面没有计数改成数论了又给我创飞了这场的DE都太玄学了,属于是自己想半天一点屌思路没有然后看一眼题解就顿悟的类型总结就是菜得发昏A-Chocolate挺有意思的签到题考虑从大到小依次切,对于一个原来\(H'\timesW'\)的块,为了尽量......
  • 数组关系_ABC342_D - Square Pair
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D-SquarePair对于长度为n的数组,给出满足要求的数对对数:i<ja[i]*a[j]是一个平方数思路想法其实和以前的数组关系那题差不多,也是找关系,就是关系找不出来而已,对于两数相乘为平方数应该怎么考虑,可以知道对于任意数......
  • [ABC342D] Square Pair 题解
    洛谷传送门原题传送门题意给出一个数列\(A\),求出满足\(A_iA_j\)为完全平方数的无序数对\((i,j)\)的个数。分析容易想到(但是我在昨晚没想到,可以原地AFO了),对于每个数,如果是\(0\)的话可以直接统计答案(记录\(0\)的个数\(cnt\),最后\(ans\leftarrowans+cnt(n-cnt)+\f......
  • [ABC342E] Last Train 题解
    洛谷传送门原题传送门题意给出一些由\((l,d,k,c,A,B)\)描述的列车,表示每当时间为\(l,l+d,l+2d,\cdots,l+(k-1)d\)时有一半列车从\(A\)出发,经过\(c\)的时间到达\(B\)。问如果从站点\(i,i\in(0,n)\)出发要去站点\(n\),最晚什么时候到达站点\(i\)可以去到站点\(n\)......
  • [ABC342C] Many Replacement 题解
    洛谷传送门原题传送门题意给出由小写字母初始字符串,每次操作将字符串中所有为\(c\)的字符改为\(d\)。输出最终的字符串。分析很明显只需要开一个\(fa\)数组,其中\(fa[i]=j\)表示字母\(i\)被改为了\(j\)。对于每次操作只需要遍历\(26\)个字母,将\(fa[i]=c\)的那些......
  • [ABC342G] Retroactive Range Chmax 题解
    洛谷传送门原题传送门题意维护一个数列,有以下三个操作:区间最值操作,即将\([l,r]\)区间内的\(A_i\)变成\(\max(A_i,v)\)。删除操作操作,即将第\(i\)次操作删除,保证第\(i\)次操作是操作\(1\),且未被删除。注:仅删除第\(i\)次操作,后续操作仍然在。查询,询问当前的......
  • AtCoder Beginner Contest 342
    AtCoderBeginnerContest342比赛链接开学了,以后codeforces大概率只能补题了,但是atcoder还是可以做的A-Yay!思路找出只出现一次的字符就可以Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ strings; cin>>s; std::map<ch......