首页 > 其他分享 >【大联盟】20230713 T1 方向矩阵(rect) 题解 CF1666A 【Admissible Map】

【大联盟】20230713 T1 方向矩阵(rect) 题解 CF1666A 【Admissible Map】

时间:2023-07-25 11:13:11浏览次数:70  
标签:Map ch 20230713 pw int 题解 sum st MOD

题目描述

here

题解

赛时得分:60/100。

想到了正解,但调不出来,就改写暴力了。。。

首先,我们把问题转化成每个点都入度为 \(1\)。

我们考虑合法子串只有两种形式:

注意到 UD,要么同时出现,要么同时不出现,因为如果存在 U,就说明 U 所在这一行得到度数减少了,一定需要上一行 D 来弥补。

  1. 不存在 UD。答案形如 RLRL...RLRL,这是好统计的。

  2. 存在 UD。考虑第一个 U 一定会匹配第一个未被 LR 得到入度的点。这是因为,首先,由于有 UD,则一定会有未被 LR 得到入度的点,那这个点肯定会被 U 相连,因为如果被 D 相连,那这个 D 之前肯定会有点未被 LR 得到入度,因为边数 < 点数,与我们定义的第一个未被 LR 得到入度的点相矛盾。

    现在,我们就得到了宽度 \(L\)。然后,我们考虑哈希来判断是否合法(赛时想到的是 bitset 巨难写……)。

    然后,我们考虑按 \(L\) 根号分治:

    1. 对于 \(L\le\sqrt{n}\),由于不超过 \(\sqrt{n}\) 种,所以我们预处理出哈希值,然后使用 unordered_map 求答案。

    2. 对于 \(L>\sqrt{n}\),由于答案不超过 \(\sqrt{n}\),所以我们可以暴力往后跳,判断答案。

时间复杂度 \(O(n\sqrt{n})\)。

代码

由于 CF 上 \(n\le 2\times 10^4\),模拟赛虽然 \(n\le 10^5\),但听说数据很水,所以直接写了个 \(>\sqrt{n}\) 的部分就摆了。

#include <bits/stdc++.h>
#define SZ(x) (int) x.size() - 1
#define ms(x, y) memset(x, y, sizeof x)
#define all(x) x.begin(), x.end()
#define F(i, x, y) for (int i = (x); i <= (y); ++i)
#define DF(i, x, y) for (int i = (x); i >= (y); --i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> inline void chkmax(T &x, T y) { x = max(x, y); }
template <typename T> inline void chkmin(T &x, T y) { x = min(x, y); }
template <typename T> inline void read(T &x) {
	x = 0; int f = 1; char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
	for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
	x *= f;
}
const int N = 1e5 + 10, base = 312349, MOD = 1000000021;
int n, lst, pw[N], sum[4][N], ss[N];
ll ans;
int power(int x, int y = MOD - 2) {
	int ans = 1;
	for (; y; x = (ll) x * x % MOD, y >>= 1)
		if (y & 1) ans = (ll) ans * x % MOD;
	return ans;
}
void add(int &x, int y) { if ((x += y) >= MOD) x -= MOD; }
signed main() {
	// freopen("rect.in", "r", stdin);
	// freopen("rect.out", "w", stdout);
	string st; cin >> st;
	n = st.size(); st = ' ' + st;
	int invbase = power(base);
	pw[0] = 1;
	F(i, 1, n) {
		pw[i] = (ll) pw[i - 1] * base % MOD;
		ss[i] = (ss[i - 1] + pw[i]) % MOD;
		F(j, 0, 3) sum[j][i] = sum[j][i - 1];
		if (st[i] == 'U') add(sum[0][i], pw[i]);
		if (st[i] == 'D') add(sum[1][i], pw[i]);
		if (st[i] == 'L') add(sum[2][i], pw[i]);
		if (st[i] == 'R') add(sum[3][i], pw[i]);
	}
	for (int i = 2; i <= n; i += 2) {
		if (st[i] == 'L' && st[i - 1] == 'R') lst++;
		else lst = 0;
		ans += lst;
	}
	lst = 0;
	for (int i = 3; i <= n; i += 2) {
		if (st[i] == 'L' && st[i - 1] == 'R') lst++;
		else lst = 0;
		ans += lst;
	}
	int pos = 1, pp = 1;
	F(i, 1, n) {
		chkmax(pos, i), chkmax(pp, i);
		while (pos <= n && st[pos] != 'U') pos++;
		int tp = - 1;
		if (st[i + 1] == 'L') {
			tp = pp;
			pp = i;
		}
		while (pp <= n && (st[pp + 1] == 'L' || (pp != i && st[pp - 1] == 'R'))) pp++;
		if (pos > n) break;
		if (pos == i) continue;
		if (pp >= pos) continue;
		int len = pos - pp;
		// if (len > B) {
			int inv = power(invbase, len), pw = power(base, len);
			for (int l = i, r = i + len - 1; r <= n; l += len, r += len) {
				if (st[l] == 'L' || st[r] == 'R') break;
				int val = (((ll) (sum[0][r] - sum[0][i - 1]) * inv + (ll) (sum[1][r] - sum[1][i - 1]) * pw + (ll) (sum[2][r] - sum[2][i - 1]) * invbase + (ll) (sum[3][r] - sum[3][i - 1]) * base) % MOD + MOD) % MOD;
				if (r >= pos && val == (ss[r] - ss[i - 1] + MOD) % MOD) ans++;
			}
		// }
		if (~tp) pp = tp;
	}
	cout << ans;
	return 0;
}

标签:Map,ch,20230713,pw,int,题解,sum,st,MOD
From: https://www.cnblogs.com/zhaohaikun/p/17579262.html

相关文章

  • 学好Elasticsearch系列-Mapping
    本文已收录至Github,推荐阅读......
  • luogu P3203 [HNOI2010] 弹飞绵羊 题解
    题目传送门:P3203[HNOI2010]弹飞绵羊题意\(n\)个数,满足\(i<a_i≤N+1\),\(m\)次下面两种操作修改一个数\(a_i\)从\(x\)开始跳,\(x=a_x\),几次能够跳出序列\(n\leq2*10^5,m<10^5\)分析数据范围比较大,单纯搜索模拟肯定会T,那么考虑每次让他跳一段就......
  • 题解 P7971【[KSN2021] Colouring Balls】
    postedon2022-10-0819:07:28|under题解|sourceproblem交互库有一个长为\(n\)的颜色序列,你可以询问区间\([l,r]\)中有多少种颜色,最后还原交互库手中的序列,只需要保持相对顺序不变。\(n\leq10^3\),最多询问次数\(Q=2000\)或\(Q=10^4\)。solution令\(C\)为\([1......
  • CF1051G Distinctification题解
    link首先可以发现,题目给定的两种操作为我们提供了“反悔机制”,所以有:结论\(1\):即任何一个可以到达的局面都能到达最优解。利用这个结论,首先我们先去重。继续提炼性质,与相差不到\(1\)的数为基准\(+1\)与\(-1\)操作,将这个数的变化范围限制在了一个区间,并且这个区间的数能......
  • 题解 Codeforces Round 887 (Div 1+Div 2) / CF1853AB,CF1852ABCD
    下大分!悲!Div1只过了1A!!!但还是补完整场Div2吧。A.Desortinghttps://codeforces.com/problemset/problem/1853/Aproblem用操作:\([1,i]++,[i+1,n]--\),使得数组不单调不降,求最小操作次数。\(n\leq10^5\)。solution操作等同于在差分数组上选出\(i\),做\(c_1:=c_1+1,c_i:......
  • UOJ #284. 快乐游戏鸡题解(长链剖分+单调栈合并)
    UOJ#284.快乐游戏鸡题解(长链剖分+单调栈合并)题面一番战斗之后,程序猿被计算鸡们赶走了。随着垫子计算鸡一声令下:“追!”,于是计算鸡村全村上下开始乘胜追击。计算鸡们希望在新的一年到来之际给程序猿以重创,出掉这一年的恶气。可是程序猿一追就走,一走就跑,一跑就无影无踪。计算鸡......
  • 洛谷CF1738C题解
    好一道博弈论水题题目传送门更好的食用体验题目大意:给定长度为$n$的数列$a_1,a_2,\dots,a_n$,两名玩家Alice、Bob依次以最优策略从数列中取走一个数,Alice先取,直至为空博弈结束。若Alice取走的所有数之和为偶,Alice胜利;若Alice取走的所有数之和为奇,Bob胜利......
  • 【题解】Imbalanced Arrays - Codeforces 1852B
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/B题目大意:给定一个包含\(n\)个非负整数的频次序列\(f\)。构造任意一个等长的整数序列\(b\),要求①\(b\in[-n,n]\)but$b\neq0$②\(b\)中不存在相反数③对于每个坐标\(i\)......
  • 【P8302 题解】
    Solution设\(g(x)\)表示\(x\)的最小质因子。则\(f(x)=n+\dfrac{n}{g(x)}=\dfrac{g(x)+1}{g(x)}\timesn\)。分情况讨论:\(g(x)=2\),经过\(1\)次变换之后,\(f(x)\)增加了一个因子\(3\),减少了一个因子\(2\)。\(g(x)>2\),则满足\(g(x)\nmid2\),否则与最小质因子矛盾,......
  • 【题解】Ntarsis' Set - Codeforces 1852A
    出处:CodeforcesRound887链接:https://codeforces.com/problemset/problem/1852/A题目大意:给定一个包含\(n\)个正整数的表示删除位置的严格升序序列\(p\),以及另外一个连续正整数的被删除的无穷序列\(l\)。进行\(k\)次删除操作,每次操作从无穷序列\(l\)中同时删除位......