DSL_3_C : The Number of Windows




尺取虫法で十分です。
分かりやすさ優先で実装したので速度は出ていません。

#include <iostream>
#include <vector>
using namespace std;

long long int n,q,as[100002]={0};

long long int f(long long int x){
   long long int r=1;
   long long int ans=0;
   for(long long int i=0;i<n;i++){
           if(r<=i){
               r=i+1;
           }
           while(r<=n){
               long long int d=as[(int)r]-as[(int)i];
               if(d>x){
                   r--;
                   break;
               }
               r++;
           }
           if(n<r)r=n;
           ans+=(r-i);
           //cout<<"("<<i<<" "<<r<<" "<<ans<<")";
   }
   return ans;
}

int main() {
   // your code goes here
   cin>>n>>q;
   long long int sum=0;
   for(int i=1;i<=n;i++){
       long long int a;
       cin>>a;
       sum+=a;
       as[i]=sum;
   }
   for(int i=0;i<q;i++){
       long long int x;
       std::cin>>x;
       cout<<f(x)<<"\n";
   }
    
   return 0;
}
最終更新:2016年11月05日 18:41