【LOJ#573】【LNR#2】单枪匹马(线段树)

题面

LOJ

题解

考虑拿线段树维护这个值,现在的问题就是左右怎么合并,那么就假设最右侧进来的那个分数是\(\frac{x}{y}\)的形式,那么就可以维护一下每一个值的系数,就可以直接合并了。

我代码又臭又长,还写得贼复杂

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define MOD 998244353
  5. #define MAX 1000500
  6. #define lson (now<<1)
  7. #define rson (now<<1|1)
  8. inline int read()
  9. {
  10. int x=0;bool t=false;char ch=getchar();
  11. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  12. if(ch=='-')t=true,ch=getchar();
  13. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  14. return t?-x:x;
  15. }
  16. int n,m,type,a[MAX],N,MX;
  17. struct Num{int a,b,c;};
  18. Num operator+(Num a,Num b){return (Num){(a.a+b.a)%MOD,(a.b+b.b)%MOD,(a.c+b.c)%MOD};}
  19. Num operator*(Num a,int b){return (Num){1ll*a.a*b%MOD,1ll*a.b*b%MOD,1ll*a.c*b%MOD};}
  20. struct Fact{Num a,b;};
  21. Fact operator+(Fact a,int b){return (Fact){a.b*b+a.a,a.b};}
  22. Fact Rev(Fact a){return (Fact){a.b,a.a};}
  23. Fact Value(Fact a,int x,int y)
  24. {
  25. int u=(1ll*a.a.a*x+1ll*a.a.b*y+a.a.c)%MOD;
  26. int v=(1ll*a.b.a*x+1ll*a.b.b*y+a.b.c)%MOD;
  27. return (Fact){(Num){0,0,u},(Num){0,0,v}};
  28. }
  29. struct Node{Fact s,v;}t[MAX<<2];
  30. Node Calc(Node l,Node r)
  31. {
  32. Node ret;swap(r.v.a,r.v.b);swap(r.s.a,r.s.b);
  33. ret.s=Value(l.v,r.s.a.c,r.s.b.c);
  34. Num a=(Num){(1ll*l.v.a.a*r.v.a.a+1ll*l.v.a.b*r.v.b.a)%MOD,(1ll*l.v.a.a*r.v.a.b+1ll*l.v.a.b*r.v.b.b)%MOD,(1ll*l.v.a.a*r.v.a.c+1ll*l.v.a.b*r.v.b.c+l.v.a.c)%MOD};
  35. Num b=(Num){(1ll*l.v.b.a*r.v.a.a+1ll*l.v.b.b*r.v.b.a)%MOD,(1ll*l.v.b.a*r.v.a.b+1ll*l.v.b.b*r.v.b.b)%MOD,(1ll*l.v.b.a*r.v.a.c+1ll*l.v.b.b*r.v.b.c+l.v.b.c)%MOD};
  36. ret.v=(Fact){a,b};
  37. return ret;
  38. }
  39. void Modify(int now,int l,int r,int p)
  40. {
  41. if(l==r)
  42. {
  43. t[now].s=(Fact){(Num){0,0,a[l]},(Num){0,0,1}};
  44. t[now].v=(Fact){(Num){1,0,0},(Num){0,1,0}}+a[l];
  45. return;
  46. }
  47. int mid=(l+r)>>1;
  48. if(p<=mid)Modify(lson,l,mid,p);
  49. else Modify(rson,mid+1,r,p);
  50. t[now]=Calc(t[lson],t[rson]);
  51. }
  52. Node Query(int now,int l,int r,int L,int R)
  53. {
  54. if(L==l&&r==R)return t[now];
  55. int mid=(l+r)>>1;
  56. if(R<=mid)return Query(lson,l,mid,L,R);
  57. if(L>mid)return Query(rson,mid+1,r,L,R);
  58. return Calc(Query(lson,l,mid,L,mid),Query(rson,mid+1,r,mid+1,R));
  59. }
  60. int main()
  61. {
  62. n=read();m=read();type=read();N=n+m;MX=n;
  63. for(int i=1;i<=n;++i)a[i]=read(),Modify(1,1,N,i);
  64. for(int i=1,lans=0;i<=m;++i)
  65. {
  66. int opt=read();
  67. if(opt==1)
  68. {
  69. int x=read();if(type==1)x^=lans;
  70. a[++MX]=x;Modify(1,1,N,MX);
  71. }
  72. else
  73. {
  74. int l=read(),r=read();
  75. if(type==1)l^=lans,r^=lans;
  76. Node u=Query(1,1,N,l,r);
  77. printf("%d %d\n",u.s.a.c,u.s.b.c);
  78. lans=u.s.a.c^u.s.b.c;
  79. }
  80. }
  81. return 0;
  82. }

【LOJ#573】【LNR#2】单枪匹马(线段树)的更多相关文章

  1. 【LOJ#6029】市场(线段树)

    [LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...

  2. 【Loj#535】花火(线段树,扫描线)

    [Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...

  3. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  4. LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...

  5. LOJ.2864.[IOI2018]排座位(线段树)

    LOJ 洛谷 先令编号从\(1\)开始.我们要求\([1,i]\)这些数字能否构成一个矩形. 考虑能否用线段树维护,让每个叶子节点\(i\)表示前\(i\)个数能否构成矩形. 一种方法是维护前\(i\ ...

  6. [loj#2005][SDOI2017]相关分析 _线段树

    「SDOI2017」相关分析 题目链接:https://loj.ac/problem/2005 题解: 把上面的式子拆掉,把下面的式子拆掉. 发现所有的东西都能用线段树暴力维护. 代码: #inclu ...

  7. [LOJ#2980][THUSCH2017]大魔法师(线段树+矩阵)

    每个线段树维护一个行向量[A,B,C,len]分别是这个区间的A,B,C区间和与区间长度,转移显然. 以及此题卡常,稍微哪里写丑了就能100->45. #include<cstdio> ...

  8. @loj - 2093@ 「ZJOI2016」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...

  9. @loj - 3043@「ZJOI2019」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...

  10. 【LOJ】#3043. 「ZJOI2019」线段树

    LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...

随机推荐

  1. cf 01mst

    https://codeforces.com/contest/1243/problem/D 题意是说:给一个图对吧,然后给出点与点的关系,边权为1,没有给出的点与点关系,则这两点边权为0,求出最小生成 ...

  2. 小程序-picker组件选择数量

    <!-- detail.wxml --> <view class="picker"> <picker range="{{range}}&qu ...

  3. Python 变量与运算符

    变量 基本概念: 1. 变量,名字,数据的唯一标识2.变量命名: 字母.数字.下划线: 不能以数字开头: 区分大小写: 不能使用保留字和关键字: 命名要有意义:(多个单词时,推荐使用下划线连接) 3. ...

  4. Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=UTF

    今天在使用springboot整合SSM的时候,配置好以后启动项目,报了一个这样的异常 java.sql.SQLNonTransientConnectionException: Cannot load ...

  5. ubuntu16搭建文件服务器

    这篇记录,如何在ubuntu16 安装 FastDFS 文件服务器,详细步骤 环境依赖 apt-get install make apt-get install unzip apt-get insta ...

  6. java 与 iOS 平台概念比较

    java oc/swift jvm iphone jre runtime? jdk ios SDK spring xcode 生成的应用模版 服务器(tomcat) 系统的事件调度派发部分 class ...

  7. Hbase如何批量删除指定数据

    有时我们需要批量删除一些hbase中符合某些条件的数据,本文提供一种简单的shell命令的方式批量删除hbase里的数据.思路就是,建立hive与hbase的关联表,通过hive sql查询出符合条件 ...

  8. Maven学习 --- <distributionManagement>

    在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的, ...

  9. JavaScript中的this绑定丢失及解决方法

    经常犯的错误:混淆了this绑定规则. 代码如下: var obj = { id: 'vexekefo', cool() { console.log(this.id); } }; var id = ' ...

  10. Dojo.declare使用方法详解

    ArcGIS API for JavaScript是基于dojo开发的一套API,在实际生产中,我们需要再根据自己的需求实现自定义的功能,最后抽象成接口给前端调用. 我们使用dojo的declare来 ...