Codeforces Round #271 (Div. 2)--B.Worms

B. Worms
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

It is lunch time for Mole. His friend, Marmot, prepared him a nice game for lunch.

Marmot brought Mole n ordered piles of worms such that i-th pile contains ai worms. He labeled all these worms with consecutive integers: worms in first pile are labeled with numbers 1 to a1, worms in second pile are labeled with numbers a1 + 1 to a1 + a2 and so on. See the example for a better understanding.

Mole can't eat all the worms (Marmot brought a lot) and, as we all know, Mole is blind, so Marmot tells him the labels of the best juicy worms. Marmot will only give Mole a worm if Mole says correctly in which pile this worm is contained.

Poor Mole asks for your help. For all juicy worms said by Marmot, tell Mole the correct answers.

Input

The first line contains a single integer n (1 ≤ n ≤ 105), the number of piles.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 103a1 + a2 + ... + an ≤ 106), where ai is the number of worms in the i-th pile.

The third line contains single integer m (1 ≤ m ≤ 105), the number of juicy worms said by Marmot.

The fourth line contains m integers q1, q2, ..., qm (1 ≤ qi ≤ a1 + a2 + ... + an), the labels of the juicy worms.

Output

Print m lines to the standard output. The i-th line should contain an integer, representing the number of the pile where the worm labeled with the number qi is.

Sample test(s)
input
5
2 7 3 4 9
3
1 25 11
output
1
5
3
Note

For the sample input:

  • The worms with labels from [12] are in the first pile.
  • The worms with labels from [39] are in the second pile.
  • The worms with labels from [1012] are in the third pile.
  • The worms with labels from [1316] are in the fourth pile.
  • The worms with labels from [1725] are in the fifth pile.

题意:n个数,每个数表示区间的长度,比如2表示区间【1,2】为第一段, 7表示区间【3,9】为第二段,后面n-2个数以此类推。

            m次访问,比如,1, 25, 11的意思是,问1是第几段的,25是第几段的,11是第几段的。

代码:

#include<stdio.h>
#include<string.h>
int s[1000010];
int main()
{
	int n, m, t, k=1, pos=1;
	scanf("%d", &n);
	for(int i=0; i<n; i++)
	{
		scanf("%d", &t);

		for(int j=pos; j<t+pos; j++)
			s[j] = k;
		pos = t + pos;
		k++;
	}
	scanf("%d", &m);
	for(int i=0; i<m ;i++)
	{
		scanf("%d", &t);
		printf("%d\n", s[t]);
	}
	return 0;
}

这里需要开全局变量,局部变量会造成栈溢出。

补充知识:

      在C++中,内存分成4个区,他们分别是堆,栈,静态存储区和常量存储区
  1)栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存
    储区.里面的变量通常是局部变量,函数参数等.
  2)堆,又叫自由存储区,它是在程序执行的过程中动态分配的,它最大的特性就是动.
    态性.由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,
    一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,
    操作系统会自动回收.如果分配了堆对象,却忘记了释放,就会产生内存泄漏.而
    如果已释放了对象,却没有将相应的指针置为NULL,该指针就是"悬挂指针".
  4)静态存储区.所有的静态对象,全局对象都于静态存储区分配.
  5)常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
    (当然,你要通过非正当手段也可以修改,而且方法很多)
    常量字符串都存放在静态存储区,返回的是常量字符串的首地址.

堆栈溢出攻防 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值