首页 > 其他分享 >「题解」Codeforces 1098D Eels

「题解」Codeforces 1098D Eels

时间:2022-11-11 09:48:26浏览次数:59  
标签:Eels typedef ch log read 题解 Codeforces include define

暴力是,每次挑出最小的两个合并。

需要观察到没有产生贡献的次数很小。考虑最小的那个数的大小,如果一次合并没有产生贡献,那么最小的数至少 \(\times 2\).所以最多会有 \(\mathcal{O}(\log (qx))=\mathcal{O}(\log q+\log x)\) 次。

根据这个来观察还有什么性质,考虑如果一次合并没有产生贡献,那么那个时刻的最小值一定是所有数从小到大排序后的一段前缀合并出来的,并且发生合并的只有这个前缀。所以将所有鱼的重量 \(a\) 从小到大排序后,一个位置的前缀和 \(s_i\times 2 <a_{i+1}\) 时不会产生贡献。

最后是套路,每 \(2^i\) 分个块(\([2^0,2^1),[2^1,2^2),[2^2,2^3),\cdots\))。这样的从小到大排序后,“ \(s_i\times 2<a_{i+1}\) ” 也就是不合法的情况出现的位置一定是块与块之间。所以每个块开一个可删堆 / multiset 即可解决。时间复杂度是 \(\mathcal{O}(q\log x)\) 的。

// LUOGU_RID: 93542170
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<random>
#include<set>
#include<assert.h>
#define pb emplace_back
#define mp make_pair
#define fi first
#define se second
#define dbg(x) cerr<<"In Line "<< __LINE__<<" the "<<#x<<" = "<<x<<'\n'
#define dpi(x,y) cerr<<"In Line "<<__LINE__<<" the "<<#x<<" = "<<x<<" ; "<<"the "<<#y<<" = "<<y<<'\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>pii;
typedef pair<ll,int>pli;
typedef pair<ll,ll>pll;
typedef pair<int,ll>pil;
typedef vector<int>vi;
typedef vector<ll>vll;
typedef vector<pii>vpii;
typedef vector<pil>vpil;
template<typename T>T cmax(T &x, T y){return x=x>y?x:y;}
template<typename T>T cmin(T &x, T y){return x=x<y?x:y;}
template<typename T>
T &read(T &r){
	r=0;bool w=0;char ch=getchar();
	while(ch<'0'||ch>'9')w=ch=='-'?1:0,ch=getchar();
	while(ch>='0'&&ch<='9')r=r*10+(ch^48),ch=getchar();
	return r=w?-r:r;
}
template<typename T1,typename... T2>
void read(T1 &x,T2& ...y){read(x);read(y...);}
const int N=500010;
int n,cnt;
multiset<int>s[31];
ll sum[31];
signed main(){
	read(n);
	for(int i=1;i<=n;i++){
		char ch=getchar();while(ch!='-'&&ch!='+')ch=getchar();
		int x,k;read(x);
		k=31-__builtin_clz(x);
		if(ch=='+')sum[k]+=x,s[k].insert(x),++cnt;
		else sum[k]-=x,s[k].erase(s[k].lower_bound(x)),--cnt;
		ll all=0;
		int ans=-1;
		for(int o=0;o<=30;o++){
			if(s[o].empty())continue;
			if(all && all*2<(*s[o].begin()))--ans;
			all+=sum[o];
		}
		cout << max(0,cnt+ans) << '\n';
	}
	return 0;
}

标签:Eels,typedef,ch,log,read,题解,Codeforces,include,define
From: https://www.cnblogs.com/do-while-true/p/16879572.html

相关文章

  • [题解] [CSP-J 2022] 逻辑表达式 思路整理
    标签:分治。题目传送门:P8815[CSP-J2022]逻辑表达式题目大意给一个包含0、1、|、&、(、)的逻辑表达式(保证正确)。在计算表达式时采用“短路”策略:计算表达式a&b......
  • vs 加入目录下的文件不在解决方案窗口显示(我的是unreal,其他的也成立),必须手动加的问
    1、网上说的显示全部然后把非活动的包含,我的可能是项目太大,不行;2、使用一个foldertosolutionfolder插件,也不行,这个会将子文件夹单独生成一个项目;最后方案:删除*.sln文件,......
  • 题解 P4778【Counting swaps】
    problem一次操作指随意选定\(x,y\)并交换\(a_x,a_y\),请问有多少种方案,能用最少的操作次数重排一个排列\(a\)?\(n\leq10^5,P=10^9+7\)。solution0连边\(i\toa_i\)......
  • 模拟与高精度题解
    此题目特征为储存数字超过longlong类型,c++无法用一个变量存储全部数字解法为开数组来储存各个位上的数字1.字符高精度直接以两种方式处理字符即可#include<bits/std......
  • Codeforces Round #697 (Div. 3) G
    G.StrangeBeauty观察性质我们发现他就是一个单向的关系要是我们3能被9整除那我们来一个能整除9的那么一定能整除3就是这个性质我们考虑dpdp[i]表示我们以a[i]结......
  • 小姿势 之 Android Studio 3.5 Retry 问题解决
    总会有那么一个人,让你觉得这个世界一切都是值得的。纵使结果不尽人意,曾经拥有即是最好。前言家里的MBP静静地躺了一段时间,某天心血来潮想嗨起来,其实就是瞎折腾一把,结果......
  • CodeForces - 708C Centroids
    题意:给出一棵有n个结点的树,对于每一个结点,如果任意删除一条边后再任意添加一条边能使这个结点成为这棵树的重心,则输出1;反之输出0。解:重心的特点:以重心为根节点时,其最大子......
  • Codeforces Round #617 (Div. 3) ABCD
    https://codeforces.com/contest/1296临时和Juang一起组队打的这场,本来定的分开打另一场,哈哈题目挺友好的,Juang70minAK了,我只写了四题,剩下的题目待补A.Arraywith......
  • 洛谷 P4423 [BJWC2011]最小三角形 题解
    求平面最近点对的时候有这样一种思路:将所有点全部绕原点旋转同一个角度,然后按横坐标排序。根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太远。把这种......
  • P4407 [JSOI2009] 电子字典 题解
    题目:P4407这题差不多就是P1688的改版。参考一下我在P1688的做法,我们继续使用Hash,然后只要考虑如何去重就好了。于是就有了这个暴力的想法:#代表修改,@代表添加,$代......