代码改变世界

FOJ 2077 有奖月赛题

2012-03-26 16:54  javaspring  阅读(229)  评论(0编辑  收藏  举报

      昨天比赛时浩神写的这道题,当时我想了想,大致有了个思路,只是感觉绝对会超时,所以一直没写。没想到这道题数据弱了,浩神给过了。今天来了后试着写了一下,没想到,这一写就写了快一天。。。。。悲剧。。。已经有了思路,还是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
ac代码:

#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;
}