zoj 3632 Watermelon Full of Water

2014-11-24 11:16:18 · 作者: · 浏览: 0

1

dp+线段树,包含懒操作

view sourceprint 01 #include

02 #include

03 #include

04 #include

05 #include

06 #include

07 #include

08 using namespace std;

09 #define N 50003

10 #define INF 1LL*INT_MAX*INT_MAX

11 #define lson rt<<1

12 #define rson rt<<1|1

13

14 struct node

15 {

16 int l,r,lazy;

17 long long num;

18 }st[4*N];

19 long long dp[N],p[N],t[N],lazy[4*N];

20 int n;

21

22 /*void pushup(int rt)

23 {

24 if (st[lson].num==st[rson].num) st[rt].num=st[lson].num;

25 }*/

26 void pushdown(int rt)

27 {

28 if (st[rt].lazy)

29 {

30 st[lson].lazy=1;

31 st[rson].lazy=1;

32 st[lson].num=min(st[rt].num,st[lson].num);

33 st[rson].num=min(st[rt].num,st[rson].num);

34 st[rt].lazy=0;

35 }

36 }

37 void build(int rt,int l,int r)

38 {

39 st[rt].l=l;

40 st[rt].r=r;

41 st[rt].lazy=0;

42 st[rt].num=INF;

43 if (l==r) return;

44 int mid=(l+r)>>1;

45 build(lson,l,mid);

46 build(rson,mid+1,r);

47 }

48 void update(int rt,int l,int r,long long v)

49 {

50 if (l<=st[rt].l && st[rt].r<=r)

51 {

52 st[rt].num=min(st[rt].num,v);

53 st[rt].lazy=1;

54 return;

55 }

56 pushdown(rt);

57 int mid=(st[rt].l+st[rt].r)>>1;

58 if (l<=mid) update(lson,l,r,v);

59 if (r>mid) update(rson,l,r,v);

60 //pushup(rt);

61 }

62 long long query(int rt,int pos)

63 {

64 if (pos==0) return 0;

65 if (st[rt].l==st[rt].r) return st[rt].num;

66 pushdown(rt);

67 int mid=(st[rt].l+st[rt].r)>>1;

68 if (pos<=mid) return query(lson,pos);

69 else return query(rson,pos);

70 }

71 int main()

72 {

73 while (scanf("%d",&n)!=EOF)

74 {

75 for (int i=1;i<=n;i++)

76 scanf("%lld",&p[i]);

77 for (int i=1;i<=n;i++)

78 scanf("%lld",&t[i]);

79 build(1,1,n);

80

81 for (int i=1;i<=n;i++)

82 {

83 long long tmp=query(1,i-1);

84 update(1,i,i+t[i]-1,tmp+p[i]);

85 }

86 printf("%lld\n",query(1,n));

87 }

88 return 0;

89 }