首页 > 其他分享 >权值线段树模板

权值线段树模板

时间:2023-04-27 22:34:04浏览次数:46  
标签:return int 线段 mid seg 权值 vx id 模板

【模板】普通平衡树

//  AC one more times

#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
typedef pair<int, int> pii;

const int N = 1e5 + 10;

struct segtree
{
	int s;
}seg[N * 4];
int n;
vector<int> vx;
pii a[N];
multiset<int> s;

void update(int id)
{
	seg[id].s = seg[id * 2].s + seg[id * 2 + 1].s;
}

void change(int id, int l, int r, int pos, int val)
{
	if(l == r)
	{
		seg[id].s = seg[id].s + val;
		return;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid)
		change(id * 2, l, mid, pos, val);
	else
		change(id * 2 + 1, mid + 1, r, pos, val);
	update(id);
}

int query1(int id, int l, int r, int ql, int qr)
{
	if(ql > qr)	return 0;
	if(l == ql && r == qr)
	{
		return seg[id].s;
	}
	int mid = (l + r) >> 1;
	if(qr <= mid)
		return query1(id * 2, l, mid, ql, qr);
	else if(ql > mid)
		return query1(id * 2 + 1, mid + 1, r, ql, qr);
	else 
		return query1(id * 2, l, mid, ql, mid) +
				query1(id * 2 + 1, mid + 1, r, mid + 1, qr);
}

int query2(int id, int l, int r, int x)
{
	if(l == r)
	{
		return l;
	}
	int mid = (l + r) >> 1;
	if(seg[id * 2].s >= x)
		return query2(id * 2, l, mid, x);
	else
		return query2(id * 2 + 1, mid + 1, r, x - seg[id * 2].s);
}

void solve()
{   
	cin>>n;
	for(int i = 1; i <= n; i++)
	{
		cin>>a[i].fi>>a[i].se;
		if(a[i].fi != 4)
			vx.pb(a[i].se);
	}
	sort(all(vx));
	vx.erase(unique(vx.begin(), vx.end()), vx.end());
	for(int i = 1; i <= n; i++)
	{
		int opt = a[i].fi, x = a[i].se;
		x = lower_bound(vx.begin(), vx.end(), x) -vx.begin() + 1;
		if(opt == 1)
		{
			change(1, 1, n, x, 1);
			s.insert(vx[x - 1]);
		}
		else if(opt == 2)
		{
			change(1, 1, n, x, -1);
			s.erase(s.find(vx[x - 1]));
		}
		else if(opt == 3)
			cout<<query1(1, 1, n, 1, x - 1) + 1<<endl;
		else if(opt == 4)
			cout<<vx[query2(1, 1, n, a[i].se) - 1]<<endl;
		else if(opt == 5)
			cout<<*(--s.lower_bound(vx[x - 1]))<<endl;
		else
			cout<<*(s.upper_bound(vx[x - 1]))<<endl;
	}
	
}

int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int TC = 1;
    
    //cin >> TC;    
    for(int tc = 1; tc <= TC; tc++)
    {
        //cout << "Case #" << tc << ": ";         
        solve();
    }


    return 0;
}

标签:return,int,线段,mid,seg,权值,vx,id,模板
From: https://www.cnblogs.com/magicat/p/17360427.html

相关文章

  • 模板层Templates
    目录模板层模板语法的使用模板语法传值变量基本使用:深度查询之句点符的使用过滤器其他过滤器(了解)标签for标签if标签with起别名csrf_token标签模板的导入和继承模板的继承之extends标签、block标签模板的导入之include标签模板层Django提供了模板系统(TemplateSystem)用来专门......
  • 线段树
     1.基础算法1.1快读快写template<typenameT>inlinevoidread(T&t){​ intf=0,c=getchar();t=0;​ while(!isdigit(c))f|=c=='-',c=getchar();​ while(isdigit(c))t=t*10+c-48,c=getchar();​ if(f)t=-t;​}​​templ......
  • 线段树的动态开点模板
    学习自数据结构学习笔记(5)动态开点线段树动态开点线段树感谢大佬们博客的帮助//AConemoretimes#include<bits/stdc++.h>usingnamespacestd;#definefifirst#definesesecond#definepbpush_back#defineendl'\n'#defineall(x)(x).begin(),(x).end()......
  • CF960F Pathwalks | 线段树优化DP
    题目设\(dp[x,w]\)为以结点\(x\)为结尾,且最后一条边边权为\(w\)的最长路径长度。考虑根据顺序加边,对于边\((u,v)\),更新\[dp[v,w]=\max_{w'<w}\{dp[u,w']\}+1\]对于每个节点,建一棵线段树,维护\(dp[x]\),这样每次更新\(dp[v,w]\)就相当于在\(dp[u]\)所对应的线段树中查询\([......
  • 七天学会flask(六)---模板-行语句(3)(第一天)
    flask模板技术---行语句flask行语句,可以让模板的代码编写更加容易便捷,不然总是用{%...%}来标识挺麻烦的,使用行语句首先需要进行设置app.jinja_env.line_statement_prefix='#'先来看一下不使用行语句时如何写一段for循环{%foriinrange(10)%}<p>{{i}}</p>......
  • 七天学会flask(六)---模板-转义(3)(第一天)
    flask模板技术---转义Jinja自动根据模板语法进行html渲染,但某些时候,我们不希望它进行渲染,原因在于一旦渲染,其结果并不是我们所期望的,比如下面这段html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><b......
  • 两天学会flask(六)---模板-上下文环境(3)(20分钟)
    flask模板---上下文环境在前面的示例中,想要在模板里显示数据,只能通过在render_template函数里传参数来解决。但对于flask的上下文变量和自定义上下文变量,则不必如此,你可以直接在模板里使用他们。1.request请求对象request,携带了大量有关请求的信息,比如请求的path,url,参数,你可以......
  • 线段树
    1#include<iostream>2#include<string>3#definelllonglong4constintN=1e5+5;56usingnamespacestd;78lltree[N<<2];//线段树,可以是对应的结构体9lllz[N<<2];//延迟标记,也可以是结构体1011//lz标记下传12voidpush_down(intid......
  • AcWing 242. 一个简单的整数问题 / 树状数组区间修改区间查询模板题
    AcWing242.一个简单的整数问题//实例化是抽象的天敌,是抽象的克星//通过公式sn=(i从1~n求积)di*(1+n)-(i从1~n求积)i*di//来计算前缀和,又(i从1~n求积)i*di不能由(i从1~n求积)di*(1+n)推出//所以除了维护d数组,还需维护......
  • Django模板层 (变量分配 过滤器 标签 继承和导入 自定义过滤器、标签及inclusion_ta
    目录一、模板变量分配定义 在后端变量的值通过模板语法传到前端符号{{}}:主要与数据值相关{%%}:主要与逻辑相关模板语法注意点:1.针对需要加括号调用的名字django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释{##},前端浏览器是无法查看的,因为它要先......