首页 > 其他分享 >Codeforces Round 850 (Div. 2, based on VK Cup 2022 - Final Round) E. Monsters (hard version) 线段树二分

Codeforces Round 850 (Div. 2, based on VK Cup 2022 - Final Round) E. Monsters (hard version) 线段树二分

时间:2023-04-19 20:33:24浏览次数:59  
标签:based int 线段 hard mid return ls query Round

传送门
详细题解传送门

  抄的ygg代码,向在这里说一下刚开始没看懂的部分。

  求答案的时候是把所有的当前为止的所有数值加起来减去一个从1开始并且公差为1的等差数列的前size项和。其中size是当前最多能用到哪个位置,满足前size项能构成1,2,3,....,sz这样的形式。

  假设我们的a[] = {1, 4, 4, 4, 3},在i等于4的时候答案是3,在i等于5的时候答案是2,由于我们给线段树上每个为i的位置插入了-i,当i = 4的时候线段树叶子结点[0, -1, -2, 0, -1],当i == 5时候线段树的叶子结点为[0, -1, -1, 1, 0]。这个时候我们就可以找出到i为止多余的数字,并且减去他所造成的影响。

#include <bits/stdc++.h>

const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
typedef long long ll;
#define ls u << 1
#define rs u << 1 | 1

int n, m;

int a[N];

struct node {
	int lazy;
	int v;
}tr[N << 2];

inline void pushup(int u) {
	tr[u].v = std::max(tr[ls].v, tr[rs].v);
}

inline void pushdown(int u) {
	if (tr[u].lazy) {
		int &v = tr[u].lazy;
		tr[ls].lazy += v;
		tr[ls].v += v;
		tr[rs].lazy += v;
		tr[rs].v += v;
		v = 0;
	} 
}

inline void build(int u, int L, int R) {
	tr[u].lazy = tr[u].v = 0;
	if (L == R) return ;
	
	
	int mid = L + R >> 1;
	build(ls, L, mid);
	build(rs, mid + 1, R);
	
	pushup(u);
}

inline void modify(int u, int L, int R, int l, int r, int v) {
	if (L >= l && R <= r) {
		tr[u].lazy += v;
		tr[u].v += v;
		return ;
	}
	
	pushdown(u);
	
	int mid = L + R >> 1;
	if (l <= mid)	modify(ls, L, mid, l, r, v);
	if (r > mid)	modify(rs, mid + 1, R, l, r, v);
	
	pushup(u);
}

inline int query(int u, int L, int R) {
	if (L == R)	return L;
	
	pushdown(u);
	
	int mid = L + R >> 1;
	
	if (tr[ls].v > 0)	return query(ls, L, mid);
	return query(rs, mid + 1, R);
}

inline void solve() {
	std::cin >> n;
	
	for (int i = 1; i <= n; i ++) std::cin >> a[i];
	
	build(1, 1, n);
	for (int i = 1; i <= n; i ++) {
		modify(1, 1, n, i, i, -i);
	}
	ll sum = 0, sz = 0;
	for (int i = 1; i <= n; i ++) {
		sum += a[i], sz ++;
		
		modify(1, 1, n, a[i], n, 1);
		if (tr[1].v > 0) {
			int now = query(1, 1, n);
			sz --, sum -= now;
			modify(1, 1, n, now, n, -1);
		}
		
		std::cout << sum - sz * (sz + 1) / 2 << ' ';
	}
	std::cout << '\n';
}

int main(void) {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	
	int _;
	_ = 1;
	std::cin >> _;
	
	while (_ --) solve();
	
	return 0;
}

标签:based,int,线段,hard,mid,return,ls,query,Round
From: https://www.cnblogs.com/qdhys/p/17334523.html

相关文章

  • Educational Codeforces Round 113 (Rated for Div. 2)
    题目链接B核心思路这个题目我觉得很好。首先分析下吧,如果有人需要执行操作二那么我们肯定就是给他们都打上平局是最优的。那么如果有人需要执行操作一呢,那么我们就可以把这些需要执行操作1的都搞一起。然后是他们成一个环。这样肯定就保证了每个人都会赢上一次。C核心思路......
  • Codeforces Round 866 (Div. 2)
    A.Yura'sNewName一个简单的dp,状态是\(f[i][0/1]\)表示前\(i\)位变成合法的且最后一位是^或_的最小代价。如果是_只能从^转移过来,如果是^则都可以转移过来#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; intn=s.size(); if(n=......
  • 3、ShardingSphere实战(三)
    一、前言:本项目按照时间字段进行分表,需要提前将主表写入数据库优势:1、实现自动建表,且不需要配置SQL2、范围分表查询时自动排除不存在的表 二、项目实战:1、创建主表:CREATETABLE`t_user`(`id`bigint(32)NOTNULL,`name`varchar(255)DEFAULTNULL,`create_a......
  • 2、ShardingSphere中间件(二)
    一、ShardingSphere中间件:1、简介:(1)、概述:ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这三款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异......
  • Codeforces Round 625 (Div. 1, based on Technocup 2020 Final Round) A. Journey Pl
    https://codeforces.com/contest/1320/problem/AA.JourneyPlanning题目大意:给定一组数,问我们ai-aj==i-j的时候就可以把ai的值加起来,问我们可以凑到的最大总值是多少?input6107191015output26input1400000output400000input7892611122914out......
  • Codeforces Round 866 (Div. 2) ABC
    https://codeforces.com/contest/1820A.Yura'sNewName题目大意:给定一个字符串,每次这个表情^^或者这个表情^_^就是合法的问我们这个字符串至少要添加多少东西使得怎么看都是合法的?input7^______^___^_^^^_^___^^_^^_^^^^^_^_^^___^^_output5511032#......
  • Ace Hardware Corporation: 一家五金零售商的EDI
    AceHardwareCorporation(以下简称Ace)是一家总部位于美国伊利诺伊州奥克布鲁克的美国五金零售商合作社,成立于1924年。公司的目标是为其成员提供有竞争力的价格、优质的产品和优秀的客户服务,以满足客户的需求。作为一家五金零售商,Ace的供应商需要与其进行业务单据的传输。为此,Ace公......
  • Codeforces Round 832 (Div2)
    SwapGameAlice和Bob两个人在玩游戏。有一个长度为\(n\)的序列\(a\),Alice和Bob两人轮流完成一个操作,Alice先开始。每个人可以将数列的第一个数减\(1\),并将它与后面序列的一个数进行交换,如果一个人操作之前发现当前序列中的第一个数为\(0\),这个人就输了。问如果两......
  • Codeforces Round 764 (Div. 3) -- E. Masha-forgetful
    **题目大意:取去模板串中的子串可以组成一个给定的目标串,每个子串可以用无数次,输出组成的所需的串的信息题目中的取得子串必须“>=2”很好的提示了我们,想到一个式子2*x+3*y可以等于任何数,所以从之前的串都取长度为2,为3。在进行匹配。**structnode{ intl,......
  • Codeforces Round 856 (Div2)
    CountingFactorizations任何一个正整数\(m\)都可以被唯一的分解为\(p_1^{e_1}\cdotp_2^{e_2}\ldotsp_k^{e_k}\)的形式。将正整数\(m\)的唯一质数分解转化为一个长度为\(2k\)的可重集合记为\(f(m)\)。\[f(m)=\{p_1,e_1,p_2,e_2,p_3,e_3,\ldots,p_k,e_k\}\]......