昨天比赛时浩神写的这道题,当时我想了想,大致有了个思路,只是感觉绝对会超时,所以一直没写。没想到这道题数据弱了,浩神给过了。今天来了后试着写了一下,没想到,这一写就写了快一天。。。。。悲剧。。。已经有了思路,还是tle了几次,,题目:
有多组测试数据,每组数据第一行输入两个整数n,m(1<=n,m<=100000),接下来n行,每行两个整数a,b(0<=a,b<=100000),表示第i棵树在第0天的高度以及每天生长的高度。接下来m行,每行一个整数x(0<=x<=100000),表示询问第x天最高的树有多高。
#include <iostream> #include <string.h> #include <algorithm> #include <cstdio> using namespace std; const int N=100005; struct tree{ int jishu,xielv; }tt[N]; int day[N],newday[N]; tree newtree[N]; long long ans[N]; bool cmp(tree a,tree b){ if(a.jishu==b.jishu) return a.xielv>b.xielv; return (a.jishu>b.jishu&&a.xielv>b.xielv); } int main(){ //freopen("11.txt","r",stdin); int n,t; while(~scanf("%d%d",&n,&t)){ for(int i=0;i<n;++i) scanf("%d%d",&tt[i].jishu,&tt[i].xielv); sort(tt,tt+n,cmp); for(int i=0;i<t;++i) {scanf("%d",&day[i]);newday[i]=day[i];} sort(newday,newday+t); int m=n; long long maxvalue=tt[0].jishu,maxxielv=tt[0].xielv; for(int i=0;i<t;++i){ int x=newday[i],newpos=0,k=1; for(int j=0;j<m;++j){ if(!(maxvalue>tt[j].jishu&&maxxielv>tt[j].xielv)) {newtree[newpos].jishu=tt[j].jishu;newtree[newpos++].xielv=tt[j].xielv;} } for(int i=0;i<newpos;++i){ tt[i]=newtree[i]; } m=newpos; for(int j=0;j<newpos;++j){ if(newtree[j].jishu+x*newtree[j].xielv>maxvalue){ maxvalue=newtree[j].jishu+x*newtree[j].xielv; maxxielv=newtree[j].xielv; } } ans[x]=maxvalue; } for(int i=0;i<t;++i) printf("%lld\n",ans[day[i]]); } return 0; }