昨天比赛时浩神写的这道题,当时我想了想,大致有了个思路,只是感觉绝对会超时,所以一直没写。没想到这道题数据弱了,浩神给过了。今天来了后试着写了一下,没想到,这一写就写了快一天。。。。。悲剧。。。已经有了思路,还是tle了几次,,题目:
Problem 2077 The tallest tree
Accept: 41 Submit: 176
Time Limit: 1000 mSec Memory Limit : 65536 KB
Problem Description
lzs种了n棵树,每棵树每天长高一定的高度。某一天,lzs想知道树长得怎么样了,你能求出那一天最高的树有多高吗?
Input
有多组测试数据,每组数据第一行输入两个整数n,m(1<=n,m<=100000),接下来n行,每行两个整数a,b(0<=a,b<=100000),表示第i棵树在第0天的高度以及每天生长的高度。接下来m行,每行一个整数x(0<=x<=100000),表示询问第x天最高的树有多高。
Output
对于每个询问输出一行,为当天最高的树的高度。
Sample Input
1 310 4123
Sample Output
141822
#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;
}