2017国家集训队作业[arc082d]Sandglass
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\)的区间即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define of(i,l,r) for(int i=l;i>=r;i--)
#define fe(i,u) for(int i=head[u];i;i=e[i].next)
using namespace std;
typedef long long ll;
inline int rd()
{
static int x,f;
x=0,f=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
const int N=100010;
int X,K,Q,T[N],ty;
struct cha{
int a1,x1,a2,x2,x;
bool flag;
inline int get(int a)
{
if(flag)return x;
if(a<=a1)return x1;
if(a>=a2)return x2;
return a-a1+x1;
}
}c[N];
inline void gao(int i,int tim)
{
if(c[i].flag){
c[i].x+=ty*tim;
c[i].x=max(0,c[i].x);
c[i].x=min(c[i].x,X);
return;
}
if(ty==-1){
if(c[i].x2<=tim){
c[i].flag=1;c[i].x=0;
return;
}
if(tim>=c[i].x1){c[i].a1+=tim-c[i].x1;c[i].x1=0;c[i].x2-=tim;}
else{c[i].x1-=tim;c[i].x2-=tim;}
}
else{
if(c[i].x1+tim>=X){
c[i].flag=1;c[i].x=X;
return;
}
if(c[i].x2+tim>=X){c[i].a2-=c[i].x2+tim-X;c[i].x2=X;c[i].x1+=tim;}
else{c[i].x1+=tim;c[i].x2+=tim;}
}
}
int main()
{
freopen("inc.txt","r",stdin);
X=rd();K=rd();
c[0].a1=c[0].x1=0;c[0].a2=c[0].x2=X,c[0].x=0;
c[0].flag=0;ty=-1;
fo(i,1,K)T[i]=rd(),c[i]=c[i-1],gao(i,T[i]-T[i-1]),ty=-ty;
int j=0;
Q=rd();ty=-1;
fo(i,1,Q){
int t=rd(),a=rd();
while((j<K&&T[j+1]<=t))j++,ty=-ty;
int ans=c[j].get(a);
ans+=ty*(t-T[j]);
ans=min(ans,X);
ans=max(ans,0);
printf("%d\n",ans);
}
return 0;
}
UPD:2018/8/19 补上了代码
2017国家集训队作业[arc082d]Sandglass的更多相关文章
- 2017国家集训队作业Atcoder题目试做
2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...
- 2017国家集训队作业[agc016b]Color Hats
2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...
- 2017国家集训队作业[agc016e]Poor Turkey
2017国家集训队作业[agc016e]Poor Turkey 题意: 一开始有\(N\)只鸡是活着的,有\(M\)个时刻,每个时刻有两个数\(X_i,Y_i\),表示在第\(i\)个时刻在\(X_i ...
- 2017国家集训队作业[agc006f]Blackout
2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...
- 2017国家集训队作业[agc004f]Namori
2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...
- 2017国家集训队作业[arc076d/f][Exhausted?]
2017国家集训队作业[arc076d/f][Exhausted?] 题意: 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...
- 2017国家集训队作业[agc006e]Rotate 3x3
2017国家集训队作业[agc006e]Rotate 3x3 题意: 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...
- 2017国家集训队作业[agc014d]Black and White Tree
2017国家集训队作业[agc014d]Black and White Tree 题意: 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...
- 2017国家集训队作业[agc008f]Black Radius
2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: 给你一棵树,树上有若干个关键点.选中某 ...
随机推荐
- NodeJS学习笔记 进阶 (2)Nodejs进阶:MD5加密算法(ok)
个人总结:这篇文章讲解了Nodejs中自带模块的MD5加密算法的使用,读完这篇文章需要15分钟,其实还有一个叫utility的包在npm上,也非常好用. 摘选自网络 简介 MD5(Message-Di ...
- [笔记-图论]Floyd
用于可带负权的多源最短路 时间复杂度O(n^3) 注意一定不要给Floyd一个带负环的图,不然就没有什么意义了(最短路不存在) 模板 // Floyd // to get minumum distan ...
- C#版清晰易懂TCP通信原理解析(附demo)
[转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...
- 洛谷——P3374 【模板】树状数组 1
https://www.luogu.org/problem/show?pid=3374 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输 ...
- java设计模式学习 ----- 单例模式(Singleton)
单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...
- 免费WiFi初体验——个小白的WiFi旅程
说来羞愧,真正接触到WiFi还是在毕业后,此前自己封闭在一个人的世界,再加上外在学校的包围,我还成了个"山里"的孩子. 去年毕业了,也算是个90后,可自觉得心态过于成熟.了解外界太 ...
- POJ - 3846 Mountain Road 动归
POJ - 3846 Mountain Road 题意:n个人要过桥,有的人从左边来,有的人从右边来,给你他们到达桥一端的时间和过桥所需要的时间,要求相向而行的只能有一人,对于每一个点,不能在10s内 ...
- vue父子间通信案列三($emit和prop用法)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- OpenCV中数据转换
在OpenCV中Mat.CvMat和IplImage类型都可以代表和显示图像.IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplIm ...
- window安装MQTT服务器和client
http://activemq.apache.org/apollo/download.html 官方下载地址 MQTT目录: MQTT简单介绍 window安装MQTT服务器和client ja ...