如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1032

来自"NOCOW"

跳转到: 导航, 搜索

由于所选的数是连续的,则可以枚举每一个区间,这样的时间复杂度是 O(N^2)的. 下面讲一下O(N)的算法: 对于这N个数,从第一个数加到第I个数,我们记作S[I], 1.假如有S[I] MOD N=0,那么1~I即为一个可行解, 2.假如S[I] MOD N=S[J] MOD N(I<J),那么I+1~J即为一个可行解


这不是也是N^2的吗?…………怎么变成O(N)的了


VAR
  a,f:array [0..10000] of longint;
  i,j,k,n,x,y:longint;
Procedure work(a,b:longint);
BEGIN
  x:=a;
  y:=b;
  k:=b-a+1;
END;
BEGIN
  readln(n);
  k:=Maxlongint;
    for i:=1 to n do
      BEGIN
        readln(a[i]);
        f[i]:=(f[i-1]+a[i]) mod n;
          if f[i]=0 then work(1,i);
      END;
    for i:=1 to n do
      for j:=i+1 to n do
        if f[i]=f[j] then work(i+1,j);
    if k=Maxlongint then writeln(0)
      else
        BEGIN
          writeln(k);
            for i:=x to y do writeln(a[i]);
        END;
END.
//from lzoi_ys

楼上的好像是O(N^2)额。。。 发个O(N)的~

#include <iostream>
using namespace std;
int N,a[10001],sum[10001]={0},f[10001]={0};
int main()
{
    cin >> N;
    for (int i=1;i<=N;i++)
        cin >> a[i];
    for (int i=1;i<=N;i++)
    {
        sum[i]=(a[i]+sum[i-1])%N;
        if (f[sum[i]] || (sum[i] == 0))
        {
            cout << i-f[sum[i]] << endl;
            for (int j=f[sum[i]]+1;j<=i;j++)
                cout << a[j] << endl;
            break;
        }
        f[sum[i]]=i;
    }
    return 0;
}
//by zzy
个人工具