題面
我們尋找乙個東西總是比判斷乙個東西複雜,對吧;
那麼就轉化思路:如果我們知道等差數列的中間項mid,那麼就是尋找一對數(l,r),使得abs(mid-l)==abs(mid-r),且l
可以列舉每個數作為中間項,然後o(n)的判斷是否存在這樣的數對(l,r);
但這是o(n^2)的,複雜度無法接受;
那麼考慮優化:
我們知道,對於每次列舉只要有乙個數對就存在答案;
對於已經列舉過的點,標記為1;否則是0;
這樣序列就變成了乙個01序列;
對於每個中間項,存在答案當且僅當左右的乙個對稱位置的01數值不同;
也就是說:對於每個中間項只有左右兩側的序列的hash值只有在完全相同的情況下才不存在解;
hash值可以使用樹狀陣列或者線段樹來維護;
複雜度變成了o(nlogn);
#include #define inc(i,a,b) for(register int i=a;i<=b;i++)#define ull unsigned long long
using
namespace
std;
int a[100010
];ull hash1[
100010],hash2[100010],pre[100010
];const
int p=1e9+7
;int
n;class
node
void adda(int x,ull v)
void addb(int x,ull v)
ull aska(
int x)
ull askb(
int x)
}tree;
intmain()
}if(flag)
}return0;
}
luogu P2757 國家集訓隊 等差子串行
簡述題意 時間複雜度 o t n 2 難度 noip 演算法 據說正解是 線段樹 樹狀陣列 維護 hash 但我是用迴圈水過的,逃.我們只需要找到序列長度為3的即可!我們考慮將讀入的這個點作為乙個等差序列子串行的中間元素x,那麼我們列舉它左邊的元素a x 因為我們還需要保證下標單調遞增,所以我們對所...
洛谷P2757 國家集訓隊 等差子串行
題意簡化就是找到a i a j a k 成乙個len 3的等差數列,且a j a i a k a j 那麼列舉a j 為方便從左到右列舉,設數字x在j左邊為1,在右邊為0 那麼可以用樹狀陣列維護乙個hash值,如果a j d和a j d在不同邊也就是乙個是0乙個是1,那麼就存在一組等差序列了 也就是...
國家集訓隊 Tree II 題解
題目傳送門 題目大意 給一棵樹,若干種操作 路徑加,路徑乘,刪邊加邊,求路徑和。看到刪邊加邊就知道是 lct lctlc t 了。路徑加路徑乘都是打個標記的事,但是在更新 sum sumsu m 的時候,sum sumsu m 不僅要乘上乘法標記,還要加上加法標記乘 siz esize size 的...