CF939F Cutlet

传送门


思路

先设 fi,j 表示到第 i 秒时,正在煎某一面,另一面煎了 j 分钟

我们就有转移:

fi,j=fi1,j

(不翻面的情况)

fi,j=fi1,ij+1

(翻面,而且在区间内)

这是 O(n2) 的,不能过


我们发现,显然一个区间内最多翻转两次,因为三次或以上可以合并成一或两次更优

我们考虑整个区间进行转移,fi,ji 表示区间,j 不变

因此有转移:

不翻转:

fi,j=fi1,j

翻转一次,翻转ri 煎了 k 秒:

fi,j=min{fi1,rjk}+1

翻转两次,两次之间煎了 k 秒:

fi,j=min{fi1,jk}+2

但这仍是 n2m

看到 min,可以想到用单调队列进行转移

翻转一次的转移,弹出条件为 k>rl,即 p<lj

翻转两次的转移,弹出条件为 k>rl,即 p<j+lr

(这里的 p 即为转移点,注意翻转一次要用倒序)


代码

#include<iostream> #include<fstream> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<queue> #include<map> #include<set> #include<bitset> #define LL long long #define FOR(i, x, y) for(int i = (x); i <= (y); i++) #define ROF(i, x, y) for(int i = (x); i >= (y); i--) #define PFOR(i, x) for(int i = he[x]; i; i = r[i].nxt) inline int reads() { int sign = 1, re = 0; char c = getchar(); while(c < '0' || c > '9'){if(c == '-') sign = -1; c = getchar();} while('0' <= c && c <= '9'){re = re * 10 + (c - '0'); c = getchar();} return sign * re; } #define inf 1061109567 int n, m, l, r, i, f[2][200005]; std::deque<int> q; signed main() { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); freopen("test.out", "w", stdout); #endif n = reads(), m = reads(); memset(f[0] + 1, 63, sizeof(int) * (n << 1)); while(m--) { l = reads(), r = reads(), i = i ^ 1, q.clear(); memcpy(f[i], f[i ^ 1], sizeof(int) * ((n << 1) + 1)); ROF(j, r, 0) { while(!q.empty() && f[i ^ 1][r - j] <= f[i ^ 1][q.back()]) q.pop_back(); while(!q.empty() && q.front() < l - j) q.pop_front(); q.push_back(r - j); f[i][j] = std::min(f[i][j], f[i ^ 1][q.front()] + 1); } q.clear(); FOR(j, 0, r) { while(!q.empty() && f[i ^ 1][j] <= f[i ^ 1][q.back()]) q.pop_back(); while(!q.empty() && q.front() < j - r + l) q.pop_front(); q.push_back(j); f[i][j] = std::min(f[i][j], f[i ^ 1][q.front()] + 2); } } if(f[i][n] ^ inf) printf("Full\n%d", f[i][n]); else puts("Hungry"); return 0; }

__EOF__

本文作者zuytong
本文链接https://www.cnblogs.com/zuytong/p/16586480.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zuytong  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示