AGC044C Strange Dance
在2020年A卷省选day2t2有类似操作trie的技巧。
显然是建一棵三叉trie树,代表0/1/2
对这棵trie树,我们需要支持子树交换和全局加1
考虑第一个操作怎么做?直接打个懒标记tag记录是否交换即可,因为交换偶数次次等于没交换
现在比较困难的是第二个操作,全局加1还有进位处理,相当于就是轮换,然后1变成2,0变成1,但2变成0的时候需要继续往下递归0处理进位(相当于就是对进位的位继续第二个操作),注意需要写pushdown,和写线段树的pushdown差不多
最后统计答案的时候,记得对整颗树pushdown,因为可能有标记还没下传完,具体细节类比线段树即可,然后答案就根据字典树的 \(end[i]\) 来搞就行。
时间复杂度: \(O(N)\)
代码:
#include<bits/stdc++.h>
#define maxn 5000005
using namespace std;
template<class T>
inline T read(){
T r=0,f=0;
char c;
while(!isdigit(c=getchar()))f|=(c=='-');
while(isdigit(c))r=r*10+(c^48),c=getchar();
return f?-r:r;
}
char s[maxn];
int n,len;
int pow3[15],ans[maxn];
namespace TRIE{
int trie[maxn][3],tag[maxn],tot=1,ed[maxn];
inline void insert(int x){
int u=1,tmp=x;
for(int i=1;i<=n;i++,x/=3){
if(!trie[u][x%3])trie[u][x%3]=++tot;
u=trie[u][x%3];
}
ed[u]=tmp;
}
inline void updateS(int x){
tag[x]^=1;
swap(trie[x][1],trie[x][2]);
}
inline void pushdown(int x){
if(!tag[x])return;
updateS(trie[x][0]);
updateS(trie[x][1]);
updateS(trie[x][2]);
tag[x]=0;
}
void updateR(int x){
if(!x)return;
pushdown(x);
int tmp=trie[x][2];
trie[x][2]=trie[x][1];
trie[x][1]=trie[x][0];
trie[x][0]=tmp;
updateR(trie[x][0]);
}
void calc(int x){
if(!x)return;
pushdown(x);
calc(trie[x][0]);
calc(trie[x][1]);
calc(trie[x][2]);
}
void getans(int x){
int u=1,tmp=x;
for(int i=1;i<=n;i++,x/=3)
u=trie[u][x%3];
ans[ed[u]]=tmp;
}
}
void work(){
n=read<int>();
scanf("%s",s+1);
len=strlen(s+1),pow3[0]=1;
for(int i=1;i<=n;i++)
pow3[i]=pow3[i-1]*3;
for(int i=0;i<pow3[n];i++)TRIE::insert(i);
for(int i=1;i<=len;i++){
if(s[i]=='S')TRIE::updateS(1);
else TRIE::updateR(1);
}
TRIE::calc(1);
for(int i=0;i<pow3[n];i++)
TRIE::getans(i);
for(int i=0;i<pow3[n];i++)
printf("%d ",ans[i]);
puts("");
}
int main(){
work();
return 0;
}
AGC044C Strange Dance的更多相关文章
- CCF统一省选 Day2 题解
此题解是教练给我的作业,AK了本场比赛的人,以及认为题目简单的人可以不必看 T1 算法一 暴力枚举对信号站顺序的不同排列,然后对代价取\(\min\)即可. 时间复杂度\(O(m! \cdot n)\ ...
- ATcoder Grand Contest总结
最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...
- UVA 1291 十四 Dance Dance Revolution
Dance Dance Revolution Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- [LA] 2031 Dance Dance Revolution
Dance Dance Revolution Time limit: 3.000 seconds Mr. White, a fat man, now is crazy about a game nam ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
- CF719C. Efim and Strange Grade[DP]
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- HDU 1548 A strange lift (最短路/Dijkstra)
题目链接: 传送门 A strange lift Time Limit: 1000MS Memory Limit: 32768 K Description There is a strange ...
- ACM : HDU 2899 Strange fuction 解题报告 -二分、三分
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
随机推荐
- STM32 USART串口通信
一.介绍 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择.它支持同步单向 ...
- Multisim仿真验证之二极管的特性参数
二极管的特性 正向 R1 10% 20% 30% 50% 70% 90% Vd/mV 299 543 583 608 627 658 Id/mA 0.01 0.1 0.6 1.4 2.8 7.2 rd ...
- 鸿蒙HarmonyOS实战-ArkUI事件(手势方法)
一.手势方法 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...
- Python的国内安装源(也称为镜像源)
Python的国内安装源(也称为镜像源)数量会随着时间而增加或减少,因为新的镜像源可能会建立,而一些旧的镜像源可能会停止服务或不再更新.以下是一些常用的Python国内安装源(也称为PyPI镜像源): ...
- Oracle中ALTER TABLE的五种用法(四、五)
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- fastposter v2.8.1 发布 电商海报生成器
fastposter v2.8.1 发布 电商海报生成器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...
- grads读取netcdf文件,报错SDF file has no discernable X coordinate解决办法
1.netcdf文件格式说明 netCDF数据格式在气象中有广泛的应用,这种格式有一定的复杂性.作为数据的使用者可以不用对数据格式了解得很详细,不过大致的了解还是有必要的.netCDF是自描述的二进制 ...
- 洛谷P3543 [POI2012] WYR-Leveling Ground
题目描述 给定 \(n\) 个数和 \(a,b\) 每次可以选择一段区间 \(+a,-a,+b ,或 -b\),问最少操作几次能把它们都变成 \(0\).如果无解请输出 \(-1\). 样例输入 5 ...
- 助力抗疫 Splashtop 远程控制软件限时免费
近期国内疫情又有抬头趋势,给我们的工作.生活带来诸多不便.面对疫情,居家办公是一个兼顾安全健康和保持生产力的好办法.据了解,很多广州的企业现在已经在关注或开始部署远程办公方案. 为了帮助疫情中高风险地 ...
- 【题解】A566.三点共线
题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组 \((A, B, C)\) 满足共线性质. 题目链接:A566.三点共线. 大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可. ...