G - Periodic RMQ Problem

思路:

  题目给一段序列,然后序列复制很多次;

  维护序列很多次后的性质;

  线段树动态开点;

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;#define maxn 100005struct TreeNodeType {int l, r, mid, min, flag;TreeNodeType *lc, *rc;TreeNodeType(){flag=0;lc = NULL;rc = NULL;}
};
struct TreeNodeType *root, *rot;int n, k, m;inline void in(int &now)
{char Cget = getchar(); now = 0;while (Cget > '9' || Cget < '0') Cget = getchar();while (Cget >= '0'&&Cget <= '9'){now = now * 10 + Cget - '0';Cget = getchar();}
}void tree_build_ori(TreeNodeType *&now, int l, int r)
{if (now == NULL){now = new TreeNodeType;now->l = l, now->r = r;now->mid = (l + r) >> 1;}if (l == r){in(now->min);return;}tree_build_ori(now->lc, l, now->mid);tree_build_ori(now->rc, now->mid + 1, r);now->min = min(now->lc->min, now->rc->min);
}int tree_query_ori(TreeNodeType *&now, int l, int r)
{if (now->l == l&&now->r == r) return now->min;if (l > now->mid) return tree_query_ori(now->rc, l, r);else if (r <= now->mid) return tree_query_ori(now->lc, l, r);else return min(tree_query_ori(now->lc, l, now->mid), tree_query_ori(now->rc, now->mid + 1, r));
}inline void tree_down(TreeNodeType *&now)
{now->lc->min = now->flag;now->lc->flag = now->flag;now->rc->min = now->flag;now->rc->flag = now->flag;now->flag = 0;
}int solve(int l, int r)
{if(r-l+1>=n) return rot->min;l%=n,r%=n;if(l==0) l=n;if(r==0) r=n;if(r<l) return min(tree_query_ori(rot, l, n), tree_query_ori(rot, 1, r));else return tree_query_ori(rot,l,r);
}void tree_change(TreeNodeType *&now, int l, int r, int x)
{if (now->l == l&&now->r == r){now->min = x;now->flag = x;return;}if (now->rc == NULL){now->rc = new TreeNodeType;now->rc->l = now->mid + 1;now->rc->r = now->r;now->rc->mid = (now->rc->r + now->rc->l) >> 1;now->rc->min = solve(now->rc->l, now->rc->r);}if (now->lc == NULL){now->lc = new TreeNodeType;now->lc->l = now->l;now->lc->r = now->mid;now->lc->mid = (now->lc->l + now->lc->r) >> 1;now->lc->min = solve(now->lc->l, now->lc->r);}if (now->flag) tree_down(now);if (l > now->mid) tree_change(now->rc, l, r, x);else if (r <= now->mid) tree_change(now->lc, l, r, x);else{tree_change(now->lc, l, now->mid, x);tree_change(now->rc, now->mid + 1, r, x);}now->min = min(now->lc->min, now->rc->min);
}int tree_query(TreeNodeType *&now, int l, int r)
{if (now->l == l&&now->r == r) return now->min;if (now->rc == NULL){now->rc = new TreeNodeType;now->rc->l = now->mid + 1;now->rc->r = now->r;now->rc->mid = (now->rc->r + now->rc->l) >> 1;now->rc->min = solve(now->rc->l, now->rc->r);}if (now->lc == NULL){now->lc = new TreeNodeType;now->lc->l = now->l;now->lc->r = now->mid;now->lc->mid = (now->lc->l + now->lc->r) >> 1;now->lc->min = solve(now->lc->l, now->lc->r);}if (now->flag) tree_down(now);if (l > now->mid) return tree_query(now->rc, l, r);else if (r <= now->mid) return tree_query(now->lc, l, r);else return min(tree_query(now->lc, l, now->mid), tree_query(now->rc, now->mid + 1, r));now->min = min(now->lc->min, now->rc->min);
}int main()
{root = NULL, rot = NULL; int op, l, r, x;in(n), in(k), tree_build_ori(rot, 1, n), in(m);root = new TreeNodeType;root->l = 1, root->r = n*k, root->mid = 1 + n*k >> 1, root->min = rot->min;for (; m--;){in(op), in(l), in(r);if (op == 2) printf("%d\n", tree_query(root, l, r));else in(x),tree_change(root, l, r, x);}return 0;
}

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6797684.html

AC日记——Periodic RMQ Problem codeforces 803G相关推荐

  1. 19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记

    19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 ...

  2. AC日记——Roma and Poker codeforces 803e

    803E - Roma and Poker 思路: 赢或输或者平的序列: 赢和平的差的绝对值不得超过k: 结束时差的绝对值必须为k: 当"?"时可以自己决定为什么状态: 输出最终序 ...

  3. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MB Submit: 1594  Solved: 520 [Submi ...

  4. 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

    文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai​建权值线段树 再 ...

  5. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  6. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  7. Military Problem CodeForces 1006E (dfs序)

    J - Military Problem CodeForces - 1006E 就是一道dfs序的问题 给定一个树, 然后有q次询问. 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个 ...

  8. AC日记——Red and Blue Balls codeforces 399b

    399B - Red and Blue Balls 思路: 惊讶的发现,所有的蓝球的消除都是独立的: 对于在栈中深度为i的蓝球消除需要2^i次操作: 代码: #include <cstdio&g ...

  9. CF803G-Periodic RMQ Problem【离散化,线段树,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/CF803G 题目大意 一个长度为nnn的序列aaa复制kkk份连接,要求支持 区间赋值 区间查询最小值 n,q∈[1 ...

最新文章

  1. EF Code First执行SQL语句及存储过程
  2. cad文字提取到excel_干货!南方CASS设计土石方方格网点上提取高程方法
  3. 倒排索引(Inverted File Index )
  4. php 怎么开启错误提醒,php怎样开启错误提示
  5. C语言程序的内存四区模型
  6. 数据库元数据数据字典查询_6_列出给定表的外键引用
  7. I.MX6 Linux Qt 启动流程跟踪
  8. C++ opencv的一些基础知识
  9. 【计算机网络】网络基础知识和TCP/IP协议族
  10. Titanium快速开发app
  11. shell监控脚本-监控mysql 主从复制
  12. 入门佳作《例解Python》来了!案例丰富尽显风度ƪ(´▽`ƪ)
  13. python3 urlencode_Python3 parse.urlencode() 与parse.unquote()
  14. Laravel的介绍安装和启动
  15. linux内核不能识别u盘分区,一种在Linux内核中识别特定USB大容量存储设备的方法及系统与流程...
  16. dva学习-入门安装和目录介绍
  17. windows xp 64位版本 有些失望~
  18. 从零开始之驱动发开、linux驱动(四十、Linux common clock framework(5)_使用举例)
  19. pycharm报错warning: iCCP: known incorrect sRGB profile
  20. Ubuntu18.04编译c语言程序

热门文章

  1. dbgrideh指定某单元格变色_一招搞定按指定名称批量新建文件夹
  2. 中职升高职c语言程序设计教程课后答案,中职C语言教学创新与实践论文
  3. 初中生学计算机网络应用怎么样,初中生读计算机网络技术专业怎么样?小编解答...
  4. 常见问题_智能切膜机常见问题
  5. linux mysql误删,linux下MySQL安装与删除 (Ubuntu)
  6. python 32bit数据结构_python实现bitmap数据结构详解
  7. java三板斧_Java 枚举使用三板斧
  8. NoSQLBooster for MongoDB 中跨库关联查询
  9. 设置和清除LD_LIBRARY_PATH
  10. 【DSP复习主要知识点】(大概)