AC日记——Periodic RMQ Problem codeforces 803G
思路:
题目给一段序列,然后序列复制很多次;
维护序列很多次后的性质;
线段树动态开点;
来,上代码:
#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的更多相关文章
- (WAWAWAWAWAWAW) G. Periodic RMQ Problem
没有联通门 : Codeforces G. Periodic RMQ Problem /* Codeforces G. Periodic RMQ Problem MMP 什么动态开点线段树啊 ... ...
- codeforces 803G Periodic RMQ Problem
codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
- Codeforces 803 G. Periodic RMQ Problem
题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...
- AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)
P4746 C’s problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...
- 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 ...
- AC日记——Andryusha and Socks Codeforces 780a
A. Andryusha and Socks time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- AC日记——Sagheer, the Hausmeister codeforces 812b
812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #includ ...
随机推荐
- 缓存(CDN缓存,浏览器(客户端)缓存)
1.什么是缓存? 缓存是一种数据结构,用于快速查找以及执行的操作结果.因此,如果一个操作执行起来很慢,对于常用的输入数据就可以将操作的结果缓存,并在下次调用该操作时使用缓存的数据. 缓存是一个到处都存 ...
- 剑指Offer - 九度1507 - 不用加减乘除做加法
剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包 ...
- 《Cracking the Coding Interview》——第7章:数学和概率论——题目5
2014-03-20 02:20 题目:给定二维平面上两个正方形,用一条直线将俩方块划分成面积相等的两部分. 解法:穿过对称中心的线会将面积等分,所以连接两个中心即可.如果两个中心恰好重合,那么任意穿 ...
- Windows+Python 3.6环境下安装PyQt4
第一步:下载.whl,地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4,这里可以下载不同的python版本对应的包. 第二步:选择一个目录,将下 ...
- 牛客网暑期ACM多校训练营(第一场):D-Two Graphs
链接:D-Two Graphs 题意:给出图G1和G2,求G2的子图中和G1同构的个数. 题解:只有8个点,暴力枚举G2的点每个排列,让G1映射到G2中,求出同构个数a.同构的G2就是在G1有边的对应 ...
- 用js做的表单的增,删,以及全选
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>创 ...
- python基础——字典dict
1.概念: (1)字典dict,是一系列的键—值对.每个键key都和一个值value相映射.(字典是python中唯一的映射类型.) (2)每一项item,是一个键值对key—value对. (3)键 ...
- node+express+nginx搭建站点
window系统 1.安装node 2.新建文件夹test 3. cmd 命令行 cd test 进入test文件夹下 输入命令:npm -v查看版本 确认node是否安装成功 4.npm init ...
- hdu 2544 最短路 (最短路径)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- JavaScript的团队编程规范
本规范是针对javascript函数式编程风格与公司严重依赖于jQuery进行编码的现实制定出来. 禁止使用eval,with与caller(ecma262 v5 的use strict要求).eva ...