奇异旅馆

Time Limit : 3000/1000ms (Java/Other)   MemoryLimit : 65535/32768K (Java/Other)

Total Submission(s) : 29   Accepted Submission(s) :15

Problem Description

玩了一天,小A又带着他的小伙伴们来到了当地的奇异旅馆。

这个旅馆共有n层,每层分别有ai个床位。由于没有电梯,大家都希望尽可能住在较低的楼层。

现在小A提出了q个操作,操作分为两种:

1.从第xi层开始向上安置numi个小伙伴住宿。
2.询问前ki层一共已经安置的小伙伴数目。

假设一开始每层楼的床位都是未被使用的,且若操作1中xi层及以上的房间无法容纳所要安置的人,则尽可能多地安置,剩余部分忽略。

Input

输入数据的第一行是一个整数T,表示测试实例的个数,保证T<=30。
对于每组测试样例,第一行给出n和q。(1<=n<=105,1<=q<=105)
接下来一行共有n个整数ai。(1<=ai<=109)
接下来共有q行,每行表示一个操作。
第一种操作的给出形式为:1 xinumi。(1<=xi<=n,1<=numi<=109)
第二种操作的给出形式为:2 ki。(1<=ki<=n)
题目保证n>=50000且q>=50000的数据组数不超过5组。

Output

每组样例中,对于第一种操作,若xi层及以上的房间无法容纳所要安置的人,输出“overflow”.
对于第二种操作,输出所询问的值。
每个输出数据占一行,且每组数据后输出一个空行。

Sample Input

1

3 5

2 3 5

1 1 4

2 2

1 2 3

2 2

1 3 10

Sample Output

4

5

overflow

【题意】

略。

【思路】

显然对于这么大数据范围,暴力不可行。我们考虑优化的方法。

首先,对于第一种操作,我们肯定是从低往高依次安排,但到后面一定存在一种情况,开始的一段都已经住满,没必要遍历了。于是我们考虑用并查集,将相邻的住满的楼层“连接起来”,然后每次进行操作时,我们便可以快速找到第一个空的楼层。

对于第二种操作,我们用树状数组维护前缀和即可。

具体细节见代码。

#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)typedef long long ll;
const int maxn = 100005;
const ll mod = 1e9+7;
const ll INF = 0x3f3f3f3f;
const double eps = 1e-9;int a[maxn];
int now[maxn];
int pre[maxn];
ll tree[maxn];int lowbit(int x)
{return x&(-x);
}void add(int pos,ll val)
{while(pos<maxn){tree[pos]+=val;pos+=lowbit(pos);}
}ll query(int pos)
{ll ans=0;while(pos>0){ans+=tree[pos];pos-=lowbit(pos);}return ans;
}int dfs(int x)
{int t,r=x;while(pre[x]!=x){x=pre[x];}while(r!=x){t=pre[r];pre[r]=x;r=t;}return x;
}void join(int a,int b)
{int A=dfs(a);int B=dfs(b);if(A>B){pre[B]=A;}else pre[A]=B;
}int main()
{/*freopen("c://ccpc//problem 1002 data.txt","r",stdin);freopen("c://ccpc//problem 1002 results.txt","w",stdout);*/int n,q;int op,pos,w;rush(){scanf("%d%d",&n,&q);mst(now,0);mst(tree,0);for(int i=1; i<=n; i++){scanf("%d",&a[i]);pre[i]=i;}pre[n+1]=n+1;for(int i=0; i<q; i++){scanf("%d",&op);if(op==1){scanf("%d%d",&pos,&w);while(w>0){pos=dfs(pos);if(pos==n+1){puts("overflow");break;}if(a[pos]-now[pos]>w){now[pos]+=w;add(pos,w);w=0;}else{w-=(a[pos]-now[pos]);add(pos,a[pos]-now[pos]);now[pos]=a[pos];join(pos,pos+1);}}}else if(op==2){scanf("%d",&pos);ll ans=query(pos);printf("%I64d\n",ans);/*for(int j=1;j<=n;j++){printf("%d %I64d\n",j,query(j));}*/}}puts("");}return 0;
}

2017年河北省大学生程序设计竞赛 奇异旅馆 【并查集+树状数组】相关推荐

  1. 秦皇岛计算机编程大赛,关于举办第三届河北省大学生程序设计竞赛燕山大学选拔赛的通知...

    为提高我校本科生程序设计能力.选拔优秀学生组队参加"第三届河北省大学生程序设计竞赛(HCPC2019)",学校决定组织"第三届河北省大学生程序设计竞赛选拔赛", ...

  2. 2019河北省大学生程序设计竞赛(部分题解)

    2019河北省大学生程序设计竞赛 B.Icebound and Sequence B题题解 G.点我 签到题 H.天神的密码 签到题 #include <iostream> #includ ...

  3. 2019河北省大学生程序设计竞赛题解(一)

    2019河北省大学生程序设计竞赛题解(一) B Icebound and Sequence G 点我 H 天神的密码 K 河北美食 L smart robot 下面是一些这次比赛的较简单题目的题解 题 ...

  4. 2019河北省大学生程序设计竞赛部分题题解

    2019河北省大学生程序设计竞赛 文章目录 A. Battle of Balls B. Icebound and Sequence C. 分治 E. Paper Plane Fly Away F. T ...

  5. 2019河北省大学生程序设计竞赛(重现赛)

    B: 链接:https://ac.nowcoder.com/acm/contest/903/B 来源:牛客网 题目描述 Icebound hates math. But Imp loves math. ...

  6. acm竞赛php,我校代表队参加 2017 ACM国际大学生程序设计竞赛

    2017年12月17日,第42届ACM国际大学生程序设计竞赛亚洲东大陆决赛(EC-Final)在上海大学落下帷幕,ACM竞赛2017年亚洲区比赛告一段落.在学校教务处的大力支持和信息学院的精心指导下, ...

  7. 2017第一届河北省大学生程序设计竞赛题解

    超级密码 小明今年9岁了,最近迷上了设计密码!今天,他又设计了一套他认为很复杂的密码,并且称之为"超级密码". 说实话,这套所谓的"超级密码"其实并不难:对于一 ...

  8. 2017hbcpc(第一届河北省大学生程序设计竞赛)

    题目链接:http://newoj.acmclub.cn/contests/1484 还是太菜,好多题目还是不会. 文章目录 1841.超级密码 1842.斗地主 1843.考研 1844.自动签到机 ...

  9. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

最新文章

  1. B样条曲线 及 B样条曲面
  2. 如何快速分析一款ios软件或需求的大流程,然后在业务层实现,不牵扯到界面?...
  3. PHP+Mysql实现协同办公OA系统源码演示下载
  4. 第二篇 python基础知识总结:数据、运算符
  5. html表单中阴影,html5中input表单加边框,阴影效果.doc
  6. 基于CSS3实现垂直轮播效果
  7. 06-netty之http之文件服务器
  8. [转]Memcache mutex设计模式
  9. python主线程执行_python主线程与子线程的结束顺序实例解析
  10. ubuntu16服务器vnc无显示器,Ubuntu 18.04 解决无显示器无法vnc远程连接的问题 虚拟显示器 dummy video...
  11. 步进电机正反转实验_三相异步电机正反转控制原理图
  12. MATLAB2018a解压文件损坏,文件解压失败与压缩文件文件已经损坏的解决办法
  13. 去追寻,趁我们还年轻。
  14. 【案例20】NC系统was部署后无法登录
  15. 程序的连接之符号和符号表
  16. 微博立场检测 60分Baseline
  17. android键盘还是讯飞输入,讯飞输入法BiuBiu键盘又添神仙操作 分类自定义排序来了...
  18. 算法高级(42)-大数定律-澳门皇家菠菜,为什么你逢赌必输?
  19. 知网CAJ转为PDF下载
  20. 用AI从零开始创建一个宫崎骏的世界

热门文章

  1. 仿微信列表显示时间(年月日、昨天、时间)
  2. 阿里巴巴是怎么成为“税王”的?
  3. 国外Essay写作能力怎么正确提升?
  4. NVIDIA GeForce RTX 2060 配置keras + tensorflow-gpu机器学习环境
  5. 亿级流量架构演进实战 | 架构演进重构消息PUSH系统 05
  6. 场效应管理解笔记(N沟道结型场效应管)
  7. 利用WinRAR打包免安装绿色C#程序
  8. 在Android中实现OPUS编码
  9. QT widget实现手机界面滑屏效果,支持鼠标滑动,触摸屏上滑动
  10. python大作业——扫雷游戏