首页 > 其他分享 >P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室

时间:2022-11-04 19:22:09浏览次数:68  
标签:node NOIP2012 int rhs 教室 tag xds P1083 sum

#include <iostream>
using namespace std;
const int N = 1e6 + 1 ;
int n , m;
int a [ N ] ;
struct node {
    int tag , sum ;
    node(){ tag = sum = 0 ; }
    void init ( int x , int y ) { tag = x , sum = y ; }
};
namespace xds {
    node tree [ N << 2 ] ;
    void build ( int k , int l , int r ) {
        if ( l == r ) { tree [ k ] . init ( 0 , a [ l ] ) ; return ; }
        int mid = l + r >> 1 ;
        build ( k << 1 , l , mid );
        build ( k << 1 | 1 , mid + 1 , r );
        tree [ k ] . sum = min ( tree [ k << 1 ] . sum , tree [ k << 1 | 1 ] . sum ) ;
        return ;
    }
    void push_down ( int k ) {
        if ( tree [ k ] . tag == 0 ) return;

        tree [ k << 1 ] . tag += tree [ k ] . tag;
        tree [ k << 1 | 1 ]  . tag += tree [ k ] . tag;

        tree [ k << 1 ] . sum += tree [ k ] . tag;
        tree [ k << 1 | 1 ] . sum += tree [ k ] . tag;

        tree [ k ] . tag = 0 ;
        return ;
    }
    void update ( int k , int l , int r , int x , int y , int z ) {
        if ( l >= x && r <= y ) {
            tree [ k ] . tag += z;
            tree [ k ] . sum += z;
            return;
        }
        int mid = l + r >> 1 ;
        push_down ( k ) ;
        if ( x <= mid ) update ( k << 1 , l , mid , x , y , z ) ;
        if ( y > mid ) update ( k << 1 | 1 , mid + 1 , r , x , y , z ) ;
        tree [ k ] . sum = min ( tree [ k << 1 ] . sum , tree [ k << 1 | 1 ] . sum ) ;
        return ;
    }
    int query ( int k , int l , int r , int x , int y ) {
        if ( l >= x && r <= y ) { return tree [ k ] . sum ; }
        int mid = l + r >> 1 ;
        push_down ( k ) ;
        int rhs = ( 1 << 30 );
        if ( x <= mid ) rhs = min ( rhs , query ( k << 1 , l , mid , x , y ) ) ;
        if ( y > mid ) rhs = min ( rhs , query ( k << 1 | 1 , mid + 1 , r , x , y ) ) ;
        return rhs ;
    }
}
int main ( ) {
    // freopen ( "text.in" , "r" , stdin ) ;
    cin >> n >> m;
    for ( int i = 1 ; i <= n ; i ++ ) {
        cin >> a [ i ] ;
    }
    xds :: build ( 1 , 1 , n ) ;
    for ( int i = 1 ; i <= m ; i ++ ) {
        static int x , y , z  ;
        cin >> z >> x >> y ;
        if ( xds :: query ( 1 , 1 , n , x , y ) >= z ) xds :: update ( 1 , 1 , n , x , y , -z ) ;
        else {
            return printf ( "-1\n%d\n" , i ) * 0 ;
        }
    }
    puts("0");
    return 0 ;
}

标签:node,NOIP2012,int,rhs,教室,tag,xds,P1083,sum
From: https://www.cnblogs.com/dadidididi/p/16858868.html

相关文章

  • git小教室
    说明"~"跟"^"区别^caret~tildagitcheckoutHEAD^^^和gitcheckoutHEAD~3等价,都代表当前版本的前3个版本区别在于3和~3代表不同概念,3代表回退一个版本,以第三......
  • 洛谷 P1077 [NOIP2012 普及组] 摆花 (DP)
    https://www.luogu.com.cn/problem/P1077题目描述摆上m盆花。一共有n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同......
  • 进教室
    #include<stdio.h>intmain(){intclass,number;scanf("%d%d",&class,&number);if(class==1&&20<=number<=60){printf("允许进入教室%d\n");}elsep......
  • P1850 [NOIP2016 提高组] 换教室
    [NOIP2016提高组]换教室题目描述对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有\(2n\)节课程安排在\(n\)个......
  • P1077 [NOIP2012 普及组] 摆花
    P1077首先二维数组的DP比较好想,设f(i,j)表示前i种花摆了j盆的方案数,方程为\(f(i,j)=\sum_{k=0}^{a[i]}f(i-1,j-k)\)代码如下:#include<bits/stdc++.h>usingn......
  • 基于Python的高校教室管理系统设计与实现-计算机毕业设计源码+LW文档
    摘 要随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。高校教室管理系统,主要的模块包括查看首页、个人中......
  • P1078 [NOIP2012 普及组] 文化之旅
    https://www.luogu.com.cn/problem/P1078搜索,图论,剪枝,最短路绿色题思路一:搜索1.输入,建边,用一个数组存储已经学习的文化,2.搜索,以当前的点now去看能走到哪些边,......
  • I [NOIP2012]开车旅行 每次往第一或者第二近的点走,求最大比值 倍增算法 set
    链接:https://ac.nowcoder.com/acm/problem/16562来源:牛客网题目描述小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较......
  • 洛谷P1850 [NOIP2016 提高组] 换教室(期望dp)
    #include<bits/stdc++.h>usingnamespacestd;intn,m,v,e;intc[3005],d[3005];intf[305][305];doubledp[3005][3005][2];//dp[i][j][k]表示前i步申请更换了j......
  • P1081 [NOIP2012 提高组] 开车旅行
    记城市\(i\)的海拔高度为\(h_i\),\(i\)和\(j\)之间的距离\(d_{i,j}=|h_i-h_j|\)。旅行过程中,两人轮流开车,第一天\(A\)开车,之后每天轮换一次。选择一个城市\(s\)......