Offer收割 程式設計練習賽51 等差子數列

2021-08-17 04:43:44 字數 1705 閱讀 4630

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

給定n個整數a1, a2, ... an,小hi會詢問你m個問題。

對於每個問題小hi給出兩個整數l和r(l ≤ r),請你找出[al, al+1, al+2, ... ar]中最長的等差連續子數列,並輸出其長度。  

例如[2, 3, 5, 7, 9]中最長的等差連續子數列是[3, 5, 7, 9]長度為4。

第一行包含兩個整數n和m。  

第二行包含n個整數a1, a2, ... an。  

以下m行每行包含兩個整數l和r,代表一次詢問。

對於30%的資料,1 ≤ n, m ≤ 1000  

對於100%的資料,1 ≤ n, m ≤ 100000 0 ≤ ai ≤ 10000000

依次對於每個詢問輸出乙個整數,代表答案。

樣例輸入

6 2  

1 2 3 5 7 9

2 6

1 4

樣例輸出
4  

3

/*

線段樹區間合併

主要是up操作 和 查詢操作

所以我們要在樹的結構體中增加三個變數(左邊的最長區間,右邊的最長區間,最長合區間)

主要是理解左子樹的右子樹 和 右子樹的左子樹是如何影響區間的合區間。

參考了大神**,寫的十分簡潔明瞭。

*/#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

const int maxn=1e5+10;

int a[maxn];

struct node

node(int _l,int _r,int _mx,int _ls,int _rs,int _sum)

node operator +(const node&p)const

}if(p.sum==p.rs)

}if((rs==1||(a[r]-a[r-1]==cha))&&(p.ls==1||(a[p.l+1]-a[p.l]==cha)))

ret.mx=max(ret.mx,p.ls+rs);

if((rs==1||(a[r]-a[r-1]==cha)))

ret.mx=max(ret.mx,1+rs);

if((p.ls==1||(a[p.l+1]-a[p.l]==cha)))

ret.mx=max(ret.mx,1+p.ls);

return ret;

}} st[maxn<<2];

void up(int rt)

void build(int l,int r,int rt)

int mid=l+r>>1;

build(lson);

build(rson);

up(rt);

}node query(int a,int b,int l,int r,int rt)

return ret;

}int main()

return 0;

}

Offer收割 程式設計練習賽1

做了三題,題目都比較暴力。a題 題意 給你乙個三階的幻方,三階幻方指的是將1 9不重複的填入乙個3 3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。現在準備將乙個三階幻方中的一些陣列抹掉 0代替 交給你來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。如果只有一組解,輸出該三階幻方...

Offer收割 程式設計練習賽7

比較容易想到是o n 2 的解決方案,遍歷n種刪除可能,每次遍歷o n 時間求總高度。前者優化比較困難,因而想辦法優化每次遍歷求高度的時間。由前往後遍歷,當刪除第i個時,先前的排版是連續的,從而通過計數器等累加方法可以求得已完整行的總高度presum,以及當前未完整行的w,h。include def...

Offer收割 程式設計練習賽26

題解 按照條件求解出最大的三角形和最小的三角形,然後求重心即可。這裡求解面積有兩種方法 海 式 p p a p b p c 將三角形的每一條邊求解出來,然後進行處理 用有向向量進行計算,如果設a x0,y 0 b x1,y 1 c x2,y 2 三點為三角形三個頂點,a 為有向面積,那麼2a x0 ...