给定一个长度为 n 的正整数序列 a 1 ...a n . 现在有 m 次操作, 分为两种:

• 1 l r t: 将区间 [l,r] 降序排序 (t = 0) 或升序排序 (t = 1)

• 2 l r: 询问区间 [l,r] 内元素之积的十进制下最高位

雅礼集训的题目,当时因为空间开小了爆零了

先考虑一下询问,我们发现并不好直接做,所以可以对原数取log10,最后询问区间和的小数部分即可

让后现在问题就在修改这里,这是一个非常经典的线段树合并可以解决的问题

每次排序就将对应区间的线段树链接起来,查询的时候断开

所有根节点用一个zkw线段树来存,根节点的值放在一个fenwick里面方便查询

除了精度被卡了一下其他基本一次写对,3k的代码,是本题平均代码长度的一半

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 200010
#define db double
using namespace std;
struct tree{ int l,r,c; double s; } s[N*60];
struct fenwick{db w[N],S; int n;inline void add(int x,db k){ for(;x<=n;x+=x&-x) w[x]+=k; }inline db sum(int x){ for(S=0;x;x&=x-1) S+=w[x]; return S; }
} w;
struct seg{int s[N<<2],M;inline void init(int n){for(M=1;M<n;M<<=1); --M;for(int i=M+1;i<=M+n;++i) s[i]=1;for(int i=M;i;--i) s[i]=s[i<<1]+s[i<<1|1];}inline void insert(int x){ for(x+=M;x;x>>=1) ++s[x]; }inline void remove(int x){ for(x+=M;x;x>>=1) --s[x]; }inline int at(int x){ return s[x+M]; }inline int gPre(int x){for(x+=M;x;x>>=1)if((x&1)&&s[x^1]){for(--x;x<=M;x=(s[x<<1|1]?x<<1|1:x<<1));return x-M;}return -1;}inline int gSuc(int x){for(x+=M;x;x>>=1)if((~x&1)&&s[x^1]){for(++x;x<=M;x=(s[x<<1]?x<<1:x<<1|1));return x-M;}return -1;}
} T;
inline void ps(int x){s[x].c=s[s[x].l].c+s[s[x].r].c;s[x].s=s[s[x].l].s+s[s[x].r].s;
}
int n,m,rt[N],v[N],rev[N],r[N],sa[N],cnt=0;
inline void merge(int& x,int y){if(!y || !x){ x+=y; return; }merge(s[x].l,s[y].l);merge(s[x].r,s[y].r);ps(x);
}
inline void split(int k,int& x,int& y){if(k==0){ x=0; y=x; return; }else if(k==s[x].c) return; y=++cnt;if(s[s[x].l].c>=k){s[y].r=s[x].r; s[x].r=0;split(k,s[x].l,s[y].l);} else {split(k-s[s[x].l].c,s[x].r,s[y].r);}ps(x); ps(y);
}
inline void link(int l,int r,int o){int x=T.gSuc(l); w.add(l,-s[rt[l]].s);for(;~x&&x<=r;x=T.gSuc(x)){w.add(x,-s[rt[x]].s);merge(rt[l],rt[x]);T.remove(x);}w.add(l,s[rt[l]].s); rev[l]=o;
}
inline void cut(int x){if(T.at(x) || x>n) return;int l=T.gPre(x),r=T.gSuc(x); if(r<0) r=n+1;w.add(l,-s[rt[l]].s); T.insert(x);if(!rev[l]) split(x-l,rt[l],rt[x]);else split(r-x,rt[l],rt[x]),swap(rt[l],rt[x]);rev[x]=rev[l]; w.add(l,s[rt[l]].s); w.add(x,s[rt[x]].s);
}
inline void insert(int l,int r,int& x,int k,double p){x=++cnt;if(l==r){ s[x]=(tree){0,0,1,p}; return; }int m=l+r>>1;if(k<=m) insert(l,m,s[x].l,k,p);else insert(m+1,r,s[x].r,k,p);ps(x);
}
inline bool c1(int i,int j){ return v[i]<v[j]; }
inline db g(db x){ return x-(int)x+1e-7; } db p;
int main(){freopen("zkb.in","r",stdin);freopen("zkb.out","w",stdout);scanf("%d%d",&n,&m); w.n=n;for(int i=1;i<=n;++i){scanf("%d",v+i); sa[i]=i;}sort(sa+1,sa+1+n,c1); T.init(n);for(int i=1;i<=n;++i) r[sa[i]]=i;for(int i=1;i<=n;++i){insert(1,n,rt[i],r[i],p=log10(v[i]));w.add(i,p);}for(int o,l,r;m--;){scanf("%d%d%d",&o,&l,&r);if(o==1){scanf("%d",&o);cut(l); cut(r+1); link(l,r,!o);} else {cut(l); cut(r+1);printf("%d\n",(int)floor(pow(10,g(w.sum(r)-w.sum(l-1)))));}
//      for(int i=1;i<=n;++i){//          if(T.at(i)) printf("[%d %d]",i,i+s[rt[i]].c-1);
//
//      }
//          puts("");}
}

Jzoj5605 Zkb相关推荐

  1. hbase developer API 1.22版

    2019独角兽企业重金招聘Python工程师标准>>> 最近用hbase1.22搭了套集群环境,发现之前的测试代码虽然还都能用,但是好多的老的方法,已经是不建议使用了.新的代码在下面 ...

  2. 01 HBase基本概念和hbase shell常用命令用法

    本文转载自:http://archive.cnblogs.com/a/2178064/ 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一 ...

  3. Hbase常用操作(增删改查)

    运行Eclipse,创建一个新的Java工程"HBaseClient",右键项目根目录,选择 "Properties"->"Java Build ...

  4. HBase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  5. Core 定时任务之HangFire

    ASP.NET Core 使用 Hangfire 很简单,首先,Nuget 安装程序包 > install-package Hangfire -pre 然后ConfigureServices添加 ...

  6. 第五章 MyEclipse配置hadoop开发环境

    1.首先要下载相应的hadoop版本的插件,我这里就给2个例子: hadoop-1.2.1插件:http://download.csdn.net/download/hanyongan300/62381 ...

  7. C语言开定时器做呼吸灯程序,简单的基于51单片机定时器上呼吸灯程序

    #include #define ufloat unsigned float #define uchar  unsigned char #define uint   unsigned int ucha ...

  8. SAP销售订单状态修改(审核) 计划行自动产生需求,产生MD04需求

    不知道业务怎么配置的,创建销售单时,一堆计划行类别,什么CN,DN...都有,但是审核后需要计划行变更为CP,这样在MD04才能看到需求. 原有逻辑是弄个后台程序,审核后调一下,更新一下计划行,这样是 ...

  9. 好分数班级等级C_2020高中分数线(广州|深圳|天津|广州|南宁|泉州|龙岩|武汉|沈阳|青岛|汉中|长春|四平|北京等)...

    扫码查看更多分数线信息 2020广州第二批第三批高中分数线 第 说明: 1.表中"户籍生"是指我市户籍的考生,政策性照顾学生与户籍生报考和录取资格相同:"非户籍生&quo ...

  10. c语言内存池中 二维数组,C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    51Testing软件测试网A(@B-BHcSd4l 五.内存池管理内存机制(单链表管理结构)51Testing软件测试网!d"ZpnNr3K8IM;jsx51Testing软件测试网!dB ...

最新文章

  1. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Canvas)
  2. 蚂蚁金服与阿里云宣布启动“蚂云计划”
  3. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)
  4. mysql查询序号低于10前面补个0_mysql 前缀 + 编号 补0
  5. 使用ISAPI_Rewrite对asp.net实现URL重写伪静态
  6. 两个常用的Infopath Service读取域值的函数
  7. 中石化shell_中石化壳牌(江苏)加油站百日攻坚创效分享
  8. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特电磁流量计8732E型的性能规格
  9. 第四天:使用 session cookie redis完善登录验证及登录路由
  10. csdn下载频道积分规则
  11. Simple Faster Rcnn 采坑实录(训练自己的数据集)
  12. Adobe Creative Cloud无法连接至服务器的解决办法
  13. CCRC信息安全服务资质。
  14. 八位硕博大佬的百度之旅~
  15. win7搜索功能失效/win7搜索功能不能使用
  16. 经销商、业务人员和销售提成的三个故事
  17. 一键卸载宝塔Linux面板及运行环境命令
  18. 微信小程序中的页面文件和组件
  19. SpringBoot中使用Mybatis碰到的问题记录
  20. 深度剖析UglifyJS

热门文章

  1. 手把手教你如何巧用Github的Action功能
  2. 【usb】安卓usb网络共享(RNDIS)
  3. 2021新上传QQ透明头像成品+源码
  4. android坐标计算器,函数科学计算器算坐标
  5. 【杂记】收藏的喜欢的句子
  6. Linux下几种定时器的使用
  7. 2021年全球与中国飞机导航镜行业市场规模现状及企业市场份额分析
  8. scrapy 爬取腾讯招聘网
  9. PS怎么用3D功能怎么用?如何用PS做立体字
  10. 吴军老师的《计算之魂》部分重点摘要