G - Periodic RMQ Problem

思路:

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

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

  线段树动态开点;

来,上代码:

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

AC日记——Periodic RMQ Problem codeforces 803G的更多相关文章

  1. (WAWAWAWAWAWAW) G. Periodic RMQ Problem

    没有联通门 : Codeforces G. Periodic RMQ Problem /* Codeforces G. Periodic RMQ Problem MMP 什么动态开点线段树啊 ... ...

  2. codeforces 803G Periodic RMQ Problem

    codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...

  3. Codeforces 803G Periodic RMQ Problem 线段树

    Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...

  4. Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树

    思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用  lazy=0 没被覆盖过 els ...

  5. Codeforces 803 G. Periodic RMQ Problem

    题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...

  6. AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)

    P4746 C’s problem(c)   时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...

  7. AC日记——Sign on Fence Codeforces 484e

    E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...

  8. AC日记——Andryusha and Socks Codeforces 780a

    A. Andryusha and Socks time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. AC日记——Sagheer, the Hausmeister codeforces 812b

    812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #includ ...

随机推荐

  1. 宝石TD迷宫设计器

    说起宝石TD,能追溯到我上高二那会,算来是2005年. 所谓一款TD类的魔兽RPG,宝石TD可以算是达到了TD迷宫的巅峰,三进三出更是别具匠心. 这个迷宫设计器是去年在焦作做的,只完成了迷宫设计功能, ...

  2. 第一章 C++编程基础

    第一章 C++编程基础 1.1 如何撰写C++程序 赋值 assignment复合赋值 (compound assignment) += 函数(function)是一块独立的程序代码序列(code s ...

  3. HDU 4665 Unshuffle DFS找一个可行解

    每层找一对相等的整数,分别放在两个不同的串中. 参考了学弟的解法,果断觉得自己老了…… #include <cstdio> #include <cstring> #includ ...

  4. maven学习(十六)——使用Maven构建多模块项目

    在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务逻辑层).web(表现层),这样分层之 ...

  5. 软工实践 - 第十八次作业 Alpha 冲刺 (9/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10035464.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  6. hdu1712 分组背包 ACboy needs your help

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. 实用JS系列——BOM常用对象

    背景:  最近在着手项目的时候,意识到自己JS的欠缺.虽然看了不少JavaScript的视频,但真正项目中并不是经常遇到大且难的例子.所以JavaScript的基础还需要再打扎实,也就有了这一系列博客 ...

  8. redis单线程问题

    1.redis的单线程指的是什么单线程?同一个时间点只处理一个客户端的连接,也就是redis网络模块的单线程. 2.redis为什么设计成单线程 具体作者怎么想的,我不知道,我说一下我的理解(1)re ...

  9. Linq 聚合函数

    var WReserve = (from m in _db.W_RESERVE select m).ToList().LastOrDefault(); 必须ToList() 之后才能 last fir ...

  10. 在nodejs中 Object的toString()方法 querystring的stringify() JSON.stringify()

    刚学nodejs,做到一个例子:发送简单的HTTP请求.遇到一个问题,客户端给服务端发送的消息到服务端,服务端收不到消息,确切的说是“”. 以下是服务端代码:server.js const http ...