HDU 4902 Nice boat 线段树+离线
据说暴力也过了。还傻逼地写了这么长。
。
。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
using namespace std;
#define ll long long
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Val(x) tree[x].val
#define Lazy(x) tree[x].lazy
#define Num(x) tree[x].num
const ll oo = (ll)(-1e15);
inline ll Mid(ll x, ll y){return (x+y)>>1;}
inline ll gcd(ll x, ll y){
if(x>y)swap(x,y);
while(x){
y%=x;
swap(x,y);
}
return y;
}
#define N 100500
struct qqq{
ll op, l, r, val;
}Q[N];
ll n, a[N];
struct node{
ll l, r;
ll lazy, num;
}tree[N<<2];
void push_down(ll id){
if(tree[id].l == tree[id].r) return;
if(Num(id)>0){
Num(L(id)) = Num(R(id)) = Num(id);
}
if(Lazy(id) == oo) return;
Lazy(L(id)) = Lazy(R(id)) = Lazy(id);
Lazy(id) = oo;
}
void push_up(ll id){
if(Num(L(id)) != Num(R(id)))
{
Num(id) = -1;
}
else if(Num(L(id)) == Num(R(id)))Num(id) = Num(L(id));
}
void build(ll l, ll r, ll id){
tree[id].l = l, tree[id].r = r;
Lazy(id) = oo;
Num(id) = 0;
if(l == r)
{
Lazy(id) = a[l];
return;
}
ll mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
}
void updata1(ll l, ll r, ll val, ll num, ll id){
push_down(id);
if(Num(id) > num)return ;
if(l == tree[id].l && tree[id].r == r && Num(id) == 0)
{
Lazy(id) = val;
Num(id) = num;
return;
}
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
updata1(l, r, val, num, R(id));
else if(r <= mid)
updata1(l, r, val, num, L(id));
else {
updata1(l, mid, val, num, L(id));
updata1(mid+1, r, val, num, R(id));
}
push_up(id);
}
void updata2(ll l, ll r, ll val, ll num, ll id){
push_down(id);
if(Num(id) > num)return ;
if(l == tree[id].l && tree[id].r == r && Num(id)!=-1)
{
if(Lazy(id)!=oo)
{
if(Lazy(id) > val)
Lazy(id) = gcd(Lazy(id), val);
return ;
}
}
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
updata2(l, r, val, num, R(id));
else if(r <= mid)
updata2(l, r, val, num, L(id));
else {
updata2(l, mid, val, num, L(id));
updata2(mid+1, r, val, num, R(id));
}
if(Lazy(L(id)) == Lazy(R(id)))
Lazy(id) = Lazy(L(id));
else Lazy(id) = oo;
}
void query(ll id){
push_down(id);
if(tree[id].l == tree[id].r)
{
printf("%I64d ", Lazy(id));
return ;
}
ll mid = Mid(tree[id].l, tree[id].r);
query(L(id));
query(R(id));
}
int main(){
ll i, l, r, T, que, op, val; cin>>T;
while(T--){
cin>>n;
for(i = 1; i <= n; i++)scanf("%I64d",&a[i]);
build(1, n, 1);
cin>>que;
for(i = 1; i <= que; i++)scanf("%I64d %I64d %I64d %I64d", &Q[i].op, &Q[i].l, &Q[i].r, &Q[i].val);
for(i = que; i; i--)
if(Q[i].op == 1)
{
updata1(Q[i].l, Q[i].r, Q[i].val, i, 1);
}
for(i = 1; i <= que; i++)
if(Q[i].op == 2 && Q[i].op)
{
updata2(Q[i].l, Q[i].r, Q[i].val, i, 1);
}
query(1);
puts("");
}
return 0;
}
HDU 4902 Nice boat 线段树+离线的更多相关文章
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- hdu 4902 Nice boat 线段树
题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- HDU 4902 Nice boat (线段树)
Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...
随机推荐
- 《零基础入门学习Python》【第一版】视频课后答案第005讲
测试题答案: 0.Python中: int:整型 bool:布尔类型 float:浮点型 str:字符串类型 1.为什么布尔类型(bool)的TRUE和FALSE分别用0和1表示? 计算机只认识二进制 ...
- Python解释器镜像源修改
目录 Windows Mac 这篇文章将解除你使用python的pip install xxx受到的网速限制,如果只是下载较小的第三方库,可以尝试pip --default-timeout=100 i ...
- mysql 审核引擎 goInception 的基本使用
官网地址 github.com 安装 git clone https://github.com/hanchuanchuan/goInception.git cd goInception 修改配置 开启 ...
- yum安装的java配置
vim /etc/profile JAVA_HOME=/usr/lib/jvm/javaJRE_HOME=$JAVA_HOME/jreCLASS_PATH=.:$JAVA_HOME/lib/dt.ja ...
- Android AAR 混淆的坑
一定不要忘记加上这段 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,A ...
- 推荐SQL Server Management Studio以及Visual Studio下的免费的插件 ApexSQL Complete
SQL Server 并没有代码格式化的工具,对于处理他人编写的长SQL需要手工的格式化是一件麻烦的事情. 推荐SQL Server Management Studio以及Visual Studio下 ...
- tp 路径表示
本文实例分析了thinkphp常见路径用法.分享给大家供大家参考.具体如下: 这里介绍的标签主要有: __root__ __self__ __action__ __url__ __app__ __pu ...
- Linux下dpkg的用法
转自:http://blog.csdn.net/fireblue1990/article/details/52627952 dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理 ...
- 【2018.10.15】WZJ笔记(数论)
1. 证明:对于任意质数$p\gt 3$,$p^2-1$能被$24$整除. 证:平方差公式,$p^2-1 = (p-1)(p+1)$. 再把$24$分解质因数$2^3*3$. 三个相邻的自然数中至少有 ...
- 数字梯形(cogs 738)
«问题描述:给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径.规则1:从梯形的顶 ...