Lotus and Horticulture

Lotus and Horticulture

Accepts: 91
Submissions: 641
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 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long LL;
  4 LL tree[150006*8];
  5 set<int>vec;
  6 set<int>::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     else
103     {
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能获得的研究价值最大。
posted @ 2017-01-22 22:31  sCjTyC  阅读(539)  评论(0编辑  收藏  举报