首页 > 代码库 > 【BZOJ2957】楼房重建 分块水题
【BZOJ2957】楼房重建 分块水题
#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43406043"); }
题解:
分块水题。
不懂看代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define P 2050 #define eps 1e-10 #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m; double h[N]; int belong[N],size,blocks; struct Block { double stk[P]; int top,begin,end; void keep(double now=0.0) { top=0; for(int i=begin;i<=end;i++) if(h[i]>now)stk[++top]=now=h[i]; } int ask(double now=0.0) { int pos=(upper_bound(stk+1,stk+top+1,now+eps)-stk); return top-pos+1; } }block[P]; inline int ask(double now=0.0) { int ans=0,i; for(i=1;i<=blocks;i++) { ans+=block[i].ask(now); now=max(now,block[i].stk[block[i].top]); } return ans; } int main() { int i,a,b; scanf("%d%d",&n,&m); size=sqrt(n); for(i=1;i<=n;i++) { belong[i]=(i-1)/size+1; if(!block[belong[i]].begin)block[belong[i]].begin=i; block[belong[i]].end=i; } blocks=belong[n]; while(m--) { scanf("%d%d",&a,&b); h[a]=(double)b/a; block[belong[a]].keep(); printf("%d\n",ask()); } return 0; }
【BZOJ2957】楼房重建 分块水题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。