首页 > 其他分享 >E. Level Up

E. Level Up

时间:2024-08-01 10:16:50浏览次数:13  
标签:Level mid Up lv using 战斗 等级 define

E. Level Up

  • 题意
    玩家初始等级为 \(1\), 有 \(n\) 只怪物,每个怪物有一个等级 \(a_i\), 如果怪物等级高于你,则你们会战斗,战斗后经验加1,否则怪物会逃跑,你不会获得经验,每 k 点经验就会升级。给你 \(q\) 个询问,给个询问给出 \(i,x\), 问你当 \(k = x\) 时,会不会发生战斗(即问你你的等级会不会小于等于此时的\(a_i\)
  • \(1≤n,q≤2⋅10^5, 1≤ai≤2⋅10^5, 1≤i,x≤ n\)

听说根号分治的 sqrt 会被 hack,这里讲一个\(nlognlogn\)的做法

可以根据\(q\),问的是到\(i\)时\(k = x\)时的\(lv\)会不会小于等于\(a_i\), 因为lv与k是反比例关系,k越小,lv就会越高,对于每个位置处理出如果能发生战斗所需要的最大的k,记为\(b_i\), 如过\(b_i <= x\), 则可以说明,比能发生战斗所需的k还大,则到这个位置的lv会比\(a_i\)还小,则会发生战斗(因为是反比例函数,你求得是最大上界,小于k的都会比\(a_i\) 大,这里要仔细想一下

因为这样k具有单调性,比当前界限大的话,lv会变小,则以后战斗的怪只会增加不会减少,我们可以二分一个最大的mid, 满足在这个位置的战斗的怪所能到达的等级小于等于\(a_i\), mid - 1位置的战斗的怪所能到达的等级都大于\(a_i\), 因为是反函数。

现在我们需要一个数据结构来维护,在一段k的范围内加 1,这里记为k能战斗的数量(经验值),询问某个位置的数量(经验值),来当作二分得\(check\)函数计算等级, 也就是区间修改和单点查询,这里可以用线段树维护(树状数组也是可以得)。最后二分出的位置记录下来,当查询的判断,修改时修改的是大于等于答案的位置,因为大于等于的位置k越大,lv越小,战斗的次数越多。多想一下边界问题

#include<bits/stdc++.h>

using namespace std;
using ull = unsigned long long;
using ll = long long;
using PII = pair<ll,ll>;
using PIII = pair<ll, pair<ll,ll>>;
#define endl "\n"
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lowbit(x) (x) & (-x)
#define point(x) setiosflags(ios::fixed)<<setprecision(x)
const int N=1e5+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
struct Info {//一定要初始化
	int val;

	int add = 0;
	Info (int x) {
		val = x;
	}
	Info () {
		val = 0;
	}
};
Info merge(const Info& a, const Info& b) {
	Info c;

	c.val = b.val + c.val;
	
	return c;
}
struct segtree {
	#define ls (u << 1)
	#define rs (u << 1 | 1)
	int n;
	segtree(int n) {init(n);};
	vector<Info> info;
	vector<int> a;
	void init(int n) {
		this->n = n;
		info.resize(n << 2);
		a.resize(n << 1);
	}
	void push_up(int u) {
		info[u] = merge(info[ls], info[rs]);
	}
	void build(int u, int l, int r)
    {
        if(l == r)
        {
            info[u] = Info();//填值
            return ;
        }
        int mid = l + r >> 1;
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
		push_up(u);
    }
	void settag(int u, int k) {//处理数据
		info[u].val += k;
		info[u].add += k;
 	}
	void push_down(int u)
	{
		if(info[u].add)
        {
            settag(ls, info[u].add);
            settag(rs, info[u].add);
            info[u].add = 0;
        }
	}
	void update(int u, int l, int r, int pos, int k) {
		if(l == r) {
			info[u] = Info(k);
            return;
		}
        push_down(u);
		int mid = l + r >> 1;
		if(pos <= mid) update(ls, l, mid, pos, k);
		else update(rs, mid + 1, r, pos, k);
		push_up(u);

	};
	void update(int u, int l, int r, int x, int y, int k) {
		if(x <= l && r <= y) {
			settag(u, k);
            return;
		}
        push_down(u);
		int mid = l + r >> 1;
		if(x <= mid) update(ls, l, mid, x, y, k);
		if(mid < y) update(rs, mid + 1, r, x, y, k);
		push_up(u);
	}
	void update(int pos, int v) {
		update(1, 1, n, pos, v);
	}
	void update(int x, int y, int k) {
		update(1, 1, n, x, y, k);
	}
	Info query(int u, int l, int r, int x, int y) {
        if (x <= l && r <= y) return info[u];
        push_down(u);
        int mid = l + r >> 1;
        if (y <= mid) return query(ls, l, mid, x, y);
        else if (mid < x) return query(rs, mid + 1, r, x, y);
        else return merge(query(ls, l, mid, x, y), query(rs, mid + 1, r, x, y));
    }
    Info query(int l, int r) {
        return query(1, 1, n, l, r);
    }

};
void solve(){
	int n, q;
	cin >> n >> q;
	vector<int> a(n + 1), b(n + 1);
	for(int i = 1; i <= n; i ++) cin >> a[i];
	segtree tr(n);//维护区间加,直接lazy标记就行
	for(int i = 1; i <= n; i ++) {
		int l = 1, r = n;
		while(l < r) {
			int mid = l + r >> 1;
			if(tr.query(1, 1, n, mid, mid).val / mid + 1 <= a[i]) r = mid;//判断等级,单点查询
			else l = mid + 1;
		}
		b[i] = l;
		tr.update(1, 1, n, l, n, 1);
	}
	while(q --) {
		int x, y; cin >> x >> y;
		if(b[x] <= y) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	
}
int main()
{
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

标签:Level,mid,Up,lv,using,战斗,等级,define
From: https://www.cnblogs.com/ZouYua/p/18336107

相关文章

  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 无法在 Altair 中使用 JupyterChart 创建新流程
    我有一个Altair图表,希望通过以下方式使其具有交互性。当我单击数据点时,我希望通过其CLI启动应用程序,并将数据点的属性作为启动命令的参数提供。我的理解是,使用Altair5.3.0中引入的新JupyterChart类应该可以实现这一点-请参阅示例此处但是,按照该示例,当......
  • 2021年我因为Tab Session Manager丢失数据,好像是研究过一次leveldb的查看/解码方式 但
    Default\LocalStorage\leveldb.ldb 2023年下半年我因为chatmindai修改域名,又研究过一次,因为时间关系也没有细究 最近,我想查看一下anki的devtool的LocalStorage,即https://ankiweb.net/shared/info/31746032这个插件产生的C:\Users\xxx\AppData\Local\Anki\QtWebEngine\De......
  • 方天云智慧平台系统 Upload.ashx 任意文件上传漏洞复现
    0x01产品简介方天云智慧平台系统,作为方天科技公司的重要产品,是一款面向企业全流程的业务管理功能平台,集成了ERP(企业资源规划)、MES(车间执行系统)、APS(先进规划与排程)、PLM(产品生命周期)、CRM(客户关系管理)等多种功能模块,旨在通过云端服务为企业提供数字化、智能化的管理解决方案......
  • [React] Force React to update it's DOM by using flushSync
    Refertohttps://react.dev/reference/react-dom/flushSync Forexample,thebrowseronbeforeprintAPIallowsyoutochangethepageimmediatelybeforetheprintdialogopens.Thisisusefulforapplyingcustomprintstylesthatallowthedocumenttodispl......
  • GroupMamba实战:使用GroupMamba实现图像分类任务(一)
    摘要状态空间模型(SSM)的最新进展展示了在具有次二次复杂性的长距离依赖建模中的有效性能。GroupMamba解决了将基于SSM的模型扩展到计算机视觉领域的挑战,特别是大型模型尺寸的不稳定性和低效性。GroupMamba在ImageNet-1K的图像分类、MS-COCO的目标检测和实例分割以及ADE2OK的......
  • E. Level Up
    E.LevelUpMonocarpisplayingacomputergame.Hestartsthegamebeinglevel$1$.Heisabouttofight$n$monsters,inorderfrom$1$to$n$.Thelevelofthe$i$-thmonsteris$a_i$.Foreachmonsterinthegivenorder,Monocarp'sencountergoes......
  • 核心(Hutool-core)克隆工具cn.hutool.clone.CloneSupport
    一、直接继承extendsCloneSupport这个类就完事了/**狗狗类,用于继承CloneSupport类@authorLooly*/privatestaticclassDogextendsCloneSupport{privateStringname="wangwang";privateintage=3;}当然,使用CloneSupport的前提是你没有继承任何的类,谁让Java......
  • 有没有办法根据 Pandas GroupBy 的计数在 2 个数据帧之间重复分配值?
    我有两个结构相同但形状和值不同的Pandas数据框:importpandasaspddataframe_1=pd.DataFrame({'customer_id':['id1','id2','id3','id4','id5','id6'],'gender':[......
  • drush ev ‘\Drupal::service(“router.builder“)->rebuild();‘
    【chatgpt】这是一个用于Drupal网站的Drush命令,用于重建路由信息。在Drupal中,路由信息用于定义URL路径与回调函数之间的映射关系,以便Drupal能够正确处理来自用户的请求。路由信息由模块提供,并在Drupal的路由系统中进行注册和管理。Drush是一个用于在命令行中管理和......