codeforces 797E Array Queries
2017-05-01 23:10
239 查看
E. Array Queries
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
a is an array of n positive
integers, all of which are not greater than n.
You have to process q queries to this array. Each query is represented by two numbers p and k.
Several operations are performed in each query; each operation changes p to p + ap + k.
There operations are applied until p becomes greater than n.
The answer to the query is the number of performed operations.
Input
The first line contains one integer n (1 ≤ n ≤ 100000).
The second line contains n integers — elements of a (1 ≤ ai ≤ n for
each i from 1 to n).
The third line containts one integer q (1 ≤ q ≤ 100000).
Then q lines follow. Each line contains the values of p and k for
corresponding query (1 ≤ p, k ≤ n).
Output
Print q integers, ith
integer must be equal to the answer to ith query.
Example
input
output
Note
Consider first example:
In first query after first operation p = 3, after second operation p = 5.
In next two queries p is greater than n after
the first operation.
题目分析:
直接按照题目描述去做肯定会超时,需要用到dp来优化速度;
d[p][k] 表示 p, k需要的次数 状态转移如下:
d[p][k] = d[p+a[p]+k][k] + 1;
所有的k值保存不下, 这里我保存k值小于200的dp值, d[p][k] (k < 200), 当k大于200时直接模拟;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = (int)1e5+5;
int n, q, k, p;
int d[maxn][205], a[maxn];
int solve(int p, int k){
if(p > n) return 0;
else if(k < 200){
if(d[p][k] != -1) return d[p][k];
else {
d[p][k] = solve(p+a[p]+k, k)+1;
return d[p][k];
}
} else {
return solve(p+a[p]+k, k)+1;
}
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
scanf("%d", &q);
int ans = 0;
memset(d, -1, sizeof(d));
for(int i = 0; i < q; ++i){
scanf("%d%d", &p, &k);
ans = solve(p, k);
printf("%d\n", ans);
}
}
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
a is an array of n positive
integers, all of which are not greater than n.
You have to process q queries to this array. Each query is represented by two numbers p and k.
Several operations are performed in each query; each operation changes p to p + ap + k.
There operations are applied until p becomes greater than n.
The answer to the query is the number of performed operations.
Input
The first line contains one integer n (1 ≤ n ≤ 100000).
The second line contains n integers — elements of a (1 ≤ ai ≤ n for
each i from 1 to n).
The third line containts one integer q (1 ≤ q ≤ 100000).
Then q lines follow. Each line contains the values of p and k for
corresponding query (1 ≤ p, k ≤ n).
Output
Print q integers, ith
integer must be equal to the answer to ith query.
Example
input
3 1 1 1 3 1 1 2 1 3 1
output
2 1 1
Note
Consider first example:
In first query after first operation p = 3, after second operation p = 5.
In next two queries p is greater than n after
the first operation.
题目分析:
直接按照题目描述去做肯定会超时,需要用到dp来优化速度;
d[p][k] 表示 p, k需要的次数 状态转移如下:
d[p][k] = d[p+a[p]+k][k] + 1;
所有的k值保存不下, 这里我保存k值小于200的dp值, d[p][k] (k < 200), 当k大于200时直接模拟;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = (int)1e5+5;
int n, q, k, p;
int d[maxn][205], a[maxn];
int solve(int p, int k){
if(p > n) return 0;
else if(k < 200){
if(d[p][k] != -1) return d[p][k];
else {
d[p][k] = solve(p+a[p]+k, k)+1;
return d[p][k];
}
} else {
return solve(p+a[p]+k, k)+1;
}
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
scanf("%d", &q);
int ans = 0;
memset(d, -1, sizeof(d));
for(int i = 0; i < q; ++i){
scanf("%d%d", &p, &k);
ans = solve(p, k);
printf("%d\n", ans);
}
}
相关文章推荐
- 第二十三次codeforces竞技结束 #279 Div 2
- codeforces 588 A Duff and Meat
- Codeforces 702A Maximum Increase(dp)
- 【Codeforces Round395】 Codeforces 764D Timofey and rectangles
- CodeForces 832 B. Petya and Exam
- CodeForces 840 A.Leha and Function(水~)
- Codeforces 2A. Winner
- CodeForces 158B Taxi
- CodeForces 698 C. LRU(状压DP)
- codeforces 570D Tree Requests
- 解题报告:CodeForces - 662C:Binary Table FWT(快速沃尔什变换)
- CodeForces - 910C Minimum Sum(贪心)
- codeforces 219a k重复字符串。
- 【CodeForces 621C】Wet Shark and Flowers
- codeforces 518B
- Codeforces 246C Little Girl And Maximum 差分
- CodeForces - 698B Fix a Tree(并查集+乱搞)
- codeforces 722E Research Rover
- CodeForces 493D Vasya and Chess
- Codeforces 622A Infinite Sequence 【数学】