51Nod1810 連續區間

2021-08-08 16:13:29 字數 1275 閱讀 7620

區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為「連續區間」

如:3,1,2是連續區間,但3,1,4不是連續區間

給出乙個1~n的排列,求出有多少個連續區間

input

乙個數n(n<=1,000,000)

第二行n個數,表示乙個1~n的排列

output

乙個數,表示有多少個連續區間

input示例

5 2 1 5 3 4

output示例

9 樣例解釋:

區間[1,1][2,2][3,3][4,4][5,5][1,2][4,5][3,4][1,5]為連續區間//[l,r]表示從第l個數到第r個數構成的區間

題解 **

#include

#define mod 998244353

#define inv 499122177

#define n 1000005

typedef __float128 f;

typedef

long

long ll;

using

namespace

std;

inline

int read()

return x;

}int n,mx[n],mn[n],a[n],d[n<<2],ans;

void solve(int l,int r)

int mid=(l+r)>>1;

mx[mid]=mn[mid]=a[mid];mx[mid+1]=mn[mid+1]=a[mid+1];

for (int i=mid-1;i>=l;i--) mx[i]=max(a[i],mx[i+1]),mn[i]=min(a[i],mn[i+1]);

for (int i=mid+2;i<=r;i++) mx[i]=max(a[i],mx[i-1]),mn[i]=min(a[i],mn[i-1]);

for (int i=mid;i>=l;i--)

ans+=d[mx[i]+i+n];

}while (l<=r) d[mn[l]+l+n]--,l++;

l=mid+1;r=mid;

for (int j=mid+1;j<=r;j++)

ans+=d[mx[j]-j+n];

}while (r>=l) d[mn[r]-r+n]--,r--;

solve(l,mid);solve(mid+1,r);

}int main()

51nod 1810 連續區間

區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 乙個數,表示有多少個連續區間 5 2 1 5 3 4 考慮分治,每...

51nod1094連續為k的區間和

一整數數列a1,a2,an 有正有負 以及另乙個整數k,求乙個區間 i,j 1 i j n 使得a i a j k。input 第1行 2個數n,k。n為數列的長度。k為需要求的和。2 n 10000,10 9 k 10 9 第2 n 1行 a i 10 9 a i 10 9 output 如果沒有...

51nod 1094 和為k的連續區間

一整數數列a1,a2,an 有正有負 以及另乙個整數k,求乙個區間 i,j 1 i j n 使得a i a j k。input 第1行 2個數n,k。n為數列的長度。k為需要求的和。2 n 10000,10 9 k 10 9 第2 n 1行 a i 10 9 a i 10 9 output 如果沒有...