multiset || 线段树 HDOJ 4302 Holedox Eating

 

题目传送门

题意:一个长度L的管子,起点在0。n次操作,0 p表示在p的位置放上蛋糕,1表示去吃掉最近的蛋糕(如果左右都有蛋糕且距离相同,那么吃同方向的蛋糕),问最终走了多少路程

分析:用multiset来保存蛋糕的位置,以当前的位置进行二分查找相邻的蛋糕的位置,模拟这个过程。当然也可以用线段树单点更新维护。

收获:当结果和暴力程序跑出来的一样却WA时,想想是否遗漏了某些情况的讨论

 

multiset:

/************************************************
* Author        :Running_Time
* Created Time  :2015-8-22 9:31:50
* File Name     :C.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

int main(void)    {
    int T, cas = 0;  scanf ("%d", &T);
    while (T--) {
        multiset<int> S;	S.clear ();
        multiset<int>::iterator it, l, r;
        int n, m;   scanf ("%d%d", &n, &m);
        ll ans = 0; int now = 0, d = 1;      //d == 0:左 d == 1: 右
        while (m--) {
            int op, p;  scanf ("%d", &op);
            if (op == 0)    {
                scanf ("%d", &p);   S.insert (p);
            }
            else    {
                if (S.empty ()) continue;        //没蛋糕了
                it = S.lower_bound (now);

                r = it, l = it;
                if (it == S.end ()) {          //右边没蛋糕
                    l--;
                    ans += (now - *l);
                    if (*l < now)	d = 0;	    //当蛋糕在左边时才改变方向,下面类似
                    now = *l;
                    S.erase (l);
                }
                else if (it == S.begin ())  {      //左边没蛋糕
                    ans += (*r - now);
                    if (now < *r)  d = 1;
                    now = *r;
                    S.erase (r);
                }
                else    {                  //左右都有蛋糕
                    l--;
                    int dt0 = now - *l, dt1 = *r - now;
                    if (dt0 == dt1) {            //左右距离相等
                        if (d == 0) {
                            ans += dt0; now = *l;
                            S.erase (l);
                        }
                        else    {
                            ans += dt1; now = *r;
                            S.erase (r);
                        }
                    }
                    else if (dt0 < dt1) {        //吃左边的蛋糕
                        ans += dt0; now = *l;
                        if (dt0)	d = 0;
                        S.erase (l);
                    }
                    else    {                //吃右边的蛋糕
                        ans += dt1; now = *r;
                        if (dt1)	d = 1;
                        S.erase (r);
                    }
                }
            }
        }

        printf ("Case %d: %I64d\n", ++cas, ans);
    }

    return 0;
}

 

Segment_Tree:

#include <bits/stdc++.h>
using namespace std;

#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
typedef long long ll;
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
struct Segment_Tree {
    struct Node {
        int mx, mn, cnt;
    }node[N<<2];
    void push_up(int o) {
        node[o].mx = max (node[o<<1].mx, node[o<<1|1].mx);
        node[o].mn = min (node[o<<1].mn, node[o<<1|1].mn);
    }
    void build(int l, int r, int o) {
        if (l == r) {
            node[o].mx = -INF;  node[o].mn = INF;
            node[o].cnt = 0;    return ;
        }
        int mid = l + r >> 1;
        build (lson);   build (rson);
        push_up (o);
    }
    void updata(int p, int c, int l, int r, int o)  {
        if (l == r && p == l)   {
            node[o].mx = node[o].mn = p;
            node[o].cnt += c;
            if (!node[o].cnt)   {
                node[o].mx = -INF;  node[o].mn = INF;
            }
            return ;
        }
        int mid = l + r >> 1;
        if (p <= mid)   updata (p, c, lson);
        else    updata (p, c, rson);
        push_up (o);
    }
    int query_left(int ql, int qr, int l, int r, int o) {
        if (ql <= l && r <= qr) {
            return node[o].mx;
        }
        int mid = l + r >> 1, ret = -INF;
        if (ql <= mid)  ret = max (ret, query_left (ql, qr, lson));
        if (qr > mid)   ret = max (ret, query_left (ql, qr, rson));
        return ret;
    }
    int query_right(int ql, int qr, int l, int r, int o) {
        if (ql <= l && r <= qr) {
            return node[o].mn;
        }
        int mid = l + r >> 1, ret = INF;
        if (ql <= mid)  ret = min (ret, query_right (ql, qr, lson));
        if (qr > mid)   ret = min (ret, query_right (ql, qr, rson));
        return ret;
    }
}st;

int main(void)    {
    int T, cas = 0;  scanf ("%d", &T);
    while (T--) {
        int n, m;   scanf ("%d%d", &n, &m);
        n++;
        st.build (1, n, 1);
        ll ans = 0; int now = 1, d = 1;
        while (m--) {
            int op, p;  scanf ("%d", &op);
            if (op == 0)    {
                scanf ("%d", &p);   p++;
                st.updata (p, 1, 1, n, 1);
            }
            else    {
                int p1 = st.query_left (0, now, 1, n, 1);
                int p2 = st.query_right (now, n, 1, n, 1);
                if (p1 == -INF && p2 == INF)    continue;
                if (p2 == INF) {
                    ans += now - p1;
                    if (p1 < now)   d = 0;
                    now = p1;
                    st.updata (p1, -1, 1, n, 1);
                }
                else if (p1 == -INF)  {
                    ans += p2 - now;
                    if (p2 > now)   d = 1;
                    now = p2;
                    st.updata (p2, -1, 1, n, 1);
                }
                else    {
                    int dt0 = now - p1, dt1 = p2 - now;
                    if (dt0 == dt1) {
                        if (d == 0) {
                            ans += dt0; now = p1;
                            st.updata (p1, -1, 1, n, 1);
                        }
                        else    {
                            ans += dt1; now = p2;
                            st.updata (p2, -1, 1, n, 1);
                        }
                    }
                    else if (dt0 < dt1) {
                        ans += dt0; now = p1;
                        if (dt0)    d = 0;
                        st.updata (p1, -1, 1, n, 1);
                    }
                    else    {
                        ans += dt1; now = p2;
                        if (dt1)    d = 1;
                        st.updata (p2, -1, 1, n, 1);
                    }
                }
            }
        }
        printf ("Case %d: %I64d\n", ++cas, ans);
    }
 
    return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4751230.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值