首页 > 其他分享 >【线段树】 POJ 3667 Hotel

【线段树】 POJ 3667 Hotel

时间:2023-07-05 22:33:00浏览次数:51  
标签:3667 segnum int segmax Hotel mark POJ maxn include


这道题和那道HDOJ 3308 LCIS比较像。。那道题目我就写了超久,当时是不确定保存什么信息。。这道题也写了很久,主要是各种低级错误,找错找了很久,超级火。。。。

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

【线段树】 POJ 3667 Hotel_#define

#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 200005
#define eps 1e-6
#define mod 1000000007
#define INF 99999999
#define lowbit(x) (x&(-x))
typedef long long LL;
using namespace std;

int lnum[maxn], rnum[maxn], segnum[maxn];
int lmax[maxn], rmax[maxn];
int segmax[maxn], mark[maxn];
int n, m, k, ok, ans;
int ql, qr, cnt;

void build(int o, int L, int R)
{
	lnum[o]=segnum[o]=L, rnum[o]=R;
	lmax[o]=rmax[o]=segmax[o]=R-L+1;
	mark[o]=0;
	if(L==R) return;
	int mid=(L+R)>>1;
	build(o<<1, L, mid);
	build(o<<1 | 1, mid+1, R);
}
void pushdown(int o, int L, int R)
{
	int mid=(R+L)>>1;
	lnum[o<<1]=segnum[o]=L, rnum[o<<1]=mid;
	lnum[o<<1 | 1]=mid+1, rnum[o<<1 | 1]=R;
	lmax[o<<1]=rmax[o<<1]=segmax[o<<1]=mid-L+1;
	lmax[o<<1 | 1]=rmax[o<<1 | 1]=segmax[o<<1 | 1]=R-mid;
	mark[o<<1]=mark[o<<1 | 1]=1;
	mark[o]=0;
}
void _pushdown(int o, int L, int R)
{
	int mid=(R+L)>>1;
	lnum[o<<1]=segnum[o]=L, rnum[o<<1]=mid;
	lnum[o<<1 | 1]=mid+1, rnum[o<<1 | 1]=R;
	lmax[o<<1]=rmax[o<<1]=segmax[o<<1]=0;
	lmax[o<<1 | 1]=rmax[o<<1 | 1]=segmax[o<<1 | 1]=0;
	mark[o<<1]=mark[o<<1 | 1]=2;
	mark[o]=0;
}
void pushup(int o, int L, int R)
{
	int tmp=0;
	if(rmax[o<<1] && lmax[o<<1 | 1]) tmp=rmax[o<<1]+lmax[o<<1 | 1];
	lnum[o]=lnum[o<<1], rnum[o]=rnum[o<<1 | 1];
	if(tmp>=segmax[o<<1] && tmp>=segmax[o<<1 | 1]) segmax[o]=tmp, segnum[o]=rnum[o<<1]-rmax[o<<1]+1;
	else if(segmax[o<<1]>segmax[o<<1 | 1]) segmax[o]=segmax[o<<1], segnum[o]=segnum[o<<1];
	else segmax[o]=segmax[o<<1 | 1], segnum[o]=segnum[o<<1 | 1];
	if(lnum[o]==segnum[o]) lmax[o]=segmax[o];
	else lmax[o]=lmax[o<<1];
	if(rnum[o]==segmax[o]+segnum[o]-1) rmax[o]=segmax[o];
	else rmax[o]=rmax[o<<1 | 1];
}
void updata(int o, int L, int R)
{
	if(ql<=L && qr>=R){
		if(k==1){
			lnum[o]=segnum[o]=L, rnum[o]=R;
			lmax[o]=rmax[o]=segmax[o]=R-L+1;
			mark[o]=1;
		}
		else{
			lnum[o]=segnum[o]=L, rnum[o]=R;
			lmax[o]=rmax[o]=segmax[o]=0;
			mark[o]=2;
		}
		return;
	}
	if(mark[o]==1) pushdown(o, L, R);
	if(mark[o]==2) _pushdown(o, L, R);
	int mid=(R+L)>>1;
	if(ql<=mid) updata(o<<1, L, mid);
	if(qr>mid) updata(o<<1 | 1, mid+1, R);
	pushup(o, L, R);
}
void query(int o, int L, int R)
{
	if(ok) return;
	if(segmax[o]<cnt) return;
	if(L==R){
		ans=L, ok=1;
		return;
	}
	int mid=(R+L)/2;
	if(segmax[o<<1]>=cnt) query(o<<1, L, mid);
	if(ok) return;
	if(rmax[o<<1]+lmax[o<<1 | 1]>=cnt) ans=rnum[o<<1]-rmax[o<<1]+1, ok=1;
	if(ok) return;
	if(segmax[o<<1 | 1]>=cnt) query(o<<1 | 1, mid+1, R);
	if(ok) return;
	ans=segnum[o], ok=1;
}
void solve(void)
{
	int kk;
	while(m--){
		scanf("%d",&kk);
		if(kk==1){
			k=2, ok=0;
			scanf("%d",&cnt);
			query(1, 1, n);
			if(ok){
				printf("%d\n", ans);
				ql=ans, qr=ans+cnt-1;
				updata(1, 1, n);
			}
			else printf("0\n");
			/*
			if(segmax[1]>=cnt){
				printf("%d\n", segnum[1]);
				ql=segnum[1], qr=segnum[1]+cnt-1;
				updata(1, 1, n);
			}
			else printf("0\n");
			*/
		}
		else{
			scanf("%d%d",&ql,&qr);
			qr+=ql-1;
			k=1;
			updata(1, 1, n);
		}
	}
}
int main(void)
{
	while(scanf("%d%d",&n,&m)!=EOF){
		build(1, 1, n);
		solve();
	}
	return 0;
}




标签:3667,segnum,int,segmax,Hotel,mark,POJ,maxn,include
From: https://blog.51cto.com/u_8692734/6636175

相关文章

  • 【树状数组】 POJ 2155 Matrix
    水水的二维树状数组,代码写搓了,找了好久的错。。。#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cst......
  • SPOJ Substrings 题解
    \(\text{SAM}\)入门好题。首先我们需要知道几个关于\(\text{SAM}\)的结论。结论1:题目中的\(f(x)\)单调下降。显然,对于长度为\(x\)的子串,其必存在一个\(x-1\)的后缀,这个后缀的\(\text{endpos}\)集合肯定包含子串的\(\text{endpos}\)集合,所以必有\(f(x-1)\le......
  • POJ 3728 The merchant
    题意好像不清楚:给定一棵\(n​\)个点的树,每个点有点权\(val_i​\),现在有\(q​\)个询问,每次询问给出\(u,v​\),设\(u​\)到\(v​\)的路径上的点编号为\(a_1,a_2\cdotsa_{len}​\),求\(\max\limits_{1\lex<y\lelen}{val_{a_y}-val_{a_x}}​\)。因为\(x,y\)有顺......
  • poj 3233(矩阵快速幂)
    题意:给出一个矩阵A和数字k,要求出矩阵S=A+A^2+A^3+…+A^k。题解:首先A^x可以计算,然后需要折半计算,比如s(k)=(1+A^(k/2))*s(k/2),但k的奇偶不同需要分情况。#include<stdio.h>#include<string.h>constintN=35;structMat{intg[N][N];};intn,k,m......
  • 添加 拼音分词器 与 IK分词器 后的 映射结构与实体类(hotel)【ElasticSearch】
    1、索引库//酒店数据索引库PUT/hotel{"settings":{"analysis":{"analyzer":{"text_anlyzer":{"tokenizer":"ik_max_word","filter":"py"......
  • 分治/质因数分解 POJ1845 求pow(a, b)的所有约数之和
    //POJ1845求pow(a,b)的所有约数之和//方法:1,分解质因数,将a分解成p1^k1*p2^k2^...*pn^kn//2,那么pow(a,b)为p1^(k1*b)*p2^(k2*b)^...*pn^(kn*b)//3,对于单独的pi^(ki*b),他所有的约数为(1,pi,pi^2,pi^3.....pi^(ki*b));//4,那么整个式子来说,pow(a,......
  • VO,DTO,BO,POJO,PO的概念介绍
     po:1.po:popersistentobject持久对象,持久对象的意思指的是可以从内存中存储到关系型数据库中。2.因此一个po对应的数据库中的每一条记录。pojo:1.pojo:plainordinaryjavaobject无规则简单java对象,对应的是我们代码中的实体类。2.pojo持久化之后就是po了,可以看作一个中......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)条边构成的无向图,请你求出该图删除一个点之后,连通块最多有多少。解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节......
  • POJ 3131 - Cubic Eight-Puzzle
    很明显可以看出是一道搜索题。首先考虑\(bfs\),第一种思路是每次从给定的初始状态都进行一次\(bfs\),直到\(30\)停止。然后我们发现,初始状态根据一开始空格的位置不同,一共只有\(9\)种。而一个状态可以用空格的位置、所有位置上方的颜色、所有位置左方的颜色唯一确定,一共\(6^......