AtCoder Beginner Contest 221 题解


A:Seismic magnitude scales

题意:

\((a-b)^{32}\)

思路:

直接求即可。

B:typo

题意:

定义一种操作为交换两个字符串相邻的字符,问是否能做到至多进行一次操作使得两个字符串相等。

\(len\leq1e5\)

思路:

检查两个字符串对应位不相等的个数,如果不为 \(0\)\(2\) 则无法完成,否则看两个不相等字符的是否相邻。

C:Select Mul

题意:

给定一个数 \(n\)\(1\leq n\leq 10^9\)),把这个数的每个位变成序列的一个元素,问在这个序列的排列找一个位置使得左边组成的数和右边组成的数乘积最大 ,输出乘积。

思路:

依题意模拟即可,在变成序列后可以考虑使用 \(next\_permutation\) 函数获取下一个排列,在每个排列中暴力枚举分割位置 ,最多进行 \(9! \times 8\) 次。

D:Online games

题意:

给定 \(n\) 个区间 \([~l_i,l_i+r_i-1~]\) ,输出 \(n\) 行,第 \(i\) 行表示有几个点恰好属于 \(i\) 个区间。

思路:

不妨设 \(r_i=r_i+l_i-1\) ,这样会变得很方便,可以考虑把所有 \(l_i\)\(r_i\) 扔到一个长度为 \(2\times n\) 的序列 \(a\) 里以便离散化,对他进行排序和去重,避免端点重合但不更新答案的情况。用 \(x_i\) 记录当前位置被几条线段覆盖 ,每次 \(l_i\)\(r_i\) 并更新答案,即 \(x_{l_i}=x_{l_i}+1\)\(x_{r_i}=x_{r_i}-1\) ,对 \(x_i\) 前缀和可以得到属于几个区间,直接统计答案即可 。

复杂度:\(O(n\log n)\) ,在找 \(l_i\)\(r_i\) 时可以二分

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[400005],num[400005],x[400005];
ll l[400005],r[400005],n;
map<ll,ll>ans;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>l[i]>>r[i];
        r[i]+=l[i]-1;
        r[i]++;
        a[2*i]=l[i];
        a[2*i+1]=r[i];
    }
    sort(a,a+2*n);
    int m=unique(a,a+2*n)-a;
    for(int i=0;i<n;i++)
    {
        int lq=lower_bound(a,a+m,l[i])-a;
        int rq=lower_bound(a,a+m,r[i])-a;
        x[lq]++,x[rq]--;
    }
    num[0]=x[0];
    for(int i=1;i<m;i++)
    {
        num[i]=num[i-1]+x[i];
    }
    for(int i=0;i<m;i++)
    {
        ans[num[i]]+=a[i+1]-a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cout<<ans[i]<<" ";   
    }
    system("pause");
}

E:LEQ

题意:

求序列的子序列 \(a\) 满足 \(a_i\leq a_j\)\((i<j)\) 的数对 \((i,j)\) 的个数

\(1\leq n\leq 3\times10^5\)

思路:

其实就是求解 \(\sum_{1\leq i\leq j\leq n}~2^{j-i-1}\times[~a_i\leq a_j~]\) ,非正序对中间选或不选所以是 \(2^{j-i-1}\)

然后就是二维偏序板子了


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM