【做题】atc_cf17-final_E - Combination Lock——巧妙转化及图论
题意:给出一个由26个小写字母组成的字符串,可以任意地进行若干个操作,每次操作是让指定区间内的字母变为下一个字母(z变成a)。问是否存在方案使得这个字符串变为回文串。
一开始的想法是构造len/2条模26意义下方程,但由于26不是质数,判断有没有解并不容易。(下文自动省略模26)
我们发现,一次操作对于方程组的影响大概是这样的:

如上图所示,一次对区间[l,r]进行的操作,其中从一端到其关于中点的对称点的区间实质是没有贡献的。(上图中为区间[l,l'])同样地,对于完全位于中点右边的区间,可以将其翻转到中点左边。
因此,所有操作的影响都被移动到了中点左边,则每一条方程都变成了如下形式:k1*x1+k2*x2+...+kn*xn=p。其中,p为常数,且ki为0或1。
而且,每一次操作的影响都是一个区间,所以这就成了一个通过区间操作是一个序列中元素全部变为0的问题。
上述问题简单地说就是,回文串就是左右两边的元素差值为0。所以最终目的就是使这些差值全部变为0。
所以很容易想到对于那个需要变成0的数列差分得到序列a,每一次操作区间[l,r]就是a[l]+1,a[r+1]-1。这等价于令a[l]+a[r+1]一定,然后任意确定a[l]和a[r+1]的值。
同样地,两个操作[l1,r-1]和[l2,r-1]也就是a[l1]+a[l2]+a[r]一定,然后任意确定这三个数的值。
因此,我们可以建一张有len/2+1个点的图,点i的权值为a[i],每一次操作[l,r]就是给点l和点r+1连一条边。则存在方案 <=> 每个连通分量内点权和为0。
上述过程可以用并查集实现。
时间复杂度O(n*α(len))。(下面代码没有按秩合并,时间复杂度为O(n*logn);有代码更优美的实现方式,即计算时保留S的右半部分)
#include <bits/stdc++.h>
using namespace std;
const int N = ;
int n,m,s[N],sum[N],dif[N];
int flag[N];
int get_flag(int pos) {
return flag[pos] == pos ? pos : flag[pos] = get_flag(flag[pos]);
}
void fit(int& x) {
if (x > n/) x = n-x+;
}
int fix(int x) {
if (x<) x = -(-x)%;
x %= ;
return x;
}
int main() {
int l,r;
for (char tmp=getchar();tmp>='a'&&tmp<='z';tmp=getchar())
s[++n] = tmp-'a';
for (int i=;i<=n/;++i)
s[i] -= s[n-i+],dif[i]=s[i]-s[i-],flag[i]=i;
dif[n/+] = -s[n/];
scanf("%d",&m);
for (int i=;i<=m;++i) {
scanf("%d%d",&l,&r);
if (n&) {
if (l == n/+&&r == n/+) continue;
if (l == n/+) l++;
if (r == n/+) r--;
}
if (l<=n/&&r>n/) {
fit(r);
if (l>r) swap(l,r);
r--;
} else {
fit(l);fit(r);
if (l>r) swap(l,r);
}
flag[get_flag(l)]=flag[get_flag(r+)];
}
for (int i=;i<=n/+;++i) sum[get_flag(i)] += dif[i];
for (int i=;i<=n/+;++i) if (fix(sum[i])!=) {
return *puts("NO");
}
puts("YES");
return ;
}
小结:一种重要解题方法就是对题目进行转化。
【做题】atc_cf17-final_E - Combination Lock——巧妙转化及图论的更多相关文章
- (转)poj算法做题顺序
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...
- 最大流 总结&&做题记录
最近一直很忙,为了节省时间,从今以后的题解会 一个专题 写一篇. 刷了一些题后,有了以下总结: 模型要点: 1.构造流量平衡,在满足流量平衡的情况下,找到要让什么最大. 2.一般用于判断性问题,即所有 ...
- AtCoder Grand Contest 11~17 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
- AtCoder Grand Contest 1~10 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...
- 贪心 Codeforces Round #301 (Div. 2) A. Combination Lock
题目传送门 /* 贪心水题:累加到目标数字的距离,两头找取最小值 */ #include <cstdio> #include <iostream> #include <a ...
- CodeM美团点评编程大赛复赛 做题感悟&题解
[T1] [简要题意] 长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...
- 【做题】BZOJ2342 双倍回文——马拉车&并查集
题意:有一个长度为\(n\)的字符串,求它最长的子串\(s\)满足\(s\)是长度为4的倍数的回文串,且它的前半部分和后半部分都是回文串. \(n \leq 5 \times 10^5\) 首先,显然 ...
- Sam做题记录
Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...
- 退役III次后做题记录(扯淡)
退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...
随机推荐
- 001- CreateProcess failed with error 216 (no message available)错误详解
问题详解 runnerw.exe: CreateProcess failed with error 216 (no message available) 看描述,创建进程失败,应该是main这个入口文 ...
- [15]Windows内核情景分析 --- 权限管理
Windows系统是支持多用户的.每个文件可以设置一个访问控制表(即ACL),在ACL中规定每个用户.每个组对该文件的访问权限.不过,只有Ntfs文件系统中的文件才支持ACL. (Ntfs文件系统中, ...
- 《大话设计模式》c++实现 原型模式
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 主要解决:在运行期建立和删除原型. 何时使用: 1.当一个系统应该独立于它的产品创建,构成和表示时. 2.当要实例化的类是在运行 ...
- FileChannel
1, FileChannel 虚拟类,不可以直接实例化,可以通过FileInputStream FileOutputStream 获取 例:文件的复制 public class ChannelDem ...
- python 序列化,反序列化
附: pickle 有大量的配置选项和一些棘手的问题.对于最常见的使用场景,你不需要去担心这个,是如果你要在一个重要的程序中使用pickle 去做序列化的话,最好去查阅一下官方文档. https:// ...
- Hive中变量的使用
1.Hive配置属性 (1)命令行方式 Hive配置属性存储于 hiveconf 命名空间中,该命名空间中的属性是可读写的.在查询语句中插入 '${hiveconf:变量名}',就可以通过 hive ...
- Hive静态分区和动态分区
一.静态分区 1.创建分区表 hive (default)> create table order_mulit_partition( > order_number string, > ...
- 什么是redis,redis简介
redis是一个key-value存储系统.包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). 高可用分布式集群 一, ...
- C++中set用法详解
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- vue 加载更多2
<template lang="html"> <div class="yo-scroll" :class="{'down':(sta ...