【資料結構】二進位制分組解決一類強制線上問題
Text
這種技巧來源於論文:許昊然《淺談資料結構題的幾個非經典解法》
你需要對什麼東西支援若干個修改和詢問操作,強制線上,如果去掉強制線上,那麼是可以對時間分治來解決的。
換句話說,這類題目滿足能夠對於每個修改單獨計算對每個詢問的答案(修改之間是獨立的) 我們將修改操作每2的冪次分一組,每一組用資料結構維護
當出現詢問時,就暴力跳每一組,在組中的資料結構查詢。 出現新的修改時,就類似2048(逃)一樣的向左合併組。
假設當前我們有13個修改操作,組的大小是8 4 1 新加入一個修改,變成8 4 1 1 合併就變成 8 4 2 以此類推。
合併組的時候就暴力重構這個資料結構
分析這樣的時間複雜度 論文中如是說
考慮我們加入第k個操作所需要重構的組的大小 可以發現其實就是lowbit(k) 假設我們維護每一組的資料結構的複雜度為O(f(size)) 組數一定是不超過logk組的,那麼總的詢問時間複雜度就是O(qlogn∗f(n)) 總的修改時間複雜度就是i=1∑nO(f(lowbit(k))) =i=1∑lognO(⌈2i+1n⌉∗f(2i)) ≤i=1∑lognO(f(i))=O(f(n)logn)
相關推薦
【資料結構】二進位制分組解決一類強制線上問題
Text 這種技巧來源於論文:許昊然《淺談資料結構題的幾個非經典解法》 你需要對什麼東西支援若干個修改和詢問操作,強制線上,如果去掉強制線上,那麼是可以對時間分治來解決的。 換句話說,這類題目滿足能夠對
【java資料結構】遞推解決的漢諾塔問題
在學習資料結構的時候,遇到漢諾塔問題,就寫了自己的理解,希望對您有幫助。 package com.qxlx.six; /** * 遞推解決的漢諾塔問題 * * @author jia * */ public class TowerApp { public
【資料結構】—— 1、不要小瞧陣列
2-1、 使用Java中的陣列 2-2 二次封裝屬於我們自己的陣列 2-3 向陣列中新增元素 2-4 陣列中查詢元素和修改元素 2-5 包含,搜尋和刪除 2-6 使用泛型 2-7 動態陣列 2-8 簡單的複雜度分析 2-9 均攤複雜度和防止複雜度的震盪
【資料結構】【多項式連結串列實現相加】
#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1006; struct node { double coef; int exp; struct n
【資料結構】【合併兩個有序連結串列】
#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn = 1e5 + 5; struct node { int num; struct node *next; }; s
雙棧實現整數(支援大於十的整數)計算器【資料結構】
通過棧的操作實現簡單的計算器 首先定義兩個棧,一個叫s_num用來存放運算元,另一個叫s_opt用來存放操作符。 再定義一個字元陣列用來存放輸入的表示式,初始化為0; 當表示式的字元不為‘/0’時,或者操作符棧中不為空的時候,就要一直執行程式! 在執行的時候做兩個判斷,輸入的不是數字
【資料結構】二叉樹的相關操作(待更)
#include "stdio.h" #include "stdlib.h" typedef struct node { char data; struct node *rchild,*lchild; }bintnode; typedef bintnode *bintree;//指向該結構體
【資料結構】【二】陣列實現的線性表(線性表的順序儲存結構)
資料結構 陣列實現線性表 通過陣列實現了一個簡單的線性表 功能: 在陣列尾部新增元素 在陣列指定位置新增元素 根據下標獲取元素 根據下標刪除元素 根據元素刪除元素 獲取當前陣列長度 判斷當前陣列是否為空 列印陣列元素 public
【資料結構】【一】基本概念
資料基本概念: 資料:描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合.資料元素:是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理.比如人,牛,羊.資料項:一個數據元素可以由若干個資料項組成,比如人可以有眼,耳,鼻,也可有姓名,年齡,地址
【資料結構】【線段樹】2018國慶三校聯考D5T3
題意: 分析: 有一個顯然的暴力方法: 對每個詢問,從左往右做一次,記錄字首和,當某個位置字首和為負後,則刪去當前點。再從右往左做一次。 考慮使這個過程變得高效: 可以將詢問按左端點從右往左排序,然後用棧依次處理每個在從左往右考慮時是否需要刪除。 再利用線段樹,求
【資料結構】二叉樹的建立和遍歷(非遞迴)
該程式使用的是遞迴地建立方法,以及非遞迴的遍歷演算法 執行環境:Dev-C++ #include <stdio.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild
【資料結構】二叉樹的建立與遍歷(遞迴)
該程式全是使用遞迴的操作 執行環境是:Dev-C++ #include <stdio.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild,*rchild; }bi
【C#】【資料結構】001-線性表:順序表
C#資料結構:順序表結構 1、自定義順序表結構 using System.Collections; using System.Collections.Generic; /// <summary> ///線性表介面 /// </summary> /// <type
【資料結構】
1.有了遞迴,為什麼還需要非遞迴? 嚴格來說,是因為非遞迴的效率比遞迴的效率高,但是,我們都知道,現在的編譯器很強大,優化的效果也非常好,所以非遞迴的效率並不比遞迴好多少,那麼為什麼還要使用非遞迴呢?最主要的原因是遞迴有一個非常大的缺陷:它只適合在分治的情況下使用,當你的應用場景下面遞迴深度太深
【資料結構】前序遍歷與中序遍歷構造二叉樹
根據一棵樹的前序遍歷與中序遍歷構造二叉樹 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNo
【資料結構】中序遍歷與後序遍歷構造二叉樹
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNod
【資料結構】8種排序的比較
直接插入排序 ①所給元素越接近有序,直接插入排序的時間效率越高 ②時間複雜度: O(N^2) ③空間複雜度: O(1) ④穩定性: 穩定 希爾排序 ①希爾排序是對直接插入排序的優化 ②當gap >
【資料結構】希爾排序(ShellSort)
概念: 希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內
【資料結構】直接插入排序
概念: 直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一一個新的有序序列。 核心思想: &nb
【資料結構】計數排序
概念: 計數排序,又稱為鴿巢原理,是對雜湊定址法的變形應用。 核心思想是: 具體程式碼如下: void CountSort(int* a, int n)//計數排序 { int max = a[0]; int min = a[0]; for (in