ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

美团笔试题目

2022-04-30 17:31:49  阅读:181  来源: 互联网

标签:题目 val int 美团 笔试 tr mid add root


题目

给一个长度为n的数组,总权值和为val, 期望是否能找到一个区间[l,r](r - l + 1 < n),使得区间[l, r]的权值和大于等于val,可能有某个元素值可以为负数。

为了省事,直接线段树暴力求某个区间的最大值。

#include<bits/stdc++.h>
using namespace std;
int N = 200005;
int tr[200015], f[50004], a[50004], add[200015];
void pushup(int root){
	tr[root] = max(tr[root << 1], tr[root << 1 | 1]);
}
void pushdown(int root){
	add[root << 1] += add[root];
	add[root << 1 | 1] += add[root];
	tr[root << 1] += add[root];
	tr[root << 1 | 1] += add[root];
	add[root] = 0;
}
void build(int l, int r, int root){
	if(l == r){
		tr[root] = f[l];
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, root << 1);
	build(mid + 1, r , root << 1 | 1);
	pushup(root);
}
void undate(int l, int r, int root, int L, int R, int val){
	if(L <= l && R >= l){
		tr[root] += val;
		add[root] += val;
		return ;
	}
	pushdown(root);
	int mid = l + r >> 1;
	if(L <= mid) undate(l, mid, root << 1, L, R, val);
	if(R > mid) undate(mid + 1, r, root << 1 | 1, L, R, val);
	pushup(root);
}
int query(int l, int r, int root, int L, int R){
	if(L <= l && R >= r){
		return tr[root];
	}
	int ans = -1000000000, mid = l + r >> 1;
	pushdown(root);
	if(L <= mid) ans = max(ans, query(l, mid, root << 1, L, R));
	if(R > mid) ans = max(ans, query(mid + 1, r, root << 1 | 1, L, R));
	return ans;
}
int main(){
	int t, n;
	cin >> t;
	while(t--){
		cin >> n;
		f[0] = 0;
		int flag = 0;
		memset(tr, 0, sizeof(tr));
		memset(add, 0, sizeof(add));
		for(int i = 1; i <= n; i++){
			cin >> a[i];
			f[i] = a[i] + f[i - 1];
		}
		build(1, n - 1, 1);
		for(int i = 1; i <= n - 1; i++){
			int k = query(1, n - 1, 1, i, n - 1);
			if(k >= f[n]){
				flag = 1;
				break;
			}
			undate(1, n - 1, 1, i, n - 1, -a[i]);
		}
		int val = f[n];
		for(int i = 1; i <= n - 1; i++){
			f[n] -= a[i];
			if(f[n] >= val){
				flag = 1;
				break;
			}
		}
		flag == 1 ? cout << "Yes" << endl : cout << "No" << endl;
	}
    return 0;
}

标签:题目,val,int,美团,笔试,tr,mid,add,root
来源: https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/16210755.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有