Educational Codeforces Round 168 E. Level Up
创始人
2024-11-12 13:07:47

原题链接:Problem - E - Codeforces

题意:有n个怪物,每个怪物都有一个等级,主角从左到右打怪物,如果主角的等级严格大于了怪物的等级,那么怪物就会逃跑,主角每升一级需要杀死k个怪物,多组询问题目给出第几个怪物和升级一次需要杀死的怪物,问主角能不能和这个怪物战斗?

思路:二分+树状数组。可以发现一个明显的规律,如果k越小那么,主角升级的一定越快,那么主角从1到i(i代表题目里面问能不能战斗的怪物的位置),可以发现是具有单调性的,那便是k大于等于某个值之后,主角一定和怪物战斗,那么就可以二分的寻找这个最小的k。二分最重要的就是检查中间值是否合理了,每次check的是时候,去比较一下当前怪物等级*mid和k=mid的时候前面能够杀死几个怪物,当前怪物等级*mid这个很容易就可以得到,后者因该如何得到呢?可以每次二分结束后将值放入树状数组里面维护,如果下一次给出的mid大于等于当前点的结果,那么这个怪物就可以提供贡献,然后查询一下大于mid的怪物有多少个,就可以了。每个点拿数组在记录一下,对于每组询问判断一下题目给出的k是大于等于求出来的还是小于求出来的。

//冷静,冷静,冷静 //调不出来就重构 #pragma GCC optimize(2) #pragma GCC optimize("O3") #include #define endl '\n' using namespace std; typedef long long ll; typedef long double ld; typedef pair pii; const int N=1e6+10,mod=1000000007; ll t[N],p[N],op[N]; ll lowbit(ll x){return x&(-x);} void add(ll x,ll vel) { 	while(xquery(v);//v为每次升级需要杀死的怪物,p[x]为当前怪物的等级,杀死v*p[x]主角的等级就会超过p[x] 	//query(v)是查询v情况下,能够杀死几只怪物  } int main() { 	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 	ll n,q;cin>>n>>q; 	for(int i=1;i<=n;i++) 	{ 		cin>>p[i]; 		ll l=1,r=n+10;//二分出能和当前怪物战斗的最下k  		while(l+1>1; 			if(is(i,mid))r=mid; 			else l=mid; 		} 		if(is(i,l))r=l; 		op[i]=r; 		add(r,1);//把能和当前怪物战斗的最小k放入树状数组里面  	} 	while(q--) 	{ 		ll x,v;cin>>x>>v;//如果v大于等于当前位置的最小k那么就是yes  		if(op[x]<=v)cout<<"YES"<

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...