题目链接

题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i])。输出最后n个数。

思路 : 暴力线段树,将区间进行更新,可以用延迟标记,也可以不用。p数组代表当前节点这一段上的值是不是相同,不全相同就是-1.

  1 //4902
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #include <algorithm>
  6
  7 using namespace std ;
  8
  9 #define LL long long
 10 LL a ,lz[100011*4],p[100011*4];
 11
 12 void pushup(int rt)
 13 {
 14     if(p[rt << 1] == p[rt << 1 | 1])
 15         p[rt] = p[rt << 1] ;
 16     else p[rt] = -1 ;
 17 }
 18
 19 void pushdown(int rt)
 20 {
 21     if(lz[rt] != -1)
 22     {
 23         lz[rt << 1] =  lz[rt << 1 | 1] = lz[rt] ;
 24         p[rt << 1] =   p[rt << 1 | 1] = lz[rt] ;
 25         lz[rt] = -1 ;
 26     }
 27 }
 28 void build(int l,int r,int rt)
 29 {
 30     lz[rt] = -1 ;
 31     if(l == r)
 32     {
 33         scanf("%I64d",&a) ;
 34         p[rt] = a;
 35         return ;
 36     }
 37     int mid = (l + r) >> 1 ;
 38     build(l,mid,rt << 1) ;
 39     build(mid+1,r,rt << 1 | 1) ;
 40     pushup(rt) ;
 41 }
 42
 43 void update(int L,int R,int l,int r,int rt,LL sc,int flag)
 44 {
 45     if(flag > 0)
 46     {
 47         if(l >= L && r <= R)
 48         {
 49             p[rt] = lz[rt] = sc ;
 50             return ;
 51         }
 52     }
 53     else
 54     {
 55         if(p[rt] != -1 && (l >= L && r <= R))
 56         {
 57             if(p[rt] > sc)
 58             {
 59                 lz[rt] = p[rt] = __gcd(p[rt],sc) ;
 60             }
 61             return ;
 62         }
 63     }
 64     pushdown(rt) ;
 65     int mid = (l+r) >> 1 ;
 66     if(mid >= L)
 67         update(L,R,l,mid,rt << 1,sc,flag) ;
 68     if(R > mid)
 69         update(L,R,mid+1,r,rt << 1 | 1,sc,flag) ;
 70     pushup(rt) ;
 71 }
 72
 73 void output(int l ,int r,int rt)
 74 {
 75     if(l == r)
 76     {
 77         printf("%I64d ",p[rt]) ;
 78         return ;
 79     }
 80     pushdown(rt) ;
 81     int mid = (l + r) >> 1 ;
 82     output(l,mid,rt << 1) ;
 83     output(mid+1,r,rt << 1 | 1) ;
 84 }
 85 int main()
 86 {
 87     int T ,n,Q ;
 88     cin >> T ;
 89     while(T--)
 90     {
 91         scanf("%d",&n) ;
 92         build(1,n,1) ;
 93         scanf("%d",&Q) ;
 94         int t,l,r;
 95         LL x ;
 96         while(Q--)
 97         {
 98             scanf("%d %d %d %I64d",&t,&l,&r,&x) ;
 99             if(t == 1)
100                 update(l,r,1,n,1,x,1) ;
101             else
102                 update(l,r,1,n,1,x,-1) ;
103         }
104         output(1,n,1) ;
105         puts("") ;
106     }
107     return 0 ;
108 }

View Code

转载于:https://www.cnblogs.com/luyingfeng/p/3885400.html

2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)相关推荐

  1. HDU - 4902 Nice boat(线段树)

    题目链接:点击查看 题目大意:给出 n 个数字组成的数列 a ,需要进行 m 次操作,每次操作分为以下两种: 1 l r val:将区间 [ l , r ] 内的 a[ i ] 都赋值为 val 2 ...

  2. 石油大 2019年第二阶段我要变强个人训练赛第十八场 Problem N 扶桑号战列舰(线段树+区间更新+区间查询)

    链接:http://icpc.upc.edu.cn/problem.php?cid=1803&pid=13 题意:给出一个n,接下来一行给出n个数.才开始所有数为0,每次操作可以选一个区间[l ...

  3. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  4. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  5. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  6. hdu 1698 Just a Hook 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of ...

  7. HDU 4533 威威猫系列故事――晒被子(线段树区间更新+分情况推公式)

    因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了.  生活还要继续,太阳也照常升起,今天,威威猫在第一象限晒了N条矩形的被子,被子的每条边都和坐 ...

  8. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  9. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

最新文章

  1. pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)...
  2. java字符后移_java把字符串参数往后移3位后输出
  3. Delphi的文件操作
  4. 你熟知的开源项目,幕后推手竟然是他们?
  5. linux程序网络验证,【redhat5.5】linux的LDAP认证服务器的配置及客户端pam网络验证实例...
  6. 【Linux学习记录】Linux文件属性权限、目录管理
  7. mouseover 和 mouseenter 的区别
  8. 彻底卸载360安全卫士的方法
  9. 小程序云开发之--微信公众号文章采集篇
  10. 分数计算器java报告_20182307 2019-2020-1 《数据结构与面向对象程序设计》实验四报告...
  11. WeQuant交易策略—5日均线
  12. SPA Matlab Code(转载)
  13. ologit 平行线检验 brant踩坑历程not all independent variables can be retained in binary logits brant test cann
  14. 三-五功能/半亮/25%亮/全亮/爆闪/SOS_专用应急灯手电筒IC方案
  15. 中高级Java程序员,你不得不掌握的基本功,挑战20k+
  16. 机器学习实战 美国50K工资分类
  17. 大数据系列sql基础知识(史上最全,收藏起来)
  18. Scrapy框架的使用之Scrapy爬取新浪微博
  19. 【小白】学深度学习 发现一个褥百度GPU羊毛的机会
  20. python学习小记

热门文章

  1. 妙用Windows安全模式执行杀毒
  2. js---25桥模式
  3. PostgreSQL数据库服务端监听设置及客户端连接方法教程
  4. Skype for Business Server 2015-12-WAP-发布-2-邮件服务器
  5. CHM格式的可以全文搜索的Spring3.2官方参考文档
  6. Windows 8实用窍门系列:10.Windows 8的基本变换和矩阵变换以及AppBar应用程序栏
  7. mysql数据库同步 debug
  8. Larbin简介,及其在Ubuntu10.04下的编译安装
  9. 爬取百度网盘资源报user is not authorized, hitcode:119
  10. koa2+vue实现登陆以及是否登陆控制