ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 253 A - E

2022-05-29 13:31:07  阅读:191  来源: 互联网

标签:AtCoder const Beginner int ll cin maxn 253 include


传送门

A - Median?

找中间数

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
int num[maxn];

int main()
{
    for(int i=0; i<3; i++) cin >> num[i];
    int a = num[1];
    sort(num, num + 3);
    if(a == num[1]) cout << "Yes" << endl;
    else cout << "No" << endl;

    return 0;
}

B - Distance Between Tokens

找起点和终点的曼哈顿距离

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
string s[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    for(int i=0; i<n; i++)
        cin >> s[i];
    int sx = -1, sy, ex, ey;
    int cnt = 0;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(s[i][j] == 'o')
            {
                if(cnt == 0)
                {
                    sx = i;
                    sy = j;
                    cnt++;
                }
                if(cnt == 1)
                {
                    ex = i;
                    ey = j;
                }
            }
        }
    }
    
    
    cout << abs(ex - sx) + abs(ey - sy) << endl;

    return 0;
}

C - Max - Min Query

可以直接用 map 维护就好了

我是用 set 维护,然后 map 判断什么时候删除和增加

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
string s[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int q;
    cin >> q;
    set<int>s;
    map<int, int>vis;
    while(q--)
    {
        int t;
        cin >> t;
        if(t == 1)
        {
            int x;
            cin >> x;
            if(++vis[x] == 1) s.insert(x);
        }
        else if(t == 2)
        {
            int x, cc;
            cin >> x >> cc;
            int way = min(cc, vis[x]);
            vis[x] -= way;
            if(vis[x] == 0 && way != 0) s.erase(x);
        }
        else
        {
            auto it = s.end();
            it--;
            cout << (*it - *s.begin()) << endl;
        }
    }
    return 0;
}

D - FizzBuzz Sum Hard

我写的极其复杂

直接等差数列,减去 a 的倍数,减去 b 的倍数,加上 a 和 b 的公倍数

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
string s[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n, a, b;
    cin >> n >> a >> b;
    ll ab = a / __gcd(a, b) * b;
    ll t = n / ab;
    ll sum = 0;
    if(t)
    {
        sum += (1 + ab) * ab / 2;
        sum -= ab * (ab / a - 1) / 2;
        sum -= ab * (ab / b - 1) / 2;
        sum -= ab;
        sum *= t * t;
    }
    // cout << sum << endl;
    if(n % ab)
    {
        ab = t * ab;
        ll ta = (n - ab) / a;
        ll tb = (n - ab) / b;
        sum -= (ab + a + ab + ta * a) * ta / 2;
        sum -= (ab + b + ab + tb * b) * tb / 2;
        sum += (1 + ab + n) * (n - ab) / 2;
    }
    cout << sum << endl;
    return 0;
}

E - Distance Sequence

dp

\(dp[i][j]\) 表示第 \(i\) 个数字是 \(j\) 的时候的方案数

状态转移:\(dp[i][j] = \sum{}{} dp[i-1][v]\),\(v\) 表示当第 \(i\) 个数字为 \(j\) 时,第 \(i - 1\) 个数字满足相差绝对值不小于 \(k\) 的数字

纯转移的话复杂度很高,可以考虑用前缀和处理一下,复杂度为 \(O(nm)\)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 1010;
const ll inf = 1e17 + 10;
const ll mod = 998244353;
ll dp[maxn][maxn * 5];
ll sum[maxn];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n, m, k;
    cin >> n >> m >> k;
    for(int i=1; i<=m; i++) {dp[0][i] = 1; sum[i] = sum[i-1] + 1;}
    for(int i=1; i<n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            ll l = j - k;
            ll r = j + k;
            l++;
            r--;
            l = max(1ll, l);
            r = min(m, r);
            dp[i][j] = (mod + sum[m] - max(0ll, sum[r] - sum[l-1])) % mod;
        }
        for(int j=1; j<=m; j++)
            sum[j] = sum[j-1] + dp[i][j];
        // cout << "now: ";
        // cout << sum[m] << endl;
    }
    cout << sum[m] % mod << endl;
    return 0;
}

F - Operations on a Matrix

F 到现在都没过,我的想法是对于每次询问,找到最近的改变行的操作,然后将那个坐标的差值用 map 储存起来

然后列的叠加还是用树状数组维护,但是现在死活过不去

标签:AtCoder,const,Beginner,int,ll,cin,maxn,253,include
来源: https://www.cnblogs.com/dgsvygd/p/16323701.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有