首页 > 其他分享 >YACS 2022年11月月赛 乙组 T1 数对统计 题解

YACS 2022年11月月赛 乙组 T1 数对统计 题解

时间:2022-11-22 18:55:07浏览次数:49  
标签:右边 int 题解 数对 乙组 100005 左边 统计

好久没更了,闲话一句,我的初赛成绩只有 $71.5$,$76$ 才能进 $NOIP$,所以就更一篇吧

首先先考虑暴力算法,枚举两个数,设这两个数为 $x$ 和 $y$,

如果 $f[x][y]=false$,那就标记为 $true$,$ans ++$

这种方法可以优化,怎么优化呢?

假如一个序列里出现了好几个 $x$,但是和 $x$ 能构成序对的只有两种情况:

$x$ 在左边,另一个在右边

$x$ 在右边,另一个在左边

这样我们仅需要把 $x$ 出现的第一次,最后一次记录下来,

然后统计最右边的 $x$ 左边可以构成多少,最左边的 $x$ 右边可以构成多少

可以构成多少就是有多少不重复的,数字范围很小,开桶即可

容易证明,这两个构造的数对最多只有一个一样,即 $xx$ 和 $xx$,

如果 $x$ 出现的次数大于 $1$ 次那么就会产生这个重复,

减一即可,然后除以二($xy$ 和 $yx$ 重算)

再优化,想到我们只统计 $x$ 最后一次出现的左边有多少不一样的即可。

或者第一次出现的右边,这里取最后一次出现的左边(比较方便)

先证明为啥是对的,这样肯定能统计到 $yx$,那么 $xy$ 呢?

答:会在 $y$ 的回合被统计

离线乱搞,把区间排序之后再算,离线 $O(n)+$ 排序 $O(n log n)$ 搞定

代码:

#include <iostream>
#include <algorithm>
using namespace std;
int n, t, ri;
int a[100005], b[100005];
int r[100005], q[100005];
long long ans, pre;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        r[a[i] ] = i;
    }
    for (int i = 1; i <= 100000; i ++) if (r[i] != 0) q[++ t] = r[i] - 1;
    sort (q + 1, q + t + 1);
    for (int i = 1; i <= t; i ++)
    {
        while (ri < q[i])
        {
            ri ++;
            if (b[a[ri] ] == 0) pre ++;
            b[a[ri] ] ++;
        }
        ans += pre;
    }
    cout << ans << endl;
    return 0;
}

标签:右边,int,题解,数对,乙组,100005,左边,统计
From: https://www.cnblogs.com/Xy-top/p/16916110.html

相关文章

  • Vscode/Sublime C++ 打印中文乱码问题解决
    #include<iostream>usingnamespacestd;#ifdef_WIN32#include<windows.h>#endifintmain(){#ifdef_WIN32//控制台显示乱码纠正SetConsoleOutp......
  • CF433 & 434 题解
    比赛链接:https://codeforces.com/contest/434中国人出的浓度很高的一场kitaharaharuki-北原春希(WA2)KuriyamaMarai-栗山未来(境界的彼方)Ryouko-御门凉子(出包王女......
  • P3178 [HAOI2015]树上操作 的dfs序题解
    操作1:把某个节点x的点权增加a。操作2:把某个节点x为根的子树中所有点的点权都增加a。操作3:询问某个节点x到根的路径中所有点的点权和。//点修改+树修改,(点......
  • 常见问题解决方案
    1.Failedtofindthek3s-selinuxpolicy检查master机器上是否已经安装了不同版本的k3s-selinux或者selinux-policy工具包,建议将机器上相关包全部卸载以后重新执行安装。......
  • 问题解决:Unlink of file '.git/objects/pack/****' failed. Should I try again?
    gitpull拉取代码的时候遇到上面的错误,选择是或者否都不行,貌似说文件被占用了,也尝试用过找到.git里面对应的文件删除掉,也可以解决,不过文件占用多了,不可能一个个手动清......
  • CF1601 题解
    偶然看这一场的题目,忽然很有感觉,于是写了一下A题面考虑每一位可以单独分开考虑考虑单独的一位,每次要选\(m\)个位置,可能产生贡献的位置就是这位为1的数,设数量为\(x......
  • 【题解】TEST 22.11.21 - 计数(感谢强大艾尔法!!1)
    我们要求的是:\[\begin{aligned}G(x)&=\sum_{i\geq0}(i+n-m)!(-1)^{m-i}x^i\\G'(x)&=\sum_{i\geq1}i(i+n-m)!(-1)^{m-i}x^{i-1}\end{aligned}\]考虑凑\(\sum\limits......
  • 11.21 模拟赛题解
    \(\textdistance\)简要题意给定一棵\(n\)个结点的无根树,每条边有一个边权,询问以哪一个点作为根时,到其他所有节点的距离之和最大。距离的定义为到该点最短路径上的边权......
  • DTOJ 2022-11-21 测试 题解
    测试成果非常寄35+56+0+8=99基本上把能犯的错误都犯了T1记得dp数组初始化\(-\infty\)!!!!T2记得认真暴搜,不要乱记录访问状态T3记得把调试删掉!!!!!T4记得开longlong......
  • AtCoder 题解集
    虽然暂时不知道会不会从XCPC中退役,但还是想把这个题解集给维护下去。\(created\;at\;2022/6/24\;by\;Roshin\)目录AGCARCABCABC138F.Coincidence(结论,数位DP)AB......