题目如下:
AC代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
int s[100009];
int main()
{
int n,q,k;
cin>>n>>q>>k;
for(int i = 1;i<=n;i++)
scanf("%d",&s[i]);
while(q--)
{
int l,r;
scanf("%d %d",&l,&r);
ll ans = 0;
ans += s[l+1] - 2;//第一个
ans +=s[r]+s[r-1]-s[l]-s[l+1]-2*(r-l-1);//中间
ans +=k - s[r-1] - 1;//最后一个
cout<<ans<<endl;
}
}
题目大意:
你写出了一个长长的单调递增整数数列,反复给出数列中的区间,让你把这个区间对应的数列替换成一个“相似数列”。相似数列的定义是:
都要单调递增
两个数列长度相同
所有数字都是1到k之间(包含)的整数
两个数列有且仅有1个位置数字不同
请你算一算,一共有多少个这样的“相似数列”
代码解析:
1.本身原数列单调递增
2.两个数列有且仅有1个位置数字不同
那么我们就可以分析了:
区间起始位置i改变符合条件的个数:s[i+1] - 2(s[i]本身不能选)
区间终止位置i改变符合条件的个数:k - s[i-1] - 1((s[i]本身不能选)
区间中间任意位置i改变符合条件的个数:s[i] - s[i - 1] - 1 + s[i + 1] - a[i] - 1(s[i]本身不能选)
相加整理得(l区间起始位置,r区间终止位置):
a[r] + a[r-1] - a[l] - a[l+1] - 2 * ( r - l - 1)
集训队21~22年跨年赛,补题圆满结束!!!
再次祝大家,新年快乐!!!