IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces 1457 E. Air Conditioners -> 正文阅读

[数据结构与算法]Codeforces 1457 E. Air Conditioners

Codeforces 1457 E. Air Conditioners

题意

有n个格子,k个格子里有空调。,每个空调有度数。
对于任意一个格子 i i i,它的温度等于所有有空调格子的温度加上它距离 i i i格子之间的距离的最小值
求所有格子的温度

题解

对于第一个格子,我们可以算出每个空调对它的影响的温度,那这个格子的温度即为这些值中的最小值,
那么对于第二个格子怎么办?
就是把第2个格子前面的空调温度影响+1.后面的空调温度影响-1,怎么维护?
简单的极值线段树

标程

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+7;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll a[MAXN],sum[MAXN*4],flag[MAXN*4];
int n,m,k,q;
struct node{
	ll a,t;
	bool operator <(const node & p) const{
		return a<p.a;
	}
}e[MAXN];
inline void pushup(int rt){
	sum[rt]=min(sum[rt*2],sum[rt*2+1]);
}
inline void Build(int l,int r,int rt){
	flag[rt]=0;
	if(l==r){
		sum[rt]=e[l].t+abs(1-e[l].a); return;
	}
	int mid=(l+r)/2;
	Build(l,mid,rt*2);
	Build(mid+1,r,rt*2+1);
	pushup(rt);
}
inline void pushdown(int l,int r,int rt){
	if(flag[rt]!=0){
		int mid=(l+r)/2;
		flag[rt*2]+=flag[rt];
		flag[rt*2+1]+=flag[rt];
		sum[rt*2]+=flag[rt];
		sum[rt*2+1]+=flag[rt];
		flag[rt]=0;
	}
}
inline void add_qj(int l,int r,int L,int R,int rt,int k){
	if(L<=l&&r<=R){
		sum[rt]+=k;
		flag[rt]+=k;
		return;
	}
	if(flag[rt]!=0) pushdown(l,r,rt);
	int mid=(l+r)/2;
	if(L<=mid) add_qj(l,mid,L,R,rt*2,k);
	if(R>mid) add_qj(mid+1,r,L,R,rt*2+1,k);
	pushup(rt);
}
inline void add_point(int l,int r,int d,int rt,int k){
	if(l==r){
		sum[rt]+=k;
		return;
	}
	if(flag[rt]!=0) pushdown(l,r,rt);
	int mid=(l+r)/2;
	if(d<=mid) add_point(l,mid,d,rt*2,k);
	if(d>mid) add_point(mid+1,r,d,rt*2+1,k);
	pushup(rt);
}
inline ll query_point(int l,int r,int d,int rt){
	ll ans=inf;
	if(l==r){
		return sum[rt];
	}
	pushdown(l,r,rt);
	int mid=(l+r)/2;
	if(d<=mid) ans=min(ans,query_point(l,mid,d,rt*2));
	if(d>mid) ans=min(ans,query_point(mid+1,r,d,rt*2+1));
	return ans;
}
inline ll query_qj(int l,int r,int L,int R,int rt){
	ll ans=inf;
	if(L<=l&&r<=R){
		return sum[rt];
	}
	pushdown(l,r,rt);
	int mid=(l+r)/2;
	if(L<=mid) ans=min(ans,query_qj(l,mid,L,R,rt*2));
	if(R>mid) ans=min(ans,query_qj(mid+1,r,L,R,rt*2+1));
	return ans;
}

int main(){
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&n,&k);
		for(int i=1;i<=k;i++) scanf("%lld",&e[i].a);
		for(int i=1;i<=k;i++) scanf("%lld",&e[i].t);
		sort(e+1,e+1+k);
		for(int i=1;i<=k;i++) a[i]=e[i].a;
		Build(1,k,1);
		int tmp=1;
		for(int i=1;i<=n;i++){
			printf("%lld ",sum[1]);
			if(i>=e[tmp].a&&tmp<=k){
				tmp++;
			}
			if(tmp>1) add_qj(1,k,1,tmp-1,1,1);
			if(tmp<=k) add_qj(1,k,tmp,k,1,-1);
		}
	}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:33:17  更:2021-07-16 11:34:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 14:08:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码