zoukankan      html  css  js  c++  java
  • bjtu 1819 二哥求和(前缀和)

    题目

    1819. 二哥的求和 
     时间限制 1000 ms
    内存限制 128 MB  
    题目描述
    
     
    某一天,calfcamel问二哥,有道数学题怎么做呀?二哥看了一下说我不会呀,于是二哥找到了你,请你帮他解决这个问题,这样二哥就可以鄙视calfcamel数学菜了。 
     
    给你一个长度为n的数组a[i],有q个询问,对于每次询问[l,r],输出 
     
    ∑ i=l r a i (i−l+1) 
    ∑i=lrai(i−l+1)
     也就是输出[l,r]这段区间上,第一个数乘以一,第二个数乘以2,第三个数乘以3,……的和。 
    输入数据
    
    
     
    
    第一行为一个T,表示有T(T<= 5)组数据 
    
     
    
    对于每组数据: 
    
     
    
    第一行是一个n(n <= 100000) 
    
     
    
    第二行有n个数a[i] (0<=a[i] <=100000),下标从1开始,即a[1] – a[n] 
    
     
    
    第三行有一个q(q <=100000),表示询问的数目 
    
     
    
    接下来q行,每行有两个整数l,r 
    
    
    
    输出数据
    
    
     
    
    对于每一组数据,第一行输出”Case x: ” (冒号后有一空格) 
    
     
    
    接下来q行,每行输出询问的答案 
    
     
    
    文件最后使用换行符结束文件 
    
    
    
    样例输入
    
    � 复制 2
    3
    1 2 3
    1
    1 3
    5
    1 2 3 4 5
    3
    1 5
    2 4
    3 5
    
    
    样例输出
    
    � 复制 Case 1: 
    14
    Case 2: 
    55
    20
    26
    
    
    样例说明
    
    
     
    
    数据比较大,C/C++请使用scanf读入 ,使用cin可能会超时。 
    
     
    
    本题目最后答案超出int,C/C++请使用long long防止溢出 
    题目

    分析:先用一个sum[i]维护一个前i的和,再用一个ai[i]来维护a[i]*i的和,这样就可以快速求出l,r区间的和了(公式:ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1))

    #define debug
    #include<stdio.h>
    #include<math.h>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<string>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<functional>
    #include<iomanip>
    #include<map>
    #include<set>
    #define f first
    #define s second
    #define pb push_back
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef pair<ll,ll>PLL;
    typedef pair<int,ll>Pil;
    const ll INF = 0x3f3f3f3f;
    const double inf=1e8+100;
    const double eps=1e-8;
    const ll maxn =1e6+300;
    const int N = 1e4+10;
    const ll mod=1e9+7;
    //define
    ll a[maxn];
    ll ai[maxn];
    ll sum[maxn];
    //前缀和 a[i],a[i]*i
    void sum_add() {
    	int t,i;
    //	cin>>t;
    	scanf("%d",&t);
    	for(i=1; i<=t; i++) {
    		ll n;
    		scanf("%lld",&n);
    		//cout case
    		printf("Case %d: 
    ",i);
    		for(ll j=1; j<=n; j++) {
    			cin>>a[j];
    			sum[j]=sum[j-1]+a[j];
    			ai[j]=ai[j-1]+a[j]*j;
    			//	cout<<a[j]<<" "<<ai[j]<<endl;
    		}
    		//
    		ll q;
    		scanf("%lld",&q);
    		while(q--) {
    			ll l,r;
    			scanf("%lld %lld",&l,&r);
    			ll ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1);
    			printf("%lld
    ",ans);
    		}
    	}
    }
    //--solve
    void solve() {
    	int i,j,tt=1;
    	sum_add();
    }
    
    
    
    int main() {
    //	ios_base::sync_with_stdio(false);
    #ifdef debug
    	freopen("in.txt", "r", stdin);
    //	freopen("out.txt","w",stdout);
    #endif
    //	cin.tie(0);
    //	cout.tie(0);
    	solve();
    	/*
    		#ifdef debug
    			fclose(stdin);
    			fclose(stdout);
    			system("out.txt");
    		#endif
    	*/
    	return 0;
    }
    

      

  • 相关阅读:
    Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)
    Web API 2 入门——创建ASP.NET Web API的帮助页面(谷歌翻译)
    Web API 2 入门——使用Web API与ASP.NET Web窗体(谷歌翻译)
    Web API 2 入门——Web API 2中的操作结果(谷歌翻译)
    Web API 2 入门——Web API 2(C#)入门(谷歌翻译)
    WebBrowser 中遍历所有的frames
    浏览器js console对象
    Vi Command 【转载】
    JS调用BHO
    iframe空文档中写入内容
  • 原文地址:https://www.cnblogs.com/visualVK/p/8503856.html
Copyright © 2011-2022 走看看