热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JZOJ4866:禅意与园林美学探讨-树状数组应用

本题涉及一个长度为n的序列{ai},代表一系列树木的美学价值。任务是处理m个查询,每个查询提供三个参数l、r和P,目标是在所有满足l
### 题目解析 有一组长度为n的整数序列{ai},表示一系列树木的美学评分。面对m次查询,每次查询提供三个整数l、r和P,需要计算并返回所有满足l #include #include #include #include #include #define LL long long #define LD double #define max(a,b) ((a>b)?a:b) #define min(a,b) ((a>b)?b:a) #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const inf=2147483647; int const maxn=5*1e4, maxp=100; int n, m, a[maxn+10], t[maxp+10]; void update(int pos) { int p = pos; while(p <= maxp) { t[p] = max(t[p], pos); p += p & (-p); } } int query(int p) { int ans = 0; while(p > 0) { ans = max(ans, t[p]); p -= p & (-p); } return ans; } int main() { //freopen("psy.in", "r", stdin); //freopen("psy.out", "w", stdout); freopen("garden.in", "r", stdin); freopen("garden.out", "w", stdout); scanf("%d%d", &n, &m); fo(i, 1, n) scanf("%d", &a[i]); fo(i, 1, m) { int l, r, p; scanf("%d%d%d", &l, &r, &p); if (r - l + 2 > p) printf("0\n"); else { fo(j, 0, p) t[j] = 0; int sum = 0, ans = inf; update(1); fo(j, l, r) { sum = (sum + a[j]) % p; if (query(sum + 1)) ans = min(ans, sum + 1 - query(sum + 1)); update(sum + 1); } printf("%d\n", ans); } } return 0; } ``` 此代码首先读取输入数据,包括树木的数量n、查询次数m以及每个树木的美学值。对于每个查询,如果区间长度大于模数P,则直接输出0;否则,使用树状数组来动态更新和查询最小子序列和模P后的最小值。
推荐阅读
author-avatar
ruishao520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有