icpc:problems:usaco21jan_no_time_to_paint_s
problems | |
---|---|
名称 | No Time to Paint S |
题目编号 | USACO21JAN_S2 |
题目链接 | luogu.com.cn/… |
来源 | USACO |
算法分类 | 前缀和, 思维 |
难易程度 | 容易 |
No Time to Paint S
想法
由于低色彩不能覆盖高色彩,故当出现低色彩时,前面涂过的高色彩是无法延续到该位置后续的,故后续的高色彩需要重新涂。维护一个色彩序列,存储色彩是否可以涂抹到该位置,当可以涂抹时,就不增加画笔个数,当不可以涂抹时,增加画笔个数且比当前颜色高的色彩均失效。
代码实现
#include<iostream> #include<cstring> using namespace std; const int N = 1e5+10; char line[N]; int f[N], e[N]; bool vis[30]; int main() { int n, q; scanf("%d %d", &n, &q); scanf("%s", line); f[0] = 1; memset(vis, false, sizeof(vis)); vis[line[0] - 'A'] = true; for(int i=1; i<n; i++) { if(line[i] > line[i-1]) f[i] = f[i-1] + 1; else { if(vis[line[i]-'A']) f[i] = f[i-1]; else f[i] = f[i-1] + 1; for(int j=26; j>line[i]-'A'; j--) vis[j] = false; } vis[line[i]-'A'] = true; } e[n-1] = 1; memset(vis, false, sizeof(vis)); vis[line[n-1]-'A'] = true; for(int i=n-2; i>=0; i--) { if(line[i] > line[i+1]) e[i] = e[i+1] + 1; else { if(vis[line[i]-'A']) e[i] = e[i+1]; else e[i] = e[i+1] + 1; for(int j=26; j>line[i]-'A'; j--) vis[j] = false; } vis[line[i]-'A'] = true; } while(q--) { int x, y; scanf("%d %d", &x, &y); x--; y--; cout << (x-1 < 0 ? 0 : f[x-1]) + e[y+1] << '\n'; } return 0; }
/app/www/public/data/pages/icpc/problems/usaco21jan_no_time_to_paint_s.txt · 最后更改: 2023/06/03 12:32 由 温婕莺