又联考了一场,感觉自己好菜啊,T1没写出来,后来花了一个早上调试。QAQ。最后发现是个-1还有取模没打。。。TAT。。。难受极了!!!

 

简单的区间(interval)

题目描述:

1508393780639191011.png

样例输入:

样例1:
4 3
1 2 3 4

样例2:
4 2
4 4 7 4

样例输出:

样例1:
3

样例2:
6

提示:

1508393828908586555.png

时间限制:1000ms
空间限制:512MByte

之前写了一个的代码

#include<bits/stdc++.h>
#define maxn 1001000
#define ll long long
using namespace std;

ll n,k,a[maxn],s[maxn],cun[maxn],ans;
vector <ll> up[maxn],down[maxn];

void update(ll l,ll r,ll val)
{
    if(!r) return; 
    up[max((ll)0 , l)].push_back(val);
    down[max((ll)0 , r)].push_back(val);
}

void find(ll l,ll r)
{
    if(l >= r) return;
    ll ma = 0,pos;
    for(ll i=l;i<=r;i++)
    {
        if(a[i] > ma)
        {
            ma = a[i];
            pos = i;
        }
    }
    
    find(l,pos - 1);
    find(pos + 1,r);
    if(pos - l <= r - pos)//求右边 
    {
        update(pos + 1,r,(s[pos - 1] + ma) % k);
        for(ll i=l;i<pos;i++)
        {
            ll val = (s[i - 1] + ma) % k;
            update(pos,r,val);
        }
    }
    else//求左边 
    {
        update(l-1,pos - 2,(s[pos] - ma % k + k) % k);
        for(ll i=pos + 1;i<=r;i++)
        {
            ll val = (s[i] - ma % k + k) % k;
            update(l-1,pos-1,val);
        }
    }
}

void query()
{
    for(ll i=0;i<=n;i++)
    {    
        for(ll j=0;j<up[i].size();j++)
            cun[up[i][j]]++;
        ans += cun[s[i]];
        for(ll j=0;j<down[i].size();j++)
            cun[down[i][j]]--;
    }
}

int main(){
    scanf("%lld%lld",&n,&k);
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        s[i] = (s[i - 1] + a[i]) % k;
    }    
    find(1,n);
    query();
    printf("%lld",ans);
}

结果惨遭卡常!!!

TAT____

然后卡卡常数就过了。。。

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define maxn 1001000
#define ll long long
#define R register
using namespace std;

ll n,k,a[maxn],s[maxn],cun[maxn],ans;
vector <ll> up[maxn],down[maxn];

inline void update(ll l,ll r,ll val)
{
    if(!r) return; 
    up[max((ll)0 , l)].push_back(val);
    down[r].push_back(val);
}

inline void find(ll l,ll r)
{
    if(l >= r) return;
    ll ma = 0,pos;
    for(R ll i=l;i<=r;++i)
    {
        if(a[i] > ma)
        {
            ma = a[i];
            pos = i;
        }
    }
    find(l,pos - 1);
    find(pos + 1,r);
    if(pos - l <= r - pos)//求右边 
    {
        update(pos + 1,r,(s[pos - 1] + ma) % k);
        for(R ll i=l;i<pos;++i)
        {
            ll val = (s[i - 1] + ma) % k;
            update(pos,r,val);
        }
    }
    else//求左边 
    {
        update(l-1,pos - 2,(s[pos] - ma % k + k) % k);//就是这里,TM%没有打!!! TM-1没有打!!! 
        for(R ll i=pos + 1;i<=r;++i)
        {
            ll val = (s[i] - ma % k + k) % k;//同上 
            update(l-1,pos-1,val);//同上 
        }
    }
}

inline void query()
{
    for(R ll i=0;i<=n;++i)
    {    
        for(R ll j=0;j<up[i].size();++j)
            ++cun[up[i][j]];
        ans += cun[s[i]];
        for(R ll j=0;j<down[i].size();++j)
            --cun[down[i][j]];
    }
}

int main(){
    scanf("%lld%lld",&n,&k);
    for(R ll i=1;i<=n;++i)
    {
        scanf("%lld",&a[i]);
        s[i] = (s[i - 1] + a[i]) % k;
    }    
    find(1,n);
    query();
    printf("%lld",ans);
}

 还是跑过了。。。但是难受啊,一个早上啊!!!QAQ!!!

原文地址:https://www.cnblogs.com/kczno1fans/p/7715682.html