又联考了一场,感觉自己好菜啊,T1没写出来,后来花了一个早上调试。QAQ。最后发现是个-1还有取模没打。。。TAT。。。难受极了!!!
简单的区间(interval)
题目描述:
样例输入:
样例1: 4 3 1 2 3 4 样例2: 4 2 4 4 7 4
样例输出:
样例1: 3 样例2: 6
提示:
时间限制: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!!!