数据太弱,直接让我小暴力一下就过了,一开始没注意到时间是15000MS,队友发现真是太给力了

#include <cstdio>
#include <cstring>
int n,q,a[],x[],p,l[],r[],t[];
int tree[];
void build(int l, int r, int rt)
{
tree[rt]=-;
if(l==r){
tree[rt]=;
return;
}
int m=(l+r)/;
build(l,m,rt*);
build(m+,r,rt*+);
}
void update(int x, int y, int z, int l, int r, int rt)
{
if(x<=l&&y>=r){
tree[rt]=z;
return;
}
if(tree[rt]!=-) {
tree[rt*]=tree[rt];
tree[rt*+]=tree[rt];
tree[rt]=-;
}
int m=(l+r)/;
if(x<=m) update(x,y,z,l,m,rt*);
if(y>m) update(x,y,z,m+,r,rt*+);
}
int query(int k, int l, int r, int rt)
{
if(tree[rt]!=-) return tree[rt];
int m=(l+r)/;
if(k<=m) return(query(k,l,m,rt*));
else return(query(k,m+,r,rt*+));
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
memset(tree,-,sizeof(tree));
scanf("%d",&n);
build(,n,);
for(int i=; i<=n; i++)
scanf("%d",&a[i]);
scanf("%d",&q);
for(int i=; i<=q; i++)
{
scanf("%d%d%d%d",&t[i],&l[i],&r[i],&x[i]);
if(t[i]==) update(l[i],r[i],i,,n,);
}
for(int i=; i<=n; i++){
p=query(i,,n,);
if(p) a[i]=x[p];
for(int j=p+; j<=q; j++)
if(t[j]==&&l[j]<=i&&r[j]>=i){
if(a[i]>x[j]){
int aa=a[i],bb=x[j],t=aa%bb;
while(t!=){
aa=bb;
bb=t;
t=aa%bb;
}
a[i]=bb;
}
}
}
for(int i=; i<=n; i++)
printf("%d ",a[i]);
printf("\n");
}
}

CLJ给出的正确题解:

  

既然gcd(a[i],x)<0.5a[i]

  那么最多每个数字修改不会超过32次,

应该便是储存区间最大值以及增加判断区间内数字是否一致的flag

  每次对于区间最大值>x的区间进行修改,最差情况无非是每个数字都不同,且数字都大于x,nlgn,而最多就修改32次,因此最差情况nlg^2n。

  虽然证明麻烦,但是凭借感觉还是能够明白的。

实现相对简单便不再累赘。

HDU 4902的更多相关文章

  1. HDU 4902 (线段树)

    Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...

  2. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  3. HDU 4902 Nice boat (线段树)

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

  4. hdu 4902 线段树+逆向模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4902 出n个数,然后对这n个数进行两种操作: 如果是 1 l r x,则把 [l, r] 区间里面的每一个数都变 ...

  5. hdu 4902 Nice boat(线段树区间改动,输出终于序列)

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

  6. hdu 4902 Nice boat--2014 Multi-University Training Contest 4

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...

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

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

  8. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

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

  9. hdu 4902 Nice boat 线段树

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

随机推荐

  1. c语言编程之循环队列

    利用链表实现的循环队列,完成了队列的入队和出队,对于队空和队满用了一个flag进行标记.入队flag++,出队flag-- #include"stdio.h" typedef in ...

  2. 学习Ember遇到的一些问题

    1.在模板中不能省略结束标签: 在Ember的模板中,如果省略结束标签的话,会有好多无解的问题(可能是:不更新.更新后结构不对.model和view不同步等),苦苦找了很久.... 2.childVi ...

  3. bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为1 ...

  4. 【递推】BZOJ 1088: [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2275  Solved: 1328[Submit][St ...

  5. 【BZOJ】【1770】【Usaco2009 Nov】lights 灯

    高斯消元解XOR方程组 一眼看上去是高斯消元解xor方程组……但是不会写……sad 去膜拜了Hzwer和ZYF Hzwer啥也没说,还是zyf靠谱…… 当多解的时候就需要爆搜枚举自由元的情况,找最优解 ...

  6. Matlab实现求a到b被c整除的个数

    我先想到的是for循环........ 然后sum(find(mod(a:b,c)==0)),从10到100得到874,为什么不对呢? 比如a = [1 2 3 4  2 3 4 2],find(a= ...

  7. Windows 进程通信 之 DDE技术

    DDE (Dynamic Data Exchange,DDE)动态数据交换,是一种进程间通信机制,它最早是随着Windows由微软提出的.当前大部分软件仍旧支持DDE,但最近十年里微软已经停止发展DD ...

  8. IOS委托设计模式(摘自IOS开发指南)

  9. Android ActionBar与ViewPager合用

    内容可以左右滑动,因为使用了ViewPager(我这里用了V4包) view_pager_main.xml <?xml version="1.0" encoding=&quo ...

  10. Linux和Linux之间共享目录

    1.Linux 服务器端NFS服务器的配置 以root身份登陆Linux服务器,编辑/etc目录下的共享目录配置文件exports,指定共享目录及权限等. 执行如下命令编辑文件/etc/exports ...