• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > UVa11402 Ahoy, Pirates!

UVa11402 Ahoy, Pirates!

作者:多看多听多总结 字体:[增加 减小] 来源:互联网 时间:2017-08-27

多看多听多总结通过本文主要向大家介绍了chips ahoy,ahoy,ahoy是什么意思,chips ahoy是什么意思,chips ahoy是什么品牌等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2397

代码如下:

 

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define lson(x) ((x) << 1)
#define rson(x) ((x << 1) + 1)

const int N = 4000001;
const int STR_LEN = 60;


class Node
{
public:
    int l, r, v, setv, resv;

    void set(int l, int r, int v, int setv, int resv)
    {
        this->l = l;
        this->r = r;
        this->v = v;
        this->setv = setv;
        this->resv = resv;
    }
};
Node node[N];
int v[N];

class RMQ
{
public:
    RMQ()
    {
        tree = node;
    }
    void build(int root, int left, int right)
    {
        if (left == right)
        {
            tree[root].set(left, right, v[left - 1], -1, 0);
        }
        else
        {
            int mid = (left + right) >> 1;
            build(lson(root), left, mid);
            build(rson(root), mid + 1, right);
            pushup(root);
        }
    }

    void update(int root, int left, int right, int v)
    {
        if (left <= node[root].l && right >= tree[root].r)
        {
            set_node(root, v);
            return;
        }

        int mid = (tree[root].l + tree[root].r) >> 1;
        pushdown(root);
        if (left <= mid) update(lson(root), left, right, v);
        if (right > mid) update(rson(root), left, right, v);
        pushup(root);
    }

    void reverse(int root, int left, int right)
    {
        if (left <= tree[root].l && right >= tree[root].r)
        {
            res_node(root);
            return;
        }

        int mid = (tree[root].l + tree[root].r) >> 1;
        pushdown(root);
        if (left <= mid) reverse(lson(root), left, right);
        if (right > mid) reverse(rson(root), left, right);
        pushup(root);
    }

    int query(int root, int left, int right)
    {
        if (left <= tree[root].l && right >= tree[root].r)
        {
            return tree[root].v;
        }

        int mid = (tree[root].l + tree[root].r) >> 1;
        pushdown(root);
        int result = 0;
        if (left <= mid) result += query(lson(root), left, right);
        if (right > mid) result += query(rson(root), left, right);
        pushup(root);

        return result;
    }

private:
    void pushup(int root)
    {
        tree[root].set(tree[lson(root)].l, tree[rson(root)].r, tree[lson(root)].v + tree[rson(root)].v, -1, 0);
    }

    void set_node(int u, int v)
    {
        tree[u].setv = v;
        tree[u].resv = 0;
        tree[u].v = v * (tree[u].r - tree[u].l + 1);
    }

    void res_node(int u)
    {
        tree[u].resv ^= 1;
        tree[u].v = tree[u].r - tree[u].l + 1 - tree[u].v;
    }

    void pushdown(int root)
    {
        if (tree[root].setv >= 0)
        {
            set_node(lson(root), tree[root].setv);
            set_node(rson(root), tree[root].setv);
            tree[root].setv = -1;
        }

        if (tree[root].resv)
        {
            res_node(lson(root));
            res_node(rson(root));
            tree[root].resv = 0;
        }
    }

private:
    Node *tree;
};


int main()
{
#ifndef ONLINE_JUDGE
    std::ifstream fin("f:\\OJ\\uva_in.txt");
    std::streambuf* back = std::cin.rdbuf(fin.rdbuf());
#endif

    int t;

    RMQ rmq;

    std::cin >> t;
    for (int i = 1; i <= t; i++) {
        int m;
        std::cin >> m;
        char str[STR_LEN];

        memset(v, 0x00, sizeof(v));
        int len = 0;
        while (m--)
        {
            int t;
            cin >> t >> str;
            int n = strlen(str);
            for (int j = 0; j < t; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    if (str[k] == '1')
                    {
                        v[len] = 1;
                    }
                    len++;
                }
            }
        }

        rmq.build(1, 1, len);
        int q;
        std::cin >> q;
        int qcnt = 1;
        std::cout << "Case " << i << ":" << std::endl;
        for (int i = 0; i < q; i++)
        {
            int a, b;
            std::cin >> str >> a >> b;

            if (str[0] == 'F') rmq.update(1, a + 1, b + 1, 1);
            else if (str[0] == 'E') rmq.update(1, a + 1, b + 1, 0);
            else if (str[0] == 'I') rmq.reverse(1, a + 1, b + 1);
            else if (str[0] == 'S')
            {
                int ans = rmq.query(1, a + 1, b + 1);
                std::cout << "Q" << qcnt++ << ": " << ans << std::endl;
            }
        }
    }


#ifndef ONLINE_JUDGE
    std::cin.rdbuf(back);
#endif

    return 0;
}

 

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • UVa11402 Ahoy, Pirates!

相关文章

  • 2017-05-28C语言指针入门学习面面观
  • 2017-05-28浅谈C++内存分配及变长数组的动态分配
  • 2022-04-30C语言数据类型转换(自动类型转换+强制类型转换)
  • 2017-05-28用C实现PHP扩展 Fetch_Url 类数据抓取的方法
  • 2017-05-28简单比较C语言中的execl()函数与execlp()函数
  • 2017-05-28ipv6实现udp编程示例
  • 2017-05-28C语言实现的bitmap位图代码分享
  • 2022-04-30C语言指针数组(数组每个元素都是指针)详解
  • 2017-05-28探讨register关键字在c语言和c++中的差异
  • 2017-05-28c语言求阶乘精确值示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++实现位图排序实例
    • 浅谈c/c++中使用指针需要注意的问题
    • C语言调试手段:锁定错误的实现方法
    • 详解C++编程中的重载流插入运算符和流提取运算符
    • 深入理解c++中virtual关键字
    • C++读写.mat文件的方法
    • 哈夫曼的c语言实现代码
    • 使用dc画笔画矩形、直线与椭圆示例
    • C语言中的内存泄露 怎样避免与检测
    • cf 304 Soldier and Traveling 网络流 + 记录流量情况

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有