LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树
$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」单枪匹马 线段树相关推荐
- LOJ #510. 「LibreOJ NOI Round #1」北校门外的回忆(倍增+动态开点线段树)
题目 这个题是一个精彩的分析性质区间离散的问题 真的详细 维护链真的一绝. LOJ\rm LOJLOJ最短ACCode\rm AC \ CodeAC Code #include<bits/std ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- 【LOJ573】「LibreOJ NOI Round #2」单枪匹马(矩阵乘法)
传送门 题解: 注意到分子分母每次无非就是交换位置然后分母加上分子的若干倍. 把这个转移写成矩阵的形式,求个逆,维护一下矩阵和矩阵的逆的前缀积就行了. 代码: #include<bits/std ...
- 「LibreOJ NOI Round #2」单枪匹马
题目 通过这道题成功发现我不会矩乘 答案是一个连分数,看起来不像是一般的数据结构能做的样子,设\(x_{l,r},y_{l,r}\)分别表示\([l,r]\)询问的分子和分母 于是有 \[\frac{ ...
- 【LOJ573】「LibreOJ NOI Round #2」单枪匹马
[题目链接] 点击打开链接 [思路要点] 见 官方题解 .(反正也是我写的) 时间复杂度 O(N+M)O(N+M)O(N+M) . [代码] #include<bits/stdc++.h> ...
- 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)
description 戳我看题目哦 solution 有一道非常相似的题目 一棵树,每条边限制两个端点的大小关系(限制 a[u]>a[v]a[u]>a[v]a[u]>a[v] 或 ...
- 【LOJ574】「LibreOJ NOI Round #2」黄金矿工
[题目链接] 点击打开链接 [思路要点] 可参考 官方题解 . 以下为笔者个人的见解,方便起见,下称矿工为老鼠,金矿为洞. 我们可以对洞的权值加上深度,老鼠的权值减去深度,从而不需要考虑树的边权. 考 ...
- LOJ#538. 「LibreOJ NOIP Round #1」数列递推
description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从000开始,无限长的整数列ai{a_{i ...
- LOJ#539. 「LibreOJ NOIP Round #1」旅游路线
n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...
最新文章
- HandlerInterceptor里@Autowired对象为空的解决方法
- 红帽linux lnmp搭建,Linux(redhat5.4)下lnmp环境的搭建
- 2020-12-11 Python中的 if __name__ == “__main__“
- 吴恩达深度学习笔记7-Course2-Week3【超参数调试、Batch 正则化和程序框架】
- 从接触FPGA开始...
- 更新项目经常使用的Linux命令
- 【数据结构与算法】之深入解析“最好买卖股票的时机含冷冻期”的求解思路与算法示例
- java环境变量设置的作用_JDK环境变量的配置及作用
- 如何创建新的SAP CRM middleware subscription
- MyIbatis :不使用XML和注解@Mapper以及MapperScan
- js 回调函数 精析
- 读书笔记_中国期货市场量化交易(李尉)05
- mysql导入txt linux_Linux中将txt导入到mysql的方法教程
- 华为BFD的配置规范
- android 游戏 柄,Android手柄游戏中心-葡萄游戏厅
- django restframework serializer 增加自定义字段
- round函数与roundup函数
- Android应用内设置多语言,可随系统语言改变而改变,也可设置app为固定语言不受系统语言影响
- php 文字水印换行,thinkPHP5图片加文字水印实现换行的方法
- shell awk监控磁盘使用率
热门文章
- list redis 怎样做排行_Redis中5种数据结构的使用场景介绍
- 邵阳学院大学计算机基础实验报告答案,实验报告正文(大学计算机基础)
- Netgear R6220刷潘多拉盒子后的配置,提高网速
- dcc-garch matlab,dcc-garch原理简介和模型实现
- 涨知识!原来中国南海岛礁竟有这么诗情画意的名字!
- 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
- C语言制作游戏——贪吃蛇
- 2019年下半年教师资格幼儿园《保教知识与能力》真题与参考答案
- macbook电脑连接Wi-Fi网速慢
- 想要4个9?本文告诉你监控告警如何做