首页 > 其他分享 >洛谷 P2894 [USACO08FEB] Hotel G 题解

洛谷 P2894 [USACO08FEB] Hotel G 题解

时间:2023-07-26 13:22:26浏览次数:54  
标签:lazy return int 题解 void al USACO08FEB P2894 id

题目链接

P2894 [USACO08FEB] Hotel G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分析

考虑用线段树维护区间信息

维护sum(最大连续空房间数)

如何合并?

sum1为max(sum2,sum3)(1的两个子区间)

但我们发现若区间为100 001(0表示空房间)

sum1=4而max(sum2,sum3)=2

所以再维护suml(从左开始的最长区间)、sumr(从右开始的最长区间),f(区间是否都为0)

维护上述信息即可

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N=50005;
 5 
 6 int al[N*4][10];//1==sum,3==suml,4==sumr,6==f; 
 7 int lazy[N*4];
 8 
 9 void pushup(int id,int l,int r){
10     al[id][1]=max(al[id*2][4]+al[id*2+1][3],max(al[id*2][1],al[id*2+1][1]));
11     al[id][3]=al[id*2][3]; if(al[id*2][6]) al[id][3]+=al[id*2+1][3];
12     al[id][4]=al[id*2+1][4]; if(al[id*2+1][6]) al[id][4]+=al[id*2][4];
13     if(al[id*2][6]&&al[id*2+1][6]) al[id][6]=1;
14     else al[id][6]=0;//一定要更新 
15 }
16 
17 void pushdown(int id,int l,int r){
18     int m=l+(r-l)/2,v=lazy[id];
19     if(v!=2){
20         al[id*2][1]=al[id*2][3]=al[id*2][4]=(m-l+1)*v;
21         al[id*2][6]=v;
22         lazy[id*2]=v;
23         al[id*2+1][1]=al[id*2+1][3]=al[id*2+1][4]=(r-m)*v;
24         al[id*2+1][6]=v;
25         lazy[id*2+1]=v;
26         lazy[id]=2;
27     }
28 }
29 
30 void bu(int id,int l,int r){
31     lazy[id]=2;
32     if(l==r){
33         al[id][1]=al[id][3]=al[id][4]=al[id][6]=1;
34         return;
35     }
36     int m=l+(r-l)/2;
37     bu(id*2,l,m);
38     bu(id*2+1,m+1,r);
39     pushup(id,l,r);
40 }
41 
42 void add(int id,int l,int r,int s,int t,int v){
43     if(s<=l&&r<=t){
44         al[id][1]=al[id][3]=al[id][4]=(r-l+1)*v;
45         al[id][6]=v;
46         lazy[id]=v;
47         return;
48     }
49     pushdown(id,l,r);
50     int m=l+(r-l)/2;
51     if(s<=m) add(id*2,l,m,s,t,v);
52     if(t>=m+1) add(id*2+1,m+1,r,s,t,v);
53     pushup(id,l,r);
54 }
55 
56 int ask(int id,int l,int r,int x){
57     pushdown(id,l,r);
58     if(l==r) return l;
59     int m=l+(r-l)/2;
60     if(al[id*2][1]>=x) return ask(id*2,l,m,x);
61     else if(al[id*2][4]+al[id*2+1][3]>=x) return m-al[id*2][4]+1;
62     else return ask(id*2+1,m+1,r,x);
63 }
64 
65 int main(){
66     int n,m;
67     scanf("%d %d", &n, &m);
68     bu(1,1,n);
69     
70     for(int i=1;i<=m;i++){
71         int que,x,y;
72         scanf("%d", &que);
73         if(que==1){
74             scanf("%d", &x);
75             if(al[1][1]<x){
76                 cout<<0<<endl;
77                 continue;
78             }
79             y=ask(1,1,n,x);
80             cout<<y<<endl;
81             add(1,1,n,y,y+x-1,0);
82         }
83         else{
84             scanf("%d %d", &x, &y);
85             add(1,1,n,x,x+y-1,1);
86         }
87     }
88     return 0;
89 }

 

标签:lazy,return,int,题解,void,al,USACO08FEB,P2894,id
From: https://www.cnblogs.com/Idtwtei/p/17582207.html

相关文章

  • 网络并发每日习题解释版
    网络并发每日习题解释版1.软件开发架构类别软件开发架构类别:软件开发架构是指在软件设计和开发过程中,用于组织和管理软件系统的基本结构。常见的软件开发架构类别包括:分层架构(LayeredArchitecture):将软件系统划分为多个相互独立的层,每个层都有特定的功能和责任。客户端......
  • 【题解】Educational Codeforces Round 150(CF1841)
    赛时过了A-E,然后就开摆了,为什么感觉C那么无厘头[发怒][发怒]排名:25thA.GamewithBoard题目描述:Alice和Bob玩游戏,他们有一块黑板。最初,有\(n\)个整数\(1\)。Alice和Bob轮流操作,Alice先手。轮到时,玩家必须在棋盘上选择几个(至少两个)相等的整数,擦除它们,然后写一个......
  • 题解 BZOJ4543【[POI2014] HOT-Hotels】
    长链剖分优化DP板子题了,但是虽然是板子这个转移方程也很难想。problem树。求\(\sum_{1\leqi<j<k\leqn}[dist(i,j)=dist(i,k)=dist(j,k)].\)。\(n\leq10^5\)。solution与重链剖分相似,长链剖分是将树剖成很多条长链。我们定义长儿子,为一个点的儿子中子树深度最大的一个儿......
  • Codeforces 1852A Ntarsis' Set 题解
    题目传送门:Codeforces1852ANtarsis'Set题意给定一个集合,里面初始有\(1,2,3...10^{1000}\),告诉你每天会拿掉其中的第\(a_1,a_2,a_3...a_n\)个,询问这样的\(k\)天之后剩下的最小的数是多少。分析思考如果\(x\)在这天没有被删掉,那么哪些被删掉的位置会对它产生什么......
  • CF1776M Parmigiana With Seafood 题解
    先将所有的叶子取\(\max\)贡献给答案,以下讨论的所有点中不考虑叶子。首先可以考虑先手能否删到\(n\):不难发现当\(2\midn\)的时候可以,然后我们就排除了一半的\(n\),于是以下令\(2\not\midn\)。接下来,考虑先手能否删掉\(n-1\),那么把\(n-1\ton\)的路径当成一个大点,......
  • 洛谷 P9221 「TAOI-1」Pentiment 题解
    Description给定\(n\timesm\)的矩阵,从第\(1\)行任意格子出发,每次向下、左、有走一步,有\(q\)个障碍不能经过,求走到第\(n\)行任意格子的方案。对于所有数据,\(1\leqn,m\leq10^9\),\(1\leqq\leq10^5\)。link:https://www.luogu.com.cn/problem/P9221Solution算法一考......
  • 题解 LGP2300【合并神犇】
    Problem随机\(n\)个正整数组成序列。将序列分尽量多的段数,使得前一段的和不大于后一段的和。求能分成多少段。输出\(n-ans\)。\(n\leq10^5\),值域不重要。Solution状态设计为:\(f_i=1+\min_{sum_i-sum_j\geqg_j}f_j\)表示前\(i\)个数字划分的最多段数,\(g_j\)定义为\(f_......
  • 洛谷P3629 [APIO2010] 巡逻题解
    题目链接P3629[APIO2010]巡逻-洛谷|计算机科学教育新生态(luogu.com.cn)思路n个村庄,n-1条道路,原图为树1.若k=0(不修建道路)那么答案为(n-1)*2 每个道路会走两遍2.若k为1(修建一条道路)设修建的道路(r1)所在的环长度为L那么答案为(n-1)*2-L+2可以看到r1所在环的道路只走了......
  • 题解 P1150 【Peter的烟】
    postedon2020-11-1410:00:20|under题解|source2023编者注:本篇题解的方法过于暴力,但是尊重历史。请不要太在意。—-教你们用栈做这道题原题传送门看到这题,第一反应是用stack做。我们可以把Peter手上的烟看作一个栈,一根烟就是一个元素,抽了\(n\)支烟就从栈里pop几个,......
  • 题解 P1008 【三连击】
    postedon2020-11-1217:25:10|under题解|source2023编者注:请尊重历史。本题正解是暴力枚举先引用我们老师的一句话:(无恶意)不会吧不会吧,不会还有人不会写三连击吧!废话不多说,开始解题:理解题目和做题思路P1008三连击题目链接:https://www.luogu.com.cn/problem/......