首页 > 其他分享 >题解 [ABC279E] Cheating Amidakuji

题解 [ABC279E] Cheating Amidakuji

时间:2022-11-27 09:12:10浏览次数:66  
标签:Cheating int 题解 rep mid pos Amidakuji swp now

曾经总结过一类分治套路,没想到竟然派上用场了。

这种每个操作依次缺席的问题可以通过分治来解决。设 solve(l, r) 表示缺席的操作在 \([l,r]\) 之间时求出它们的答案。

设 \(mid=\lfloor\frac{l+r}{2}\rfloor\),考虑将区间 \([l,r]\) 划分为两个区间 \([l,mid],[mid+1,r]\)。对于区间 \([l,mid]\),可以知道区间 \([mid+1,r]\) 的操作一定是执行了的。因此,在递归求解 \([l,mid]\) 的时候,我们遍历 \([mid+1,r]\) 的每一个操作,统计它对答案的影响。反之亦然。

本题中要注意操作执行的顺序问题。

由主定理易证复杂度为 \(T(m)=2T(\frac{m}{2})+\Theta(m)=\Theta(m\log m)\)。

// Problem: E - Cheating Amidakuji
// Contest: AtCoder - TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)
// URL: https://atcoder.jp/contests/abc279/tasks/abc279_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const int N = 2e5+5;

int n, m, a[N], p[N], pos[N], ans[N];
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
void swp(int i) {
	int x = p[i], y = p[i+1];
	swap(p[i], p[i+1]);
	swap(pos[x], pos[y]);
}
void calc(int& i) {i = pos[i];}
void solve(int L, int R, int now) {
	if(L == R) {
		ans[L] = now;
		return;
	}
	int M = (L + R) >> 1;
	{
		solve(L, M, now);
		rep(i, M+1, R) swp(a[i]);
		rep(i, L, M) calc(ans[i]);
		per(i, R, M+1) swp(a[i]);
	}
	{
		rep(i, L, M) swp(a[i]);
		calc(now);
		per(i, M, L) swp(a[i]);
		solve(M+1, R, now);
	}
}

int main() {
	scanf("%d%d", &n, &m);
	rep(i, 1, m) scanf("%d", &a[i]);
	rep(i, 1, n) p[i] = pos[i] = i;
	solve(1, m, 1);
	rep(i, 1, m) printf("%d\n", ans[i]);
	return 0;
}

标签:Cheating,int,题解,rep,mid,pos,Amidakuji,swp,now
From: https://www.cnblogs.com/ruierqwq/p/abc279e.html

相关文章

  • ES系列二之常见问题解决
    上篇ES系列一之java端API操作结束后本以为就相安无事了,但生产的问题是层出不穷的;下面我就再记录下近几周遇到的问题以及解决方案;一更新ES信息报错报错信息如下:UseElas......
  • 『题解』UVA 240 Variable Radix Huffman Encoding
    题目传送门题意哈夫曼编码是一种最优编码方法。根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的意思是编码信息的平均长度最小。在该问......
  • 『题解』UVA 210 Concurrency Simulator
    题目传送门按题意使用队列和双端队列模拟。其中就绪队列使用双端队列,阻止队列使用普通队列。p=58printalockunlockend我们观察一下这几个指令,可以发现......
  • 『题解』Codeforces 808D Array Division
    题目传送门解题思路首先统计\(n\)个数字和为\(sum\),那么一半就是\(sum=sum\div2\)从\(1\)到\(n\)枚举,累计进前缀和\(ans\)中,如果发现第\(i\)个数字累......
  • 『题解』UVA 10534 Wavio Sequence
    题目传送门题意\(Wavio\)是整数序列,有如下特点:它的长度总为奇数,即\(2n+1\);前\(n+1\)个数构成一个严格的上升序列,后\(n+1\)个数构成一个严格下降的序列;任意......
  • 『题解』UVA 10795 A Different Task
    题目传送门双倍经验:LuoguP1242分析汉诺塔相信每一个合格的OIer都听说过并且实现过。这是一个递归的程序。汉诺塔本来就有两个规则:一次只能移动最上面的一个盘......
  • 『题解』UVA 148 Anagram checker
    题目传送门分析貌似除了递归式暴力搜索外,没有其它的有效算法了。这样的话,对代码性能的要求就比较高了,为了快速的判断一个短语是否包含某个单词,必须找出一种特定的数据结......
  • 『题解』UVA 12676 Inverting Huffman
    题目传送门题意静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由\(N\)个不同字符组成的特定长度的文本,算法选择\(N\)个编码,每个不同的字符一个编码。使......
  • 『题解』Codeforces 1743A Password
    Problem现有\(4\)位密码,满足以下条件:给定数位的集合\(S\),密码中没有用到这些数位。密码中恰好包含两个数位,每个数位出现了两次。求符合条件的密码个数。Solution......
  • 『题解』Codeforces 1742C Stripes
    Problem在\(8\times8\)的网格上,轮流染上红色和蓝色。红色只能染一整行。蓝色只能染一整列。问最后用的是哪种颜色。Solution题目说明了至少会染一个条纹,所以我......