國家集訓隊 等差子串行 題解

2022-07-13 20:03:19 字數 938 閱讀 7506

題面

我們尋找乙個東西總是比判斷乙個東西複雜,對吧;

那麼就轉化思路:如果我們知道等差數列的中間項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 的...