首页 > 其他分享 >ABC323D 题解

ABC323D 题解

时间:2024-03-01 22:34:58浏览次数:23  
标签:12 2s read 题解 合并 times int ABC323D

这个题笔者场上 Wa 了六次……


首先发现一个性质:

考虑单个的 \(s\),它自己所能合并成的块就是 \(c\) 的二进制表示。

例如当 \(s=3,c=7\) 时,显然我们可以先两两合并,得到 \(3\) 个 \(s=6\) 的,再把其中的两个合并得到一个 \(s=12\) 的。

发现 \(7=(111)_2\),正好最终只有三个块:\(s=3,6,12\),即 \(s=3\times 2^0,3\times 2^1,3\times 2^2\)。

这个性质读者自己想一想就会明白的,想明白了再看下面的部分。


下面考虑“连环合并”的情况,类似于 \(3+3\to 6+6\to 12\) 这样。

如何把 \(s\) 的情况转移给 \(2s\) 呢?

由于 \(s\) 能合并出的就是 \(c\) 的二进制表示,那么 \(c\) 右移一位就是 \(2s\) 的表示了!

那还剩最后一位怎么办?

如果 \(s\) 是当前最小的块,那么没有人能合成它,于是如果剩下一个 \(s\) 没有合并,就一定不会再被合并了。如果最后一位是 \(1\) 答案加 \(1\),直接扔掉就行。

由此,我们发现一定要从小到大依次合并


具体来说,用一个 map 记录每个 \(s\) 对应的 \(c\),从小到大遍历(一定是完全遍历!!!这是我最后一个 Wa 的点),用 \(s\) 更新 \(2s\),并贡献答案。

可以证明每个 \(s\) 至多更新 \(\log_2{10^9} < 30\) 次,所以复杂度正确。

#define rep(i,x,y) for(int i=x;i<=y;i++)
const int N=1e5+5;
map<LL,LL> c;
map<LL,LL>::iterator it;
int n,ans;
int main(){
    n=read();
    rep(i,1,n) {
        LL x=read();
        c[x]=read();
    }
    for(it=c.begin();it!=c.end();++it){
        LL x=(*it).first,y=(*it).second;
        if(y>1) c[x<<1]+=(y>>1);
        //这里判断 y>1 只是为了降低时空复杂度,不加也行
        ans+=(y&1);
    }
    printf("%d\n",ans);
    return 0;
}

标签:12,2s,read,题解,合并,times,int,ABC323D
From: https://www.cnblogs.com/Cindy-Li/p/18048098

相关文章

  • P3749 题解
    P3749[六省联考2017]寿司餐厅题解发现很少有人讲为什么这题是最大权闭合子图,但作为一个刚学网络流的蒟蒻,我认为考虑是必要的。最大权闭合子图的特点:存在单向依赖关系,选\(x\)必须选\(y\)。每个点只会被选一次。代价有正有负。本问题特点:选一个区间,必选所有子区间(......
  • ABC338G 题解
    ABC338G题解计数题,没有太多思维难度,就是麻烦。显然+和*是比较难搞的,应考虑子问题。复杂度要求线性,考虑每个位置的贡献。Case1:只有数字Ex:1234考虑2的贡献,枚举一下看看。\(12=1\times10+2\times1\)\(123=1\times100+2\times10+3\times1\)\(1234=\dots\)\(2=2......
  • [ABC217F] Make Pair 题解
    [ABC217F]MakePair题解思路解析通过\(n\le200\)和“选出的两个学生离开队列,空出来的位置左右合拢”这两个细节可以想到能用区间dp做,\(f_{i,j}\)表示将\(i\toj\)这个区间全部选完的方案数,然后常规区间dp,加一个判断如果当前区间\([l,r]\)中\(l,r\)是朋友,就可......
  • P4690 [Ynoi2016] 镜中的昆虫 题解
    题目链接:镜中的昆虫经典题了,我们首先回顾下颜色数的常见做法统计:对每个位置维护一个\(pre_i\),表示与当前位置相同的颜色上一次出现位置。那么我们分讨一下。查询\([l,r]\)得到颜色数,对于\(pre_i<l\)的\(i\)点,显然它就是这个区间内\(a_i\)对应颜色出现的第一个位置,我们......
  • window.open 循环下载多个文件会打开新页签问题解决
     批量下载文件,循环使用window.open(url)的方式会打开新页签,参考了一位大侠的文章,使用iframe可以的:https://blog.csdn.net/nanke_yh/article/details/125145717如下:fileList.forEach(file=>{//同时下载多个文件,使用iframe下载,因为window.open或者a......
  • $\text{20240301}$ 字符串练习题解
    \(\text{20240301}\)字符串练习题解一定要写冬令营的题吗?遗憾的。P9717给了一个\(n\)个数的首尾相接的字符串,求若干个操作后能形成的不同的字符串大小。一次操作定义为:将字符串内所有的\(\text{01}\)同时改成\(\text{10}\),如图。通过这张图我们似乎发现了一个规律,这......
  • CF1937D Pinball 题解
    题目链接:https://codeforces.com/contest/1937/problem/D题意简述一个长为n的格子,用'<'或'>'组成的字符串表示,在位置i放一个小球,当前所在位置是'<'则下一秒左移一步,否则下一秒右移一步。小球移动后,之前位置的符号反转,'<'变成'>','>'变成'<',直到小球离开整个......
  • [CF1804F] Approximate Diameter 题解
    题目链接题目分析显然图结构不太好维护,容易想到维护树结构。维护生成树看起来就不太靠谱,容易想到维护最短路树。keyobservation:我们固定一个端点(不妨为\(1\)),求出这个点到每个点的最短路长度的最大值\(x\)。则一定有\(\lceil{d\over2}\rceil\lex\led\)。证明:显然\(x\l......
  • CF1827C Palindrome Partition 题解
    CF1827CPalindromePartition题解题面题目传送门。称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。给定一个长度为\(n\)的字符串\(s\),求有多少\(s\)的子串是好的。$1\len\le5\cdot10^5$,\(s\)仅包含小写字母。......
  • P6185 序列 题解
    如果发现自己莫名其妙错了,可能是代码UB,还开O2!!!!!!!!!!!传送门首先,对于每个操作2,将\(u_i,v_i\)连边。连边之后每个连通块内部可以在总和不变的情况下任意改变。用并查集将每个连通块缩点,然后对于每个操作1,将\(u_i,v_i\)连边。得到的图又会分成若干个连通块。判断整个图是否可行,只......