AtCoder Beginner Contest 217 A B C D E G 题解

Posted yueshehanjiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 217 A B C D E G 题解相关的知识,希望对你有一定的参考价值。


纪 念 我 第 一 次 非 严 格 意 义 上 的 A K 纪念我第一次非严格意义上的AK AK

A - Lexicographic Order

题意
s 字 符 串 的 字 典 序 是 否 小 于 t s字符串的字典序是否小于t st
思路
模 拟 模拟
时间复杂度 O 1 O1 O1

#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define de(x) cout << x << "\\n" 
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
const int N = 1e6 + 10 , M = 2010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
 
signed main()
{
    string s , t ;
    cin >> s >> t ;
    if(s < t) puts("Yes") ;
    else puts("No") ;
    return 0;
}

B - AtCoder Quiz

题意
给 定 4 个 不 同 的 字 符 串 给定4个不同的字符串 4
输 入 三 个 不 同 字 符 串 , 求 没 有 出 现 过 的 那 个 输入三个不同字符串,求没有出现过的那个 ,
思路
模 拟 模拟
时间复杂度 O 1 O1 O1

#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define de(x) cout << x << "\\n" 
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
const int N = 1e6 + 10 , M = 2010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
map<string,int> q ;
signed main()
{
    string x ;
    
    q["ABC"] ++ ;
    q["ARC"] ++ ;
    q["AGC"] ++ ;
    q["AHC"] ++ ;
    
    for(int i = 1 ; i <= 3 ; i ++)
    {
        cin >> x ;
        q[x] ++ ;
    }
    
    for(auto i : q)
    {
        if(i.y == 1) 
        {
            cout << i.x << "\\n" ;
            break ;
        }
    }
    return 0;
}

C - Inverse of Permutation

题意
给 定 一 个 n 的 排 列 给定一个n的排列 n
求 对 所 有 的 [ 1 < = i < = n ] 等 于 i 的 下 标 求对所有的[1 <= i <= n ] 等于i的下标 [1<=i<=n]i
思路
模 拟 模拟
时间复杂度 O n On On

#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define de(x) cout << x << "\\n" 
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
const int N = 1e6 + 10 , M = 2010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int n ;
int a[N] ;
int q[N] ;
signed main()
{
    cin >> n ;
    
    fer(i,1,n) sf(a[i]) ;
    
    fer(i,1,n)
    {
        q[a[i]] = i ;
    }
    
    
    fer(i,1,n)
    {
        cout << q[i] << " " ;
    }
    return 0;
}

D - Cutting Woods

题意
一 开 始 有 一 根 木 棒 一开始有一根木棒
长 度 为 n 长度为n n
从 1 到 n 编 号 从1到n编号 1n
输 入 q 个 操 作 输入q个操作 q

操 作 1 操作1 1
断 开 x 所 在 的 木 棒 断开x所在的木棒 x
[ 1 , n ] 断 开 x 变 成 了 [ 1 , x ] [ x + 1 , n ] [1,n] 断开x变成了 [1,x] [x+1,n] [1,n]x[1,x][x+1,n]

操 作 2 操作2 2
询 问 x 所 在 的 区 间 长 度 询问x所在的区间长度 x

q < = 1 e 5 q <= 1e5 q<=1e5
n < = 1 e 9 n <= 1e9 n<=1e9
1 < = x < = 1 e 9 1 <= x <= 1e9 1<=x<=1e9
思路
有 个 很 重 要 的 性 质 有个很重要的性质
分 割 之 后 左 边 以 及 右 边 这 个 区 间 的 答 案 是 固 定 的 分割之后左边以及右边这个区间的答案是固定的
也 就 是 说 答 案 只 跟 分 割 点 有 关 也就是说答案只跟分割点有关
比 如 区 间 [ l , r ] 分 割 x 变 成 了 [ l , x ] , [ x + 1 , r ] 比如区间[l,r] 分割x变成了[l,x] , [x+1,r] [l,r]x[l,x],[x+1,r]
可 以 发 现 可以发现
l 到 x 这 个 区 间 的 询 问 答 案 都 是 x − l + 1 l到x这个区间的询问答案都是x-l+1 lxxl+1
x + 1 到 r 这 个 区 间 的 询 问 答 案 都 是 r − ( x + 1 ) − 1 x+1到r这个区间的询问答案都是r-(x + 1) - 1 x+1rr(x+1)1

所 以 可 以 考 虑 二 分 找 到 所 在 区 间 相 邻 2 个 的 分 割 点 下 标 所以可以考虑二分找到所在区间相邻2个的分割点下标 2
先 考 虑 边 界 问 题 先考虑边界问题
边 界 无 非 是 0 − n + 1 / 0 − n / 1 − n / 1 − n + 1 边界无非是0 - n + 1 / 0 - n / 1 - n / 1 - n + 1 0n+1/0n/1n/1n+1
以上是关于AtCoder Beginner Contest 217 A B C D E G 题解的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242