區間內所有元素排序後,任意相鄰兩個元素值差為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 如果沒有...