您的位置:首页 > 其它

CodeForces Round #278 (Div.2) (待续)

2014-11-23 00:47 387 查看
A

这么简单的题直接贴代码好了。

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100000 + 10;
long long a[maxn], last = 0;
bool flag = true;

int main(void)
{
//freopen("Din.txt", "r", stdin);

long long n, s, l, ans = 0;
scanf("%I64d%I64d%I64d", &n, &s, &l);
for(int i = 0; i < n; ++i) scanf("%I64d", &a[i]);

long long pos, left, right;
for(pos = 0; pos < n; ++pos)    //从pos位置开始延伸
{
long long maxm, minm, cnt = 1;    //区间延伸过程中的最小值和最大值以及区间中元素的个数

maxm = a[pos], minm = a[pos];
right = pos + 1;
while(right < n)
{
maxm = max(maxm, a[right]);
minm = min(minm, a[right]);
if(maxm - minm <= s) cnt++;
else break;
right++;
}
right--;

//maxm = a[pos], minm = a[pos];
left = pos - 1;
while(left >= last)
{
maxm = max(maxm, a[left]);
minm = min(minm, a[left]);
if(maxm - minm <= s) cnt++;
else break;
left--;
}
left++;

if(cnt < l)
{
flag  =false;
break;
}
ans++;
last = left + l;
pos = right;
}

if(!flag) ans = -1;
printf("%I64d\n", ans);

return 0;
}


代码君
E(数论+构造)

题意:

给出一个正整数n,问是否存在一个 1~n的排列,使得前i个数的乘积模上n的余数得到的序列是0~n-1的一个排列。

分析:

当n为1、4和素数的时候有解,构造方法是用 (i+1)*(i的逆元)%n 填充当前的数。

这道题先留着,等我比较系统地学习数论以后在给出严格证明以及代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: