Lotus and Horticulture
Accepts: 91
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望。Lotus将所有的nnn株盆栽都放在新建的温室里,所以所有盆栽都处于完全相同的环境中。 每一株盆栽都有一个最佳生长温度区间[l,r][l,r][l,r],在这个范围的温度下生长会生长得最好,但是不一定会提供最佳的研究价值(Lotus认为研究发育不良的盆栽也是很有研究价值的)。 Lotus进行了若干次试验,发现若第iii株盆栽的生长温度适宜,可以提供aia_ia 思路:区间的左右端点、与区间左右端点距离0.50.50.5的点,这样就一定可以包括所有情况。 为了方便处理与区间左右端点距离0.50.50.5的点,只要将所有坐标扩大一倍,然后这些点就变成了“与区间左右端点距离111的点”了 考虑选出这些点后如何进行统计 i的研究价值;,然后线段树维护一下就可以了,也可用前缀,复杂度n×log(n);
1 #include2 using namespace std; 3 typedef long long LL; 4 LL tree[150006*8]; 5 set vec; 6 set ::iterator it; 7 typedef struct node 8 { 9 int a,b,c; 10 int l,r; 11 } ss; 12 ss mess[50005]; 13 int ak[50005*8]; 14 int ac[50005*8]; 15 int er(int l,int r,int k); 16 void in(int l,int r,int k,int nn,int mm,LL c); 17 void ff(int l,int r,int k); 18 int read_p,read_ca; 19 inline int read(){ 20 read_p=0;read_ca=getchar(); 21 while(read_ca<'0'||read_ca>'9') read_ca=getchar(); 22 while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); 23 return read_p; 24 } 25 int main(void) 26 { 27 int T; 28 scanf("%d",&T); 29 while(T--) 30 { 31 memset(tree,0,sizeof(tree)); 32 int n,cs = 0; 33 n = read(); 34 for(int i = 0; i < n; i++) 35 { 36 scanf("%d %d %d %d %d",&mess[i].l,&mess[i].r,&mess[i].a,&mess[i].b,&mess[i].c); 37 ak[cs++] = mess[i].l*2; 38 ak[cs++] = mess[i].r*2; 39 ak[cs++] = mess[i].r*2+1; 40 } 41 int cn = 1; 42 sort(ak,ak+cs); 43 ac[0] = ak[0]; 44 for(int i = 1; i < cs ; i++) 45 { 46 if(ak[i]!=ac[cn-1]) 47 { ac[cn] = ak[i]; 48 cn++; 49 } 50 } 51 for(int i = 0;i < n;i++) 52 { 53 mess[i].l = er(1,cn-1,mess[i].l*2); 54 mess[i].r = er(1,cn-1,mess[i].r*2); 55 } 56 for(int i = 0; i < n; i++) 57 { 58 in(0,mess[i].l-1,0,0,cn,mess[i].c); 59 in(mess[i].l,mess[i].r,0,0,cn,mess[i].a); 60 in(mess[i].r+1,cn-1,0,0,cn,mess[i].b); 61 } 62 ff(0,cn,0); 63 LL maxx = 0; 64 for(int i = 0; i < 150006*8; i++) 65 { 66 maxx = max(maxx,tree[i]); 67 68 } 69 printf("%lld\n",maxx); 70 } 71 return 0; 72 } 73 int er(int l,int r,int k) 74 { 75 int mid = (l+r)/2; 76 if(k == ac[mid]) 77 return mid; 78 else if(k < ac[mid]) 79 return er(l,mid-1,k); 80 else return er(mid+1,r,k); 81 } 82 void in(int l,int r,int k,int nn,int mm,LL c) 83 { 84 if(l > r)return ; 85 if(l > mm||r < nn) 86 return ; 87 else if(l <= nn&&r >= mm) 88 { 89 tree[k]+=c; 90 return ; 91 } 92 else 93 { 94 in(l,r,2*k+1,nn,(nn+mm)/2,c); 95 in(l,r,2*k+2,(nn+mm)/2+1,mm,c); 96 } 97 } 98 void ff(int l,int r,int k) 99 {100 if(l == r)101 return ;102 else103 {104 tree[2*k+1] += tree[k];105 tree[2*k+2] += tree[k];106 tree[k] = 0;107 ff(l,(l+r)/2,2*k+1);108 ff((l+r)/2+1,r,2*k+2);109 }110 }
aaa、bbb、ccc的值。你需要根据这些信息,给温室选定一个温度(这个温度可以是任意实数),使得Lotus能获得的研究价值最大。