$f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并)

我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初始时 $(x=0,y=1)$,然后这样的话就可以将区间分治,然后左右区间合并了.

注意合并的时候要把右区间的分子和分母调换一下.

code:

#include <bits/stdc++.h>
#define N 1000007
#define mod 998244353
#define ll long long
#define lson now<<1
#define rson now<<1|1
#define setIO(s) freopen(s".in","r",stdin)  ,freopen(s".out","w",stdout)
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
struct data
{ll a,b,c,d;   data(int v=0)  { a=1,b=v,c=0,d=1; }       data operator+(const data pp) const {data nw;  data p=pp;   swap(p.a,p.c),swap(p.b,p.d);          nw.a=(a*p.a+b*p.c)%mod;   nw.b=(a*p.b+b*p.d)%mod;    nw.c=(c*p.a+d*p.c)%mod;   nw.d=(c*p.b+d*p.d)%mod;     return nw;    }
}s[N<<2];
void update(int l,int r,int now,int p,int v)
{if(l==r) {s[now]=data(v);       return;  }int mid=(l+r)>>1;  if(p<=mid)  update(l,mid,lson,p,v);  else update(mid+1,r,rson,p,v);  s[now]=s[lson]+s[rson];
}
data query(int l,int r,int now,int L,int R)
{if(l>=L&&r<=R) return s[now];       int mid=(l+r)>>1;  if(L<=mid&&R>mid) return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);  else if(L<=mid) return query(l,mid,lson,L,R);  else return query(mid+1,r,rson,L,R);
}
void build(int l,int r,int now)
{if(l==r) return;  int mid=(l+r)>>1;  build(l,mid,lson),build(mid+1,r,rson);  s[now]=s[lson]+s[rson];
}
int main()
{ // setIO("input");            int k,m,ty,n;            k=rd(),m=rd(),ty=rd();   n=k+m;  build(1,n,1);    for(int i=1;i<=k;++i)   {int x=rd();    update(1,n,1,i,x);    }                  int ansx=0,ansy=0;                for(int i=1;i<=m;++i) {int op=rd(),x,l,r;  if(op==1) {      x=rd(); if(ty==1) x^=(ansx^ansy);      ++k,update(1,n,1,k,x);    }   else {  l=rd(),r=rd();    if(ty==1) l^=(ansx^ansy);      if(ty==1) r^=(ansx^ansy);       data p=query(1,n,1,l,r);    ansx=p.b,ansy=p.d;    printf("%d %d\n",ansx,ansy);  }}     return 0;
}

  

LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树相关推荐

  1. LOJ #510. 「LibreOJ NOI Round #1」北校门外的回忆(倍增+动态开点线段树)

    题目 这个题是一个精彩的分析性质区间离散的问题 真的详细 维护链真的一绝. LOJ\rm LOJLOJ最短ACCode\rm AC \ CodeAC Code #include<bits/std ...

  2. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  3. 【LOJ573】「LibreOJ NOI Round #2」单枪匹马(矩阵乘法)

    传送门 题解: 注意到分子分母每次无非就是交换位置然后分母加上分子的若干倍. 把这个转移写成矩阵的形式,求个逆,维护一下矩阵和矩阵的逆的前缀积就行了. 代码: #include<bits/std ...

  4. 「LibreOJ NOI Round #2」单枪匹马

    题目 通过这道题成功发现我不会矩乘 答案是一个连分数,看起来不像是一般的数据结构能做的样子,设\(x_{l,r},y_{l,r}\)分别表示\([l,r]\)询问的分子和分母 于是有 \[\frac{ ...

  5. 【LOJ573】「LibreOJ NOI Round #2」单枪匹马

    [题目链接] 点击打开链接 [思路要点] 见 官方题解 .(反正也是我写的) 时间复杂度 O(N+M)O(N+M)O(N+M) . [代码] #include<bits/stdc++.h> ...

  6. 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)

    description 戳我看题目哦 solution 有一道非常相似的题目 一棵树,每条边限制两个端点的大小关系(限制 a[u]>a[v]a[u]>a[v]a[u]>a[v] 或 ...

  7. 【LOJ574】「LibreOJ NOI Round #2」黄金矿工

    [题目链接] 点击打开链接 [思路要点] 可参考 官方题解 . 以下为笔者个人的见解,方便起见,下称矿工为老鼠,金矿为洞. 我们可以对洞的权值加上深度,老鼠的权值减去深度,从而不需要考虑树的边权. 考 ...

  8. LOJ#538. 「LibreOJ NOIP Round #1」数列递推

    description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从000开始,无限长的整数列ai{a_{i ...

  9. LOJ#539. 「LibreOJ NOIP Round #1」旅游路线

    n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...

最新文章

  1. HandlerInterceptor里@Autowired对象为空的解决方法
  2. 红帽linux lnmp搭建,Linux(redhat5.4)下lnmp环境的搭建
  3. 2020-12-11 Python中的 if __name__ == “__main__“
  4. 吴恩达深度学习笔记7-Course2-Week3【超参数调试、Batch 正则化和程序框架】
  5. 从接触FPGA开始...
  6. 更新项目经常使用的Linux命令
  7. 【数据结构与算法】之深入解析“最好买卖股票的时机含冷冻期”的求解思路与算法示例
  8. java环境变量设置的作用_JDK环境变量的配置及作用
  9. 如何创建新的SAP CRM middleware subscription
  10. MyIbatis :不使用XML和注解@Mapper以及MapperScan
  11. js 回调函数 精析
  12. 读书笔记_中国期货市场量化交易(李尉)05
  13. mysql导入txt linux_Linux中将txt导入到mysql的方法教程
  14. 华为BFD的配置规范
  15. android 游戏 柄,Android手柄游戏中心-葡萄游戏厅
  16. django restframework serializer 增加自定义字段
  17. round函数与roundup函数
  18. Android应用内设置多语言,可随系统语言改变而改变,也可设置app为固定语言不受系统语言影响
  19. php 文字水印换行,thinkPHP5图片加文字水印实现换行的方法
  20. shell awk监控磁盘使用率

热门文章

  1. list redis 怎样做排行_Redis中5种数据结构的使用场景介绍
  2. 邵阳学院大学计算机基础实验报告答案,实验报告正文(大学计算机基础)
  3. Netgear R6220刷潘多拉盒子后的配置,提高网速
  4. dcc-garch matlab,dcc-garch原理简介和模型实现
  5. 涨知识!原来中国南海岛礁竟有这么诗情画意的名字!
  6. 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
  7. C语言制作游戏——贪吃蛇
  8. 2019年下半年教师资格幼儿园《保教知识与能力》真题与参考答案
  9. macbook电脑连接Wi-Fi网速慢
  10. 想要4个9?本文告诉你监控告警如何做