首页 > TAG信息列表 > SPOJ

SPOJ-CAPCITY Capital City

Capital City tarjan 缩点 缩点之后,找到 DAG 图中唯一一个出度为 \(0\) 的点,如果有多个,说明不成立 #include <iostream> #include <cstdio> #include <algorithm> #include <stack> #include <queue> #include <vector> using namespace std; const int maxn = 2e

spoj day1-2

A.国王的游戏 https://www.luogu.com.cn/problem/P1080 题意: 国王和n个大臣分别在左右手写下一个数,,从国王开始按一定顺序,每个大臣获得金币数为其前面包括国王左手的数的乘积除以自己右手写的数,求大臣最多获得金币数的最小值 思路: 这个贪心不是那么容易贪出来。考虑相邻两个大臣i

SPOJ-QTREE3 Query on a tree again!

Query on a tree again! 树链剖分 + 二分 通过树链剖分查找,判断一下路径上,最后一个黑点出现在哪一条链上,然后在链上进行二分 dfn 查找第一个黑点所在位置 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; const int maxn = 1

SPOJ-DQUERY D-query

D-query 区间内,有多少个不同的数 莫队 模板题 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; #define endl '\n' const int maxn = 3e4 + 10; const int maxm = 2e5 + 10; int cnt[1000010], num[m

【SPOJ】32952 ADAFTBLL(树上带修莫队)

原题链接 题意 给定一棵 \(n\) 个点的数,每个点都有一个权值。给出 \(q\) 次操作,有两种操作类型。 \(1.\) 给出 \(x\) 和 \(y\),将点 \(x\) 的权值修改为 \(y\)。 \(2.\) 给出点 \(u\) 和 \(v\),令 \(s\) 表示每一种从 \(u\) 号节点到 \(v\) 号节点出现的权值的次数,输出 \(\sum \dfra

SPOJ KPSUM - The Sum题解

题目链接 Luogu Hydro OJ SPOJ 题目描述 给定一个正整数\(n(n \le 10^{15})\),将1到n之间的所有数按照十进制排成一排,并在相邻两个数字之间加上交错的正负号(1的前面为正号),求该表达式的值 分析 考虑对每个数进行分析,我们不难发现以下性质 对于每个数,考虑一个值为这个数的第一个数

[题解] SPOJ GSS1 - Can you answer these queries I

[题解] SPOJ GSS1 - Can you answer these queries I · 题目大意 要求维护一段长度为 \(n\) 的静态序列的区间最大子段和。 有 \(m\) 次询问,每次询问输出区间 \([L,R]\) 的最大子段和。 \(|a[i]| \leq 15007\),\(1 \leq m,n\leq5\times10^4\) · 解题思路 首先想到如果用线段树的

SPOJ-ADAINDEX题解

题面 题意: 给出 \(n\) 个字符串和 \(q\) 个询问,对于每一个询问,求出以询问串为前缀的字符串的个数。 看到了“前缀”,所以立即想到了用 trie 树。 读入字符串时,把每个字符串插进树里,插入的过程中,我们对于每个节点维护一个 tag ,对于每一个经过的节点,就将他的 tag \(+1\) 。 这样跑完

spoj Corporative Network

题目描述 原本有 n 个节点,最初每个节点的父亲都是自己。 现在给你若干操作,共分为两种,操作格式如下: I x y(大写字母I) 将 x 的父亲变为 y,而且令 x 与 y 之间的距离为 \(\lvert x-y \rvert \bmod 1000\) 。 E x 询问x点到其根节点的距离 数据保证对于所有的 1 操作合法,即保证之前 y 不

SPOJ - UNTITLE1 Untitled Problem II

目录题目解法代码 题目 传送门 解法 考虑一次操作 \((0,x,y,k)\) 对前缀和 \(s_i\) 的影响: \[\Delta =\begin{cases} k\cdot(i-x+1), & x\le i\le y \\k\cdot (y-x+1), & i>y\end{cases} \]先给每个下标设定一个 \(c_i\) 表示增加的定值,\(k_i\) 表示增加的 \(i\) 的系数。 那么询

SPOJ ABCDEF题解

题面 源 OJ 未 AC(卡 \(map\) ,不想写 \(hash\) )。 看到 \(n \leq 100\) ,显然 \(O(n^6)\) 会挂掉,所以要优化。 考虑到原式可化为 \(a \times b + c = d \times (e+f)\) ,所以可以分别枚举 \(a,b,c\) 和 \(d,e,f\) ,然后合在一起。 这样我们就要记录这个算出来的 \(d \times (e+f)\) 在

Count on a tree SPOJ - COT

原题链接 考察:主席树 写错了LCA的板子,debug几个小时... 思路:   和在一维数组上建立主席树不同,树上建主席树是以父节点为上一个版本,这里求(u,v)的第k小值,实际就是: \[tr[u].cnt+tr[v].cnt-tr[lca].cnt-tr[fa[lca]].cnt \]  写得比较繁琐,实际bfs和dfs可以只用一个 Code #

BZOJ2226. [Spoj 5971] LCMSum

【题意】   【分析】 这个就是推一波式子    最后这个式子的转换比较套路 【代码】 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+5; int np[maxn],p[maxn],cnt,phi[maxn]; void init() { phi[1]=1; for(int i=2;i<max

SPOJ PRIME1 - Prime Generator(线性筛)

Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate all prime numbers between two given numbers! Input The input begins with the number t of test cases in a single line (t<=10). In each of the next t line

SPOJ DQUERY - D-query (树状数组求区间种类数)

https://www.spoj.com/problems/DQUERY/ 求区间种类数 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1000000; const int MAXM = 30010; struct Q{ int l, r, id; }ask[MAXN]; int c[MAXN + 10], a[MAXM], last[MAXN + 10]; voi

Longest Common Substring SPOJ - LCS(后缀自动机)

题目链接 题意:求两个串的最长公共子串长度 思路:对a串建sam,b串跑 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn=250010; char s[maxn]; struct Suffix_Automaton{ //basic int nxt[maxn*2][26], fa[maxn*2], l[maxn*2]; int l

SPOJ REPEATS - Repeats - 后缀数组

求一个字符串内重复次数最多的连续字串。 Solution 丢一个hihocoder的链接 先考虑如何如何求一个串给定的串的最大重复次数,枚举一个可能的循环节长度 (l),然后求原串和原串去掉前 (l) 个字符后两个串的 (lcp)(最长公共前缀),如果能完全匹配上,就是一个循环节,且循环次数为 (lcp(l,i)/l +

SPOJ 3267 DQUERY - D-query

题目大意 对于一个数列 \(\left\{a_n\right\}\) , 有 \(q\) 次询问,第 \(i\) 次询问格式为 \(l_i,r_i\) , 求 \(a_{l_i},a_{l_i + 1},a_{l_i + 2},\dots,a_{r_i}\) 中有多少不同的数。 其中, \(1 \leq n \leq 3 \times 10^4\) , \(1 \leq q \leq 2 \times 10^5\) , \(1 \leq a_i \l

【SPOJ – REPEATS】 后缀数组【连续重复子串】

字体颜色如何 字体颜色 SPOJ - REPEATS 题意 给出一个字符串,求重复次数最多的连续重复子串。 题解 引自论文-后缀数组——处理字符串的有力工具。 解释参考博客 “S肯定包括了字符r[0], r[L], r[L * 2],r[L * 3], ……中的某相邻的两个” 由于当前S是有两个长度为L的连续重复子

SPOJ 5973 【SELTEAM - Selecting Teams】

前置芝士 二项式定理,组合数 正文 二项式定理 \[(x+y)^n=\sum_{i=0}^{n} \binom{n}{i}x^{n}y^{n-i}\] 带入\(x=y=1\),得 \[2^n=\sum_{i=0}^{n}\binom{n}{i}\] 转化 首先转化,考虑枚举人数,然后先取队长,剩下任意 取。 答案即为 \[\sum_{i=1}^{k}i\binom{n}{i} \sum_{j=0}^{i-1}\bi

·Balanced Numbers SPOJ - BALNUM

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mem(a,b) memset(a,b,sizeof(a)) #define inf 0x3f3f3f3f typedef long long LL; const LL mod=1e9+7; const int M=13; using namespace std; const int N =1e

SPOJ 3267

https://vjudge.net/problem/SPOJ-DQUERY 求区间内不重复的数的个数。 扫描数列建立可持久化线段树,第i个数若第一次出现,则在线段树中的位置i加1;若不是第一次出现,将上次出现的位置减1,在本次位置加1。 对于每个询问的区间 [L,R],在第R个版本上的线段树只有前R个数,在线段树上查询位置L

SPOJ Transposing is Even More Fun

  直接交换需要的次数为 $2^{a+b}$,如果有 $k$ 个循环,每个循环元素为 $x$ 个,只需要交换 $x-1$ 次,那么最后次数就是 $2^{a+b}-k$,本质就是求有多少个循环。一个位置 $(x,y)$ 看成二进制的形式。例如 $a=3, b=2$,位置 $(3,2)$ 看成二进制就是 $011 10$,交换后就是 $10011$,右移了 $b=2$

SPOJ - Triple Sums

  【传送门】 FFT第一题! 构造多项式 $A(x) = \sum x ^ {s_i}$。 不考虑题目中 $i < j < k$ 的条件,那么 $A^3(x)$ 每一项对应的系数就是答案了。  考虑容斥。 $$(\sum x)^3 = \sum x^3 + 3 \sum x^2 y + 6\sum xyz$$ $$(\sum x^2) (\sum x)= \sum x^3 + \sum x^2 y$$ 所以 $$\sum

SPOJ - LCS2 (后缀自动机)

题意 给若干个串,求这些串最长公共子串的长度。 传送门 思路 后缀自动机求lcs模版题。 Code #include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; struct Pam { int len[maxn], link[maxn]; int nxt[maxn][26]; int last, tot; int mx[max