标签:
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
Sample Output
/* 先根据v进行从大到小排序,使得如果一旦高度达到,就只要判断前面的几个 离线对b根据day进行排序,每次更新index,处理完之后返回原来的序号 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAX = 100000 + 10; struct edge{ int h, v; }a[MAX]; struct edge1{ int d, h, id; }b[MAX]; bool cmp(edge i, edge j) { if(i.v == j.v) return i.h > j.h; return i.v > j.v; } bool cmp1(edge1 i, edge1 j) { return i.d < j.d; } bool cmp2(edge1 i, edge1 j) { return i.id < j.id; } int main() { int n, m; while(~scanf("%d%d", &n, &m)){ for(int i = 1; i <= n ;i++){ scanf("%d%d", &a[i].h, &a[i].v); } sort(a + 1, a + n + 1, cmp); for(int i = 1; i <= m ;i++){ scanf("%d", &b[i].d); b[i].id = i; } sort(b + 1, b + m + 1, cmp1); int max1 = 0, index = 0; for(int i = 1; i <= n ;i++){ if(a[i].h >= max1){ max1 = a[i].h; index = i; } } int day = index; for(int i = 1; i <= m ;i++){ for(int j = 1; j <= day; j++){ int temp = b[i].d * a[j].v + a[j].h ; if(temp >= max1){ index = j; max1 = temp; } } day = index; b[i].h = max1; } sort(b + 1, b + m + 1, cmp2); for(int i = 1; i <= m ;i++) printf("%d\n", b[i].h); } return 0; }
FZU2077——暴力技巧——The tallest tree
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4657367.html