首页 > 其他分享 >CF500F New Year Shopping

CF500F New Year Shopping

时间:2022-11-21 11:22:51浏览次数:38  
标签:pii Shopping CF500F top2 top1 int MAXN fi New

双栈维护插入删除:

  1. 右加右删。维护一个栈。

  2. 右加左删。

维护两个栈,左边栈删除,右边的栈加入,左边栈为空时将右边栈中的数从顶至底加入,均摊进行 \(\mathcal O(n)\) 次操作。

  1. 双端加、删

维护两个栈,用于左边插入/删除,右边插入/删除。

其中一个栈为空时将另一个栈的元素对半分到两个栈,均摊进行 \(\mathcal O(n)\) 次操作。

维护栈的前缀答案,查询时将两个栈栈顶的答案合并即可

优势在于可以在线维护信息,且比线段树分治少一个 \(\log\)。


此题即为情况 2,直接做就好了。

#include <bits/stdc++.h>
using namespace std;
#define pii pair< int , int >
#define fi first
#define sc second
#define mp make_pair
 
const int MAXN = 4e3 , MAXT = 2e4;
int n , p , q; vector< pii > b[ MAXT + 5 ] , qry[ MAXT + 5 ];
int ans[ MAXT + 5 ];
 
int top1 , top2; pii stk1[ MAXN + 5 ] , stk2[ MAXN + 5 ];
int f1[ MAXN + 5 ][ MAXN + 5 ] , f2[ MAXN + 5 ][ MAXN + 5 ];
/*
左端删除,右端插入
*/
inline void Insert2( pii v ) {
    stk2[ ++ top2 ] = v;
    for( int i = 0 ; i <= MAXN ; i ++ ) {
        f2[ top2 ][ i ] = f2[ top2 - 1 ][ i ];
        if( i >= v.fi ) f2[ top2 ][ i ] = max( f2[ top2 ][ i ] , f2[ top2 - 1 ][ i - v.fi ] + v.sc );
    }
}
inline void Insert1( pii v ) {
    stk1[ ++ top1 ] = v;
    for( int i = 0 ; i <= MAXN ; i ++ ) {
        f1[ top1 ][ i ] = f1[ top1 - 1 ][ i ];
        if( i >= v.fi ) f1[ top1 ][ i ] = max( f1[ top1 ][ i ] , f1[ top1 - 1 ][ i - v.fi ] + v.sc );
    }
}
inline void Delete( ) {
    if( !top1 ) {
        while( top2 ) Insert1( stk2[ top2 -- ] );
    } top1 --;
}
inline int Query( int v ) {
    int ans = 0;
    for( int i = 0 ; i <= v ; i ++ ) ans = max( ans , f1[ top1 ][ i ] + f2[ top2 ][ v - i ] );
    return ans;
}
 
int cnt[ MAXT + 5 ];
int main( ) {
    scanf("%d %d",&n,&p);
    for( int i = 1 , v , w , t ; i <= n ; i ++ ) scanf("%d %d %d",&v,&w,&t) , b[ t ].push_back( mp( v , w ) );
    scanf("%d",&q);
    for( int i = 1 , a , b ; i <= q ; i ++ ) scanf("%d %d",&a,&b) , qry[ a ].push_back( mp( b , i ) );
    
    for( int i = 1 ; i <= MAXT ; i ++ ) {
        for( pii v : b[ i ] ) Insert2( v ) , cnt[ i + p ] ++;
        for( int j = 1 ; j <= cnt[ i ] ; j ++ ) Delete();
        for( pii v : qry[ i ] ) ans[ v.sc ] = Query( v.fi );
    }
    for( int i = 1 ; i <= q ; i ++ ) printf("%d\n", ans[ i ] );
    return 0;
}

标签:pii,Shopping,CF500F,top2,top1,int,MAXN,fi,New
From: https://www.cnblogs.com/chihik/p/CF500F.html

相关文章

  • 在java中new一个对象的流程是什么?
    Dogdog=newDog()背后执行过程这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,......
  • 关于newlib中的libgloss和libnosys
    关于newlib中的libgloss和libnosys​​Newlib的构成​​​​libgloss的作用​​​​提供启动代码​​​​提供底层I/O支持​​​​提供底层系统函数​​​​libnosys是什么......
  • python安装报错error: pybind11 2.10+ requires MSVC 2017 or newer
    pip安装paddleocr时报错,提示要2017或更高,c:\users\administrator\appdata\local\temp\pip-build-env-86xs2ijc\overlay\lib\site-packages\pybind11\include\pybind11\det......
  • malloc和new
    C语言中的malloc()和free()malloc//void*malloc(intsize);//malloc向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。......
  • New关键字
    1、创建对象2、隐藏从父类那里继承过来的同名成员,隐藏的后果就是子类调用不到父类的成员了。子类名称和父类名称写的一样的时候,你就调用不到父类的成员了,如果你故意这么......
  • java new 一个对象的过程
    转载:https://blog.csdn.net/weixin_46439885/article/details/125034792......
  • cuda安装遇到you already have a new version of the nvidia frameview. have new
    cuda11.2安装时和nvidiaframeviewsdk冲突怎么解决呀?-知乎(zhihu.com)  设置-应用-卸载nvidiaframeview.......
  • new Vue的时候到底做了什么
    Vue加载流程1.初始化的第一阶段是Vue实例也就是vm对象创建前后:首先Vue进行生命周期,事件初始化发生在beforeCreate生命周期函数前,然后进行数据监测和数据代理的初始化,也就......
  • GL-Learning new words 20221115
    GLLearingnewwords20221115HowdoyoulearnnewwordsinEnglish?WhenIcomeacrossawordthatIdon'tknow,Idirectlycheckthepronunciationanddefini......
  • new 在堆内存中开辟内存空间,delete 释放开辟的内存空间
    intmain(){int*p=newint(10);cout<<*p<<endl;deletep;cout<<*p<<endl;int*arr=newint[10];......