首页 > TAG信息列表 > TJOI2018

洛谷 P4588 [TJOI2018]数学计算

传送门 Description 现在有一个数 \(x\),初始值为 \(1\)。有 \(Q\) 次操作,操作有两种: \(1\) \(m\):将 \(x\) 变为 \(x \times m\),并输出 \(x \bmod M\) \(2\) \(pos\):将 \(x\) 变为 \(x\) 除以第 \(pos\) 次操作所乘的数(保证第 \(pos\) 次操作一定为类型 \(1\),对于每一个类型 \(1\)

[TJOI2018]智力竞赛

洛谷题面 题目大意 给出一个 \(n\) 个点的带权有向图 \(G\),选出 \(m+1\) 条链,问能否全部点覆盖,如果不能,问 不能 覆盖的点权最小值最大是多少。 (这里的 \(n,m\) 和原题是反着的) 题目分析 其实就是求 \(\verb!DAG!\) 的最小可重复路径点覆盖。我们可以先将这个图传递闭包,求出两个点

P4588 [TJOI2018]数学计算 题解

题面 考虑把操作时间当作下标建立线段树,每次操作要么是单点修改为 \(x\),要么是修改为 \(1\)。输出答案就是输出线段树根节点的答案。 点击查看代码 #include<iostream> #include<cstdio> using namespace std; const int N=1e5+13; int mod,pos[N]; struct SegTree{int l,r,mul;}

[TJOI2018]异或

link 可持久化Trie初学笔记。今天写可持久化数据结构都写烦了。 可持久化Trie长得和主席树颇有几分神似,都是一排根节点然后下面一堆纵横交错的边相互连接(也是,可持久化数据结构的功能注定了它们只能长成这幅模样)。 说回本题。为了实现可持久化,考虑加入一个字符串可能会对Trie造成什

P4588 [TJOI2018]数学计算

#include <bits/stdc++.h> #define LL long long using namespace std; const int N = 2e5 + 10; int T, n, m, p; int w[N]; struct node { int l, r; int mul; }tr[N << 2]; void pushup(int u) { tr[u].mul = (LL)tr[u << 1].mul * tr[u <

[解题记录] P4588 [TJOI2018]数学计算

P4588 [TJOI2018]数学计算 题意简述 小豆现在有一个数 \(x\),初始值为 \(1\)。小豆有 \(Q\) 次操作,操作有两种类型: 1 m:将 \(x\) 变为 \(x \times m\),并输出 \(x \bmod M\) 2 pos:将 \(x\) 变为 \(x\) 除以第 \(pos\) 次操作所乘的数(保证第 \(pos\) 次操作一定为类型 \(1\),对于每一个

[TJOI2018]游园会

游园会 题解 相当有趣的一个 d p dp dp。 首先看到 K ⩽ 15

[TJOI2018] 游园会

一、题目 点此看题 二、解法 考虑字符串计数 \(dp\) 的常见模型,设 \(dp(i,...,k)\) 表示已经填入了 \(i\) 个字符,现在串已经匹配到了 \(\tt NOI\) 长度为 \(k\) 的前缀,那么我们还需要把最长公共子序列记录到状态里面。 考虑最长公共子序列的求法是普通 \(dp\),设 \(f(i,j)\) 表示考

P4588 [TJOI2018]数学计算

Jennie 显然可以模拟,但是谁会喜欢写高精和逆元呢? 需要撤销乘法操作,该怎么做呢 如果说一个个乘法结合起来的话,那么撤销就是把一个数变成1 那么就是一个线段树的问题了 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define int long long using nam

题解 【洛谷 P4588 [TJOI2018]数学计算】

\(\large\mathcal{Description}\) 有一个数 \(x\),初始值为 \(1\). 有 \(Q\) 次操作,操作有两种类型: 1 m:将 \(x\) 变为 \(x \times m\),并输出 \(x \bmod M\). 2 pos:将 \(x\) 变为 \(x\) 除以第 \(pos\) 次操作所乘的数(保证第 \(pos\) 次操作一定为类型 \(1\),对于每一个类型 \(1\)

P4588 [TJOI2018]数学计算 题解

Link P4588 [TJOI2018]数学计算 Solve 这道题初看没什么想法,然后想到每次去除一个以前出现过的数也许就等于撤销操作,然后每次只改动一个数,线段树就可以很好的完成这个效果,然后就是一个水题了,代码实现起来也不难 拿时间为线建一颗线段树,然后每次修改第\(i\)号位置上的值,最后求和的

P4588 [TJOI2018]数学计算(线段树)

传送门 题目描述: 小豆现在有一个数 x,初始值为 1。小豆有 Q 次操作,操作有两种类型: 1 m:将x变为x乘m,并输出x%M 2 pos:将 x变为 x除以第 pos 次操作所乘的数(保证第 pos次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),并输出 x%M。 思路:操作二需要我们对之前的操

[TJOI2018]碱基序列

[TJOI2018 碱基序列](https://www.luogu.com.cn/problem/P4591) 偷懒直接 SAM 上 DP。 设 dp(i,j) 表示用前 i 行氨基酸匹配到状态 j 的方案数。 由于这个题面比较玄学, 复杂度就挺玄学, 随手加点剪枝就可以很快。 ```cpp #include <bits/stdc++.h> typedef long long LL; using

[TJOI2018] 数学计算

题目 原题地址 解说 每次操作看成一个点,用线段树维护区间的积,没什么可说的。 代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int Q=1e5+5; inline ll read(){ ll X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();}

「TJOI2018」智力竞赛

题解就是求可重路径覆盖之后最大化剩余点的最小权值二分答案后就是一个可重复路径覆盖处理出可达点做二分图匹配就好了 #include<cstdio> #include<cstring> #include<algorithm> #define gc getchar() #define pc putchar inline int read() { int x = 0,f = 1; char c

P4591 [TJOI2018]碱基序列 [SAM,dp]

SAM 上面 dp 就好了QAQ。 // clang-format off // powered by c++11 // by Isaunoya #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=(x);i<=(y);++i) #define Rep(i,x,y) for(register int i=(x);i>=(y);--i) using namespace std;using db=double;us

[TJOI2018]数学计算(线段树)

这可以算作线段树的一道入门题。 我们构建一棵范围$[1, Q]$的线段树。 每个叶节点对应一次操作。 每个节点的权值对应其区间积。 每有一次$1$操作我们就把对应的位置(第几次操作)改成相应的值然后维护线段树。 设当前是第$p$次操作,则查询输出$[1, p]$的积即可。 而$2$操作时我们先把

【题解】hdu4757 【TJOI2018】异或

题目链接 题目大意:有一颗树,有点权,每次询问:一条路径\(x->y\)中与\(z\)异或的最大值,或是以\(x\)为根的子树中与\(y\)异或的最大值。 树剖……还是算了。 观察到,子树的\(dfn\)序是连续的一段区间。于是我们可以预处理\(dfs\)序来解决这个问题。 第二问,我们可以求两点的最近公共祖先,做

#线段树#洛谷 4588 [TJOI2018]数学计算

题目传送门 分析 由于曾经做过原题 所以就直接说了,因为每个数最多被除掉一次 所以可以用线段树维护区间乘,也就很简单了,删除就单点修改就行了 代码 #include <cstdio> #include <cctype> #define rr register using namespace std; int Q,mod,w[400011]; inline signed iut(){

[TJOI2018]数学计算(线段树)

题目描述 因为我在学校做过类似的题,所以这题一眼秒了 这题我们首先会想到乘法逆元,但发现不太可做。 这时我们仔细考虑平衡树,发现我们可以按照操作得到一个数组。最后通过线段树查询所有数的乘积。 对于操作1,我们可以将数组第iii个数由1变为xxx 对于操作2,我们可以将数组第iii

P4588 [TJOI2018]数学计算

题意 考虑一个操作会对一段时间内的询问产生影响,于是将线段树上的这段时间打上乘这个数的标记,最后dfs整颗线段树。 code: #include<bits/stdc++.h> using namespace std; #define int long long #define ls(p) (p<<1) #define rs(p) (p<<1|1) const int maxn=100010; int T,n,mod;

并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎

题目大意 题目链接 题解 先将\(a\)排序。 \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上;而当\(a_m=n\)时,最后一段连续段不用算。 考虑进行游戏的过程:设当前最大血量为\(p\),正在打出第\(q\)张亵渎,那么得到的分数是

题解——[TJOI2018]数学计算

题解——[TJOI2018]数学计算 我真的没看出来这是线段树 题面搬运 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型: 1 m: x = x * m ,输出 x%mod; 2 pos: x = x / 第pos次操作所乘的数(保证第pos次操作一定为类型1,对于每一个类型1 的操作至多会被除一次),输出x%mod 一共

bzoj5337 [TJOI2018]str 后缀自动机

传送门 原串建立后缀自动机。用输入的串在上面跑DP。 f[i][j]f[i][j]f[i][j]表示已经确定了前iii个氨基酸,并且当前在后缀自动机的jjj节点上 的方案数。 那么我们假设之前iii个氨基酸已经确定,而现在输入了一个串TTT,我们考虑暴力从自动机上的每个节点开始按照TTT往下走。 假设

[TJOI2018]教科书般的亵渎

题目链接:点这里 Solution: 我们推导一下,不难得出它让我们求的东西,我们可以发现杀死所有的随从需要\(m+1\)张亵渎 设\(S(x)=\sum_{i=1}^x i^{m+1}\),则题目要求的答案计算式为: \[ F(x)=\sum_{j=0}^m \sum_{i=j+1}^{m+1}S(a_i-a_j-1)-S(a_{i-1}-a_j) \] 特别的,我们令\(a_{m+1}=n+1\)