据说暴力也过了。还傻逼地写了这么长。

#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 线段树+离线的更多相关文章

  1. HDU 4902 Nice boat --线段树(区间更新)

    题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...

  2. hdu 4902 Nice boat 线段树

    题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...

  3. HDU 3333 Turing Tree 线段树+离线处理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...

  4. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  5. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. 线段树+离线 hdu5654 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  9. HDU 4902 Nice boat (线段树)

    Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...

随机推荐

  1. Solr通过配DIH对数据库数据做索引

    1 加入相关jar包 将2个相关jar包复制到/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib文件夹下 jar包名称 solr-dataimp ...

  2. Matplotlib基本图形之折线图

    Matplotlib基本图形之折线图折线图特点 折线图是用折线将各数据连起来组成的图形常用来观察数据随时间变化的趋势例如:股票价格,温度变化,等等 示例代码: import os import tim ...

  3. Leetcode 331.验证二叉树的前序序列化

    验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如#. 例如,上面的二叉树可以被序 ...

  4. sql语句中的join连接(左连接、右连接、全连接、内连接)

    内部连接(inner join): select * from d_user a inner join D_ORGANIZATION b on a.COMPANY_XID=b.ID  内部链接也是排他 ...

  5. 九度oj 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  6. java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment问题解决

    2018-09-29 17:45:16.905 ERROR [pool-1-thread-1]o.s.scheduling.support.TaskUtils$LoggingErrorHandler. ...

  7. 彻底解决Request Too Long的问题

    运行regedit,进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters , 1. 添加类型为 DWORD(3 ...

  8. SPOJ NSUBSTR Substrings ——后缀自动机

    建后缀自动机 然后统计次数,只需要算出right集合的大小即可, 然后更新f[l[i]]和rit[i]取个max 然后根据rit集合短的一定包含长的的性质,从后往前更新一遍即可 #include &l ...

  9. Tree 树(树形期望dp)

    题意也是需要解释一下的,这个期望步数,是需要求无限步的时候的,就是你只要能到达,都要算上去, 这个我一开始真的没什么思路,打了暴力,搞一个精度,结果全超时了,看来精度定的太细了. 出题人的题解是这个, ...

  10. 云计算与 OpenStack

    “云计算” 算是近年来最热的词了.现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼. 对于云计算,学术界有各种定义,大家有兴趣可以百度一下. CloudMan 这里主要想从技术的角度谈谈对云计 ...