码迷,mamicode.com
首页 > 其他好文 > 详细

P1108-低价购买

时间:2019-08-18 11:29:39      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:bit   gre   std   void   lse   typedef   names   ret   max   

 1 #include <bits/stdc++.h>
 2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
 3 typedef long long ll;
 4 using namespace std;
 5 inline ll read()
 6 {
 7     ll ans = 0;
 8     char ch = getchar(), last =  ;
 9     while(!isdigit(ch)) last = ch, ch = getchar();
10     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - 0, ch = getchar();
11     if(last == -) ans = -ans;
12     return ans;
13 }
14 inline void write(ll x)
15 {
16     if(x < 0) x = -x, putchar(-);
17     if(x >= 10) write(x / 10);
18     putchar(x % 10 + 0);
19 }
20 int N;
21 ll a[5003];
22 ll dpt[5003];
23 ll dptend = 0;
24 ll dp1[5003];
25 ll dp2[5003];
26 ll rnt1 = 1,rnt2;
27 int main()
28 {
29     N = read();
30     _for(i,1,N+1)
31     a[i] = read();
32 
33     dpt[++dptend] = a[1];
34     dp1[1] = 1;
35     _for(i,2,N+1)
36     {
37         if(a[i] < dpt[dptend])
38         {
39             dpt[++dptend] = a[i];
40             dp1[i] = dptend;
41         }
42         else
43         {
44             int t = lower_bound(dpt+1,dpt+1+dptend,a[i],greater<int>())-dpt;
45             dpt[t] = a[i];
46             dp1[i] = t;
47         }
48         rnt1 = max(rnt1,dptend);
49     }
50     
51     _for(i,1,N+1)
52     {
53         if(dp1[i]==1) 
54             dp2[i] = 1;
55         _for(j,1,i)
56         {
57             if(dp1[i]==dp1[j]+1 && a[i]<a[j])
58                 dp2[i] += dp2[j];
59             else if(dp1[i] == dp1[j] && a[i]==a[j])
60                 dp2[i] = 0;
61         }
62         if(dp1[i]==rnt1)
63             rnt2 += dp2[i];
64     }
65     printf("%lld %lld\n",rnt1,rnt2);
66     return 0;
67 }

 

P1108-低价购买

标签:bit   gre   std   void   lse   typedef   names   ret   max   

原文地址:https://www.cnblogs.com/Asurudo/p/11371578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!