Problem 2136 取糖果
Accept: 175 Submit: 499
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。
Input
第一行一个整数T,表示有T组数据。
每组数据先输入一行一个整数N(1<=N<=100000),表示袋子数,接下来一行输入N个正整数,输入的第i个数表示第i个袋子所装的糖果数。
Output
每组数据输出n行,第i行表示lzs随机取连续的i个袋子时的最坏情况下能拿到的糖果数。
Sample Input
151 3 2 4 5
Sample Output
13345
超时一遍,,换了种离散化的方法过了。。
ac代码
646570 | 2015-12-07 16:10:15 | Accepted | 2136 | Visual C++ | 515 ms | 6064KB | 2215B | kxh1995 |
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 100050
using namespace std;
struct s
{
int lx,rx,mx;
}node[N<<2];
int a[N];
void build(int l,int r,int tr)
{
node[tr].lx=node[tr].rx=node[tr].mx=0;
if(l==r)
return;
int mid=(l+r)>>1;
build(l,mid,tr<<1);
build(mid+1,r,tr<<1|1);
}
/*int bseach(int val,int n)
{
int l=1;
int r=n;
while(l<=n)
{
int mid=(l+r)>>1;
if(b[mid]==val)
return mid;
if(b[mid]>val)
{
r=mid-1;
}
else
l=mid+1;
}
return l;
}*/
struct S
{
int val,id;
}b[N];
int cmp(S a,S b)
{
return a.val<b.val;
}
void pushup(int tr,int l,int r)
{
int m=(r-l)+1;
if(node[tr<<1].lx==(m-(m>>1)))
node[tr].lx=node[tr<<1].lx+node[tr<<1|1].lx;
else
node[tr].lx=node[tr<<1].lx;
if(node[tr<<1|1].rx==(m>>1))
node[tr].rx=node[tr<<1|1].rx+node[tr<<1].rx;
else
node[tr].rx=node[tr<<1|1].rx;
node[tr].mx=max(node[tr<<1].mx,node[tr<<1|1].mx);
node[tr].mx=max(node[tr].mx,node[tr<<1].rx+node[tr<<1|1].lx);
}
void update(int pos,int val,int l,int r,int tr)
{
if(l==r)
{
node[tr].mx=val;
node[tr].lx=val;
node[tr].rx=val;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(pos,val,l,mid,tr<<1);
else
update(pos,val,mid+1,r,tr<<1|1);
pushup(tr,l,r);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i].val=a[i];
b[i].id=i;
}
//sort(b+1,b+num+1);
//int n=unique(b+1,b+num+1)-(b+1);
sort(b+1,b+1+n,cmp);
build(1,n,1);
int j=1;
for(i=1;i<=n;i++)
{
while(node[1].mx<i)
{
//int x=bseach(a[j++],n);
update(b[j++].id,1,1,n,1);
}
printf("%d\n",b[j-1].val);
}
}
}