首页 > 代码库 > HDU5032 Always Cook Mushroom(树状数组&&离线)
HDU5032 Always Cook Mushroom(树状数组&&离线)
树状数组+询问离线。一个优化是需要的,就是先对1000*1000个点先排序,而不是每次都生成这1000*1000个点然后和询问一起排序,那样会tle.
#include <iostream>#include <cstring>#include <string>#include <vector>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;#define maxn 1200#define ll long longll A,B;struct Node{ ll a,b; int t; ll v; int id; bool operator < (const Node& y) const{ if(b*y.a!=a*y.b) return b*y.a<a*y.b; else return t<y.t; }}x[120000],y[1005000];int tot,tot2;ll ans[200000];ll bit[maxn];void add(int i,ll v){ while(i<=1000){ bit[i]+=v; i+=i&(-i); }}ll sum(int i){ ll ret=0; while(i>0){ ret+=bit[i]; i-=i&(-i); } return ret;}int main(){ int T;cin>>T;int ca=0; tot2=0; for(int i=1;i<=1000;++i){ for(int j=1;j<=1000;++j){ y[tot2].a=i;y[tot2].b=j; y[tot2++].t=1; } } sort(y,y+tot2); while(T--){ scanf("%I64d%I64d",&A,&B); tot=0; int m;scanf("%d",&m); int ai,bi,xi; for(int i=0;i<m;++i){ scanf("%d%d%d",&ai,&bi,&xi); x[tot].a=ai; x[tot].b=bi; x[tot].id=i; x[tot].t=2; x[tot++].v=xi; } sort(x,x+tot); memset(bit,0,sizeof(bit)); int id=0; for(int i=0;i<tot;++i){ while(id<tot2&&y[id]<x[i]){ add(y[id].a,(y[id].a+A)*(y[id].b+B)); ++id; } ans[x[i].id]=sum(x[i].v); } printf("Case #%d:\n",++ca); for(int i=0;i<m;++i){ printf("%I64d\n",ans[i]); } } return 0;}
HDU5032 Always Cook Mushroom(树状数组&&离线)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。