2017国家集训队作业[arc082d]Sandglass
题意:
有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间。给出\(K\)个时间点\(r_1\sim r_K\)表示在这几个时间点,漏斗会上下翻转,无视翻转时间。给出\(Q\)个询问,每个询问两个数\(t_i,a_i\),表示若初始时\(A\)瓶有\(a_i\)克沙子,询问第\(t_i\)单位时间时,\(A\)瓶中会有多少克沙子?(\(X,t_i,r_i\leq 10^9,a_i\leq X,K\leq 10^5\),输入保证序列\(\{r_i\}\)和\(\{t_i\}\)为升序)
题解:
最后半小时想出来,真的惨。
观察发现\(A\)瓶中的沙子函数图像由若干个斜率为\(1,-1,0\)的一次函数组成。若存在某一时刻,该函数的斜率为\(0\)(即碰到上下边界),那么在此以后,函数的图像与截距(\(a_i\))无关。
初始截距(\(a_i\))的取值会使该函数出现三种情况:
\(1.\)只会碰到上边界
\(2.\)只会碰到下边界
\(3.\)上下边界都不会碰到
还存在一种情况:无论\(a_i\)的值是什么,该函数总会碰到上或下边界。
分别维护\(a\)的区间即可。
代码有时间再补。