codeforces 797E Array Queries

来源:互联网 发布:淘宝拍摄 编辑:程序博客网 时间:2024/06/05 10:59

题目链接:http://codeforces.com/problemset/problem/797/E

题意:给定一个数组a[n],q次询问,给定p、k,每次使p = p + a[p] + k,回答p超过n时的次数。n, q 小于 100000,p、k小于n,a[i] 小于n。

题解:暴力显然过不了极端情况,考虑到在k较大时,暴力跑时次数会很少,则对k进行分类,大于MAXK时直接暴力,小于时记忆化即可。

代码:

#include <iostream>#include <algorithm>#include <cmath>#include <cstring>#include <cstdio>#include <cstdlib>#include <vector>#include <stack>#include <set>#include <queue>#include <functional>#include <map>#include <bitset>#define INF 0x7fffffff#define REP(i,j,k) for(int i = j;i <= k;i++)#define squr(x) (x) * (x)#define lowbit(x) (x&(-x))#define getint(x) scanf("%d", &(x))using namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1e5 + 10;const int MAXK = 200;int n, a[MAXN], q, p, k;int dp[MAXN][MAXK];int ans;int dfs(int x) {    if (x > n) {        return 0;    }    if (dp[x][k] != 0) {        return dp[x][k];    }    return dp[x][k] = 1 + dfs(x + a[x] + k);}int main(int argc, const char * argv[]) {    getint(n);    REP(i, 1, n) {        getint(a[i]);    }    getint(q);    REP(i, 1, q) {        ans = 0;        getint(p);        getint(k);        if (k >= MAXK) {            while (p <= n) {                p = p + k + a[p];                ans++;            }            printf("%d\n", ans);        } else {            printf("%d\n", dfs(p));        }    }    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买汽车票app 汽车票提前几天买 汽车票退票规定 汽车票怎么退 汽车票可以退票吗 订汽车票软件 12308汽车票查询 汽车票图片 汽车票订购 车票汽车票查询 大巴汽车票查询 订购汽车票 365汽车票 长途汽车票查询网 电话订票汽车票 网上汽车票预订 在线汽车票预订 河南汽车票网上订票 汽车票改签要手续费吗 苏州汽车票网上订票 汽车票可以提前几天买 网上买汽车票怎么买 买汽车票需要身份吗 网上买汽车票怎么取票 铁友网汽车票网上订票 汽车票网上订票查询 汽车网上购票 长途汽车订票 河南长途汽车网上订票 省汽车站网上订票 广州车票查询 郑州长途汽车网上订票 洗车票 客车时间表查询 省站汽车时刻表 全国汽车时刻表查询 长途汽车车次查询 车票查询汽车票价 汽车票价查询时刻表及票价 车票查询 汽车票价 汽车时刻表查