設 \(f_i\) 表示以 \(i\) 結尾的最大答案
發現只考慮當 \(a_i\) 是最大值時的轉移也是正確的
即 \(f_i=\max_^ \\)
因為若中間夾著個比 \(a_i,a_j\) 值都大的值的話肯定不會優
然後李超樹維護就行
首先,如果知道了序列的最大值 \(mx\),設詢問的集合為 \(s\),並且詢問 \(s\bigcup \),就可以知道集合所有元素與最大值的差
先考慮找到最大值,首先全體詢問得到極差 \(k\),然後二分字首得到 \(k\) 第一次出現的位置,即為最大值或最小值,設為 \(x\)
然後設 \(s_i\) 表示第 \(i\) 個二進位制位為 \(1\) 的數的集合,詢問 \(s_i\) 和 \(s\bigcup \) 得到與 \(x\) 的差
然後就能得到 \(a_i\)與 \(x\) 的差
\(qry1\) 詢問差最大的那個數並與 \(x\) 比較,就能確定 \(x\) 是最大還是最小
t1
#include#includeusing namespace std;
#define il inline
#define int long long
const int n=1e6+11;
const int inf=1e18;
struct seg_
seg_(int k_,int val_)
};struct treetre[n*4];
int n,c;
int a[n];
il int pd(int x)
il int max_(int x,int y)
int get_ans(seg_ a,int x)
bool check(seg_ a,seg_ b,int x)
void ins(int i,int l,int r,seg_ x)
if(check(tre[i].x,x,mid))swap(tre[i].x,x);
if(l==r)return;
if(check(tre[i].x,x,r))ins(i<<1|1,mid+1,r,x);
if(check(tre[i].x,x,l))ins(i<<1,l,mid,x);
}int qry(int i,int l,int r,int x)
signed main()
}return x;
}setpop(seta,setb)return a;
}void find(int n,int m1,int m2)
for(int i=0;i<8;++i)
} for(int i=0;i}
12月2日衝刺報告
這個作業屬於哪個課程 這個作業要求在 homework 11541 這個作業的目標 開發 今天完成了什麼內容?搜尋介面一部分 翌日的計畫?完成搜尋介面 還剩下哪些任務?完成搜尋介面 今日開發中遇到了哪些困難?暫無在今日的開發中有哪些收穫 疑問?暫無今日燃盡圖 1.今天完成了什麼內容?完善前端的內容 ...
2月8日 語句
1。switch 表示式 表示式可以是整形,字元型,列舉型 int a int在外部定義 a 65 float型別就不對了 2。do 語句 while 表示式 和while 語句有什麼區別 先進迴圈,後判斷 第二個是先判斷 include using namespace std int main c...
2023年8月2日筆記
圖形演示 命令操作 1 tcp ip架構 協議概述 圖 2 內部命令與外部命令 圖 3 查詢幫助資訊 a help 命令分類 1 內部命令 help command 2 外接命令 command help h b man more man cmmand 向下查詢指定內容 ubuntu n 向下查詢 ...