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(&