学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

#include <stdio.h>
#include 
<string.h>

#define LL __int64

const int N = 100005;

int n;
LL m, s, c;
LL A[N], dp[N];
LL sum[N];
int que[N];
int pre[N];
int seg[N][2];

LL ok(
int i, int j) {
    
return (dp[j] - dp[i]) + s * (A[j+1- A[i+1]);
}


int main() {
    
while( scanf("%d%I64d%I64d%I64d"&n, &m, &s, &c) != EOF) {
        sum[
0= 0ll;
        
for(int i = 1; i <= n; i ++{
            scanf(
"%d", A + i);
            sum[i] 
= sum[i - 1+ A[i];
        }

        
int head = 0, tail = 0;
        dp[
0= 0ll;
        que[
0= 0;
        pre[
0= 0;
        
for(int i = 1; i <= n; i ++{
            
while( head <= tail && sum[i] - sum[que[head]] > m )    head++;
            pre[i] 
= que[head];
            dp[i] 
= dp[que[head]] + s*(A[que[head] + 1- A[i]) + c;
            
while( head <= tail && ok(que[tail], i) >= 0 ) tail --;
            que[
++tail] = i;
        }

        
int cnt = 0, t = n;
        t 
= n;
        
while( t != 0{
            seg[cnt][
0= pre[t]+1;
            seg[cnt
++][1= t;
            t 
= pre[t];
        }

        printf(
"%I64d %d\n", dp[n] + sum[n], cnt);
        
for(int i = cnt - 1; i >= 0; i --) printf("%d %d\n", seg[i][0], seg[i][1]);
        puts(
"");
    }

}

posted on 2010-07-19 14:10 superlong 阅读(160) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理