我只是循規蹈矩地生活,慣於離經叛道,體味心安理得。亦於按部就班,痛感乏善可陳。我欺騙過,偽裝過,失真過,但置我於死地者,必將賜我以後生。
這次考試太慘,直接說題目吧。
這道題十分之坑爹,如果只有賦值操作或只有增加操作那十分簡單,直接敲區間修改線段樹模板就好了。但它要求支援兩個操作。
那麼我們要這樣想。
因為它有兩個操作,增值和賦值。那麼我們設定兩個lazy標記分別表示增值的和賦值的量(**中我們用value增值,delta賦值)。然後咋整呢?
我們討論一下,1、原來的線段上有增值標記那麼我們進行增值操作的時候之間標記加值就好了。如果是賦值操作那麼就覆蓋掉原來的增值。等等。。。。
所有討論如下:
空標記+ 賦值操作= 賦值標記
空標記+ 增量操作= 增量標記
增量標記+ 賦值操作= 賦值標記
增量標記+ 增量操作= 增量標記
賦值標記+ 增量操作= 賦值標記
賦值標記+ 賦值操作= 賦值標記
所以我們再設定乙個type表示無標記、增值標記和賦值標記。
**中我們用0無,1增值,2賦值來表示。
然後就是碼**了,詳解見**:
#include
#include
#include
#define n 100005
#define dnt long long
using
namespace
std;
int aa[n], n, m, x, y, z;
struct node;
void change( node *nd, int lf, int rg, int l, int r, int val );
void modify( node *nd, int lf, int rg, int l, int r, int val );
struct node
else
}void update()
};node pool[n * 2], *tail = pool, *root;
node *build(int lf, int rg)
else
return nd;
}void change( node *nd, int lf, int rg, int l, int r, int val )
else
if ( nd->type == 1) nd->value += val; // 增值和增值操作標記種類不變,在增值標記上加
else nd->delta += val; // 賦值對增值操作為賦值標記,所以在賦值標記上加
模板題:動態主席樹(用樹狀陣列套值域線段樹實現)
#include
#include
#include
#include
#define dnt long long
#define clear(a) memset(a, 0, sizeof(a))
#define n 100005
#define lowbit(x) x & -x
using namespace std;
int n, m, aa[n], ca, cb, x, y, k;
char s[10];
struct node;
struct node pool[200 * n], *tail = pool, *roots[n], *null;
struct node *va[n], *vb[n];
node *newnode()
void init()
void modify( int lf, int rg, int
pos, int delta )
modify(lf, mid, pos, delta);
}else
modify(mid+1, rg, pos, delta);
}}void modify( int u, int
pos, int delta )
void modify( int u, int val )
int query_seg( int lf, int rg, int k )
else
}int query( int l, int r, int k )
int main()
else
}return
0;}
思念著 資料結構(4)
1 允許進行插入 刪除操作的一端叫棧頂 2 表的另一端叫棧底 3 當棧中沒有資料元素時稱為空棧 4 插入叫進棧或入棧 5 刪除叫退棧或出棧 特點 後進先出 順序棧typedef struct sqstack 初始化棧 void initstack sqstack s s為棧指標,top為s所指棧的棧...
4 資料結構
4.2 線段樹 4.1 樹狀陣列 4.1.1 普通樹狀陣列 僅支援單點修改區間查詢。const int maxn 1e5 10 int tree maxn intlb int x intread int x return tot void add int num,int x 4.1.2 普通二維樹狀...
資料結構4
實現getelem的具體操作,即將線性表l中的第i個位置的元素值返回。我們只需把陣列第i 1下標的值返回即可 define ok 1 define error 0 define true 1 define false 0 typedef int status status 是函式的型別,其值是函式結...