P2042 [NOI2005]维护数列 fhq treap

博客详细记录了解决P2042维护数列问题的过程,作者在使用fhq_treap解决平衡树问题时遇到了诸多困难,包括错误地一个一个添加元素、反转区间时忽略更新lnum和rnum、update操作未判断子树存在、空间管理不善以及对题意理解错误。通过逐步改进,如批量添加元素、正确处理删除和反转区间、修复update操作及理解最大连续子序列的含义,最终解决了tle的问题。文中也提到心态变化和可能的随机数影响因素。
摘要由CSDN通过智能技术生成

P2042 [NOI2005]维护数列

题目的链接
众多平衡树独爱fhq

题目

有好多种操作:
1、添加一堆数
2、删除一个区间里的数
3、把一个区间里的数全变成同一个数
4、反转一个区间
5、求区间和
6、求最大的连续子序列的和。
因为要求连续的子序列的和,就想到了线段树区间合并。
这个,,应该可以想到。
所以就维护 lnum,rnum,num

做的时候的zz问题

崩溃了~~ 做的时候 我tmd 崩溃了,, 快神经了啊 我
一、添加一堆数我刚开始一个一个添加,, 因为方便(tle)
二、反转一个区间的时候没有反转lnum,rnum 这个问题很愚蠢,很快找到bug
三、update的时候没有判断左右子树是否存在。
四、空间不够用,没有弄回收节点的东西。
五、题意理解错了,一直卡一个点。最大的连续子序列的和不能不选,至少选一个数。wtmd一直以为可以不选,就是0。wtmdzz死了。
———————————假装分界线—————————————————
第一个问题好说,,用添加的点O(num)建一棵树再合并就好了。
第四个问题,删除的时候用一个栈存一下删除的节点,然后就好了。记得初始化!!!! 初始化回收的那个节点。。 不然wa爆你!!!!!
第五个问题,主要是意识不到,,还是看了别人的代码才发现的,在题解区里看到跟我代码差不多的巨巨,,不然我就wa到明年了。
———————————假装分界线—————————————————
于是,上面的都改完还tle。。。
这就真的自闭了,,就差一点点,, 一丁点。。
在这里插入图片描述
于是,心态崩了,又交了一发原来的代码,就ac了。。。 可能因为随机数的问题?
好tmd搞心态啊。

代码

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <unordered_set>
#include <climits>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef unsigned long long ull;
typedef unordered_set<int>::iterator sit;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
void tempwj(){
   freopen("hash.in","r",stdin);freopen("hash.out","w",stdout);}
ll gcd(ll a,ll b){
   return b == 0 ? a : gcd(b,a % b);}
ll qpow(ll a,ll b,ll mod){
   a %= mod;ll ans = 1;while(b > 0){
   if(b & 1)ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;}
struct cmp{
   bool operator()(const pii & a, const pii & b){
   return a.second > b.second;}};
int lb(int x){
   return  x & -x;}
//friend bool operator < (Node a,Node b)   重载
const int inf = INT_MAX;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9+7;
const int maxn = 5e5+10;
const int M = 1e6 + 2;
// std::mt19937 rnd(233);
struct Node
{
   
    int l,r,key;
    int siz;
    int val; // 当前节点的值
    int lnum,rnum,num; // zuo you  最大连续
    int sum;
    int tag;
    int tagf;
    int f;
}node[maxn];
int cnt = 0;
int root = 0;
int sta[maxn];
int pos = 0;
int newnode(int val)
{
   
    int p = 0;
    if(pos >= 1)
    {
   
        p = sta[pos -- ];
        // printf("%d 11111111\n",p);
    }
    else
        p = ++cnt;
    node[p].l = 0;
    node[p].r = 0;
    node[p].f = 0;
    node[p].tagf = 0;
    node[p].tag = 0;
    node[p].val = val;
    node[p].siz = 1;
    node[p].key = rand();
    // printf(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值