BZOJ1141: [POI2009]Slw
来源:互联网 发布:剑灵火炮兰捏脸数据 编辑:程序博客网 时间:2024/06/06 07:25
题目大意:初始有个串S(0)=0,S(i+1)由S(i)经过一次变换得到,变换的规则为0->1,1->10。现在给出N个整数,令串T=S(a1)+S(a2)+S(a3)+...,其中+代表串联,问T能否表示为一个S(X)的子串
md真的神做法..
为啥POI总是能出出来脑洞这么大的构造题..
大爷的题解->戳这里
我们定义逆变换G(S)=S',其中H(S')=S,H函数是题目中定义的
换言之,题目中不断的把0和1扩展,逆变换就是要把他一点一点的缩回去
1->0,10->1
可以证明这种变换是没有歧义(唯一对应的),1后面跟1就把前面的1变成0,否则两个捏在一起变成1
那么T是S(X)的一个子串就等价于G(T)是G(S(X))也就是S(X-1)的一个子串,由于X可以任意取值,所以换句话说,若T不断通过逆变换最后可以成为一个S(X),则T就可以表示成一个子串。如果做到某一步T无法进行逆变换了,那就说明不合法。
那么如何对T进行逆变换呢?
我们已知T=S(a1)+S(a2)+...+S(an)
若ai均大于0,则G(T)=S(a1-1)+S(a2-1)+...+S(an-1),即分别对每段做逆变换
当有ai为0时,由于不存在S(-1),没有办法直接做逆变换,所以我们进入分类讨论
若i=1,也就是说T的开头是0,由于题目对T前面是什么没有要求,那么我们不妨假设他前面的那个数是1,那么S(a1)就从0变成了10,也就是说可以把a1当成2
否则若前面的ai-1是偶数,则说明有两个0相连,那么无法进行逆变换
若前面的数是5或以上的奇数,则末尾一定为10101,而101010一定无解,所以我们也可以直接输出NIE
否则若是1,我们可以把1和0捏在一起形成一个2
若是3,我们可以把3和0捏在一起形成两个2
捏的过程可以用链表来实现(直接暴力也可以,时间复杂度是能保证的)
需要注意的是,当末尾的数是1或者3时,也就是说T的最后一个位置是1,这时由于下一个数可以任意指定,所以最后一位经过变换之后可0可1,就不会对答案造成影响,所以直接删去这个1就好了
用链表写的好闹心...还是直接暴力应该会更舒服一点吧
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define N 100010using namespace std;int a[N],bef[N],nxt[N];void del(int x){bef[nxt[x]]=bef[x];nxt[bef[x]]=nxt[x];}void doit(){int n;scanf("%d",&n);int i,j,x,y;for(i=1;i<=n;i++){scanf("%d",&a[i]);nxt[i-1]=i;bef[i+1]=i;}bef[1]=0;nxt[n]=n+1;while(nxt[0]!=bef[n+1]){i=bef[n+1];if(a[nxt[0]]==0) a[nxt[0]]=2;if(a[i]==1) del(i),i=bef[i];else if(a[i]==3) a[i]=2;while(i!=0){if(a[i]==0){if(a[bef[i]]==1) a[bef[i]]=2,del(i);else if(a[bef[i]]==3) a[bef[i]]=2,a[i]=2;else {puts("NIE");return;}}a[i]--;i=bef[i];}}puts("TAK");}int main(){int T;scanf("%d",&T);while(T--)doit();}
- BZOJ1141: [POI2009]Slw
- BZOJ1141: [POI2009]Slw
- BZOJ 1141 POI2009 Slw
- [乱搞] BZOJ 1141 [POI2009]Slw
- BZOJ 1141 [POI2009]Slw 分类讨论
- bzoj1141(矩阵hash)
- [poi2009]gas
- POI2009 题解
- [BZOJ 1119]POI2009 slo
- [BZOJ 1120]POI2009 str
- [BZOJ 1133]POI2009 Kon
- 【BZOJ1142】【POI2009】Tab 乱搞
- BZOJ1117 POI2009 救火站
- 【BZOJ1133】[POI2009]Kon【DP】
- bzoj1137【POI2009】Wsp 岛屿
- poi2009 切题记
- BZOJ1119 [POI2009]SLO
- BZOJ1135 [POI2009]Lyz
- 笔记--Ubuntu 14.0.4下Mapbox源码分析1
- RestTemplate
- 3098: Hash Killer II
- 自定义Unity资源文件打开方式
- 转 Vpn L2TP/IPsec 需要打开 IPSEC Services 服务
- BZOJ1141: [POI2009]Slw
- 使用包管理Java中的类
- 剑指offer-面试题17-合并两个排序的链表
- Android:Java:编译/运行:提示:The method X is undefined for the type Y
- Shell判断和比较
- JVM GC调优总结 -Xms -Xmx -Xmn -Xss
- Redis SETNX 命令实现分布式锁
- xpage开发基础小功能代码
- Can't convert to dimension: type=0x1 错误处理