JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
来源:互联网 发布:淘宝昵称怎么修改 编辑:程序博客网 时间:2024/04/30 12:05
题目大意
给定一个长度小于等于
一下为两个例子:
给定每组
解题思路
首先一个显然的性质,对于当前的字符串,在第
照着这个思路我们只需每次找出字符串的第
现在就又遇到了两个问题,以一个是怎么找到第
最后输出时扫一遍就可以了。
程序
//YxuanwKeith#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 1e5 + 5, MAXM = 5e3 + 5, MAXK = 3e6 + 5;struct Node { int l, r; Node(int a, int b) {l = a, r = b;} Node() {}};bool flag[MAXK];Node D[MAXM], Coor[MAXK];char S[MAXK], T[MAXK];int n, k, len, top, l[MAXM], r[MAXM], ord[MAXK], lst[MAXK], deep[MAXK];int Get(int s) { int get = 0; for (int j = 2; j <= top; j ++) { if (get + D[j].l - 1 - D[j - 1].r >= s) { return D[j - 1].r + s - get; break; } else get += D[j].l - 1 - D[j - 1].r; } return 0;}int Find(int x) { if (ord[x] == x) return x; ord[x] = Find(ord[x]); return ord[x];}void Merge(int x, int y) { int fx = Find(x), fy = Find(y); if (fx == fy) return; if (deep[fx] > deep[fy]) swap(fx, fy); ord[fx] = fy; Coor[fy] = Node(min(Coor[fx].l, Coor[fy].l), max(Coor[fx].r, Coor[fy].r)); if (deep[fx] == deep[fy]) deep[fy] ++;}void Maketag(int p) { flag[p] = 1; if (flag[p - 1]) Merge(p, p - 1); if (flag[p + 1]) Merge(p, p + 1);}int Next(int s) { int p = s + 1; while (p <= k && flag[p]) p = Coor[Find(p)].r + 1; if (p > k || flag[p]) return 0; return p;}int main() { scanf("%s", S + 1); len = strlen(S + 1); scanf("%d%d", &k, &n); for (int i = 1; i <= n; i ++) scanf("%d%d", &l[i], &r[i]); D[1] = Node(0, 0), D[2] = Node(k + 1, k + 1); top = 2; for (int i = 1; i <= k; i ++) ord[i] = lst[i] = i, Coor[i] = Node(i, i); for (int i = n; i; i --) { int s1 = Get(l[i]), s2 = Get(r[i] + 1), len = r[i] - l[i] + 1; if (s2 == 0) continue; int cnt = 1, p = ((l[i] & 1) || len == 1) ? s1 : Next(s1), t = s2, Last = 0; for (; ; cnt ++) { Maketag(t); lst[t] = p; Last = max(Last, t); if (cnt == len) break; int tmp = Next(t); if (!tmp) break; t = tmp; if (cnt == (len + (l[i] & 1)) / 2) p = (l[i] & 1) ? Next(s1) : s1; else p = Next(Next(p)); } int del = 0; for (int i = 1; i <= top; i ++) { p = i - del; D[p] = D[i]; if (Find(D[p].r) == Find(s2)) del ++; } top -= del; D[++ top] = Coor[Find(s2)], p = top; for (; p > 1 && D[p].l < D[p - 1].l; p --) swap(D[p], D[p - 1]); } int get = 0; for (int i = 1; i <= k; i ++) { if (lst[i] == i) { get ++; T[i] = S[get]; } else T[i] = T[lst[i]]; printf("%c", T[i]); } printf("\n");}
- JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
- 【NOIP提高模拟】奇洛金卡达
- JZOJ4744. 【NOIP2016提高A组模拟9.2】同余 一类比较好的分类思想+根号算法
- JZOJ4693. 【NOIP2016提高A组模拟8.14】疯狂的火神
- 【NOIP2016提高A组模拟8.14】疯狂的火神
- 【NOIP2016提高A组模拟8.14】疯狂的火神
- 疯狂的火神【NOIP2016提高A组模拟8.14】
- 【NOIP2016提高A组模拟8.14】火神的鱼
- 【NOIP2016提高A组模拟9.24】天使的分裂
- JZOJ4798. 【NOIP2016提高A组模拟9.24】天使的分裂
- 【NOIP2016提高A组模拟9.24】天使的分裂
- 天使的分裂【NOIP2016提高A组模拟9.24】
- 【NOIP2016提高A组模拟9.24】天使的分裂
- 【NOIP2016提高A组模拟9.24】我的快乐时代
- 【NOIP2016提高A组模拟9.24】我的快乐时代
- 【NOIP2016提高A组模拟7.15】立方体
- 计数【NOIP2016提高A组模拟7.15】
- 【NOIP2016提高A组模拟7.17】寻找
- 指针、动态数组、二维数组、数组形参学习小记
- 利用openssl生成的https的ca来访问web服务器
- EventBus3.0优于Otto
- java基本类型及String字符串的存储与比较
- JavaScript深入理解函数 - 函数的属性
- JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
- Java语言中的异常处理机制
- 使用简单的二维码扫描
- Spring 动态数据源路由(Dynamic DataSource Routing)
- fastjson与map之间的转换
- String、StringBuffer、StringBuilder细节
- AsyncTask
- Iframe内部调用外部的location.href跳转出现奇怪问题
- STM32串口双缓冲乒乓数据传输方式