T1 f[i]为前i页最少被撕几页,用二分转移就行了,答案为ans=min(f[i]+(n-i)); 不知道为什么写挂了嗯 二分的l初始应该是0
T2 数位DP f[i][1/0][1/0][1/0]表示第i位第一个数是1/0,第二个数是1/0,有无进位的方案数 转移非常恶心。。。 没看见正整数结果WA了,有想到x<y的trick但是觉得这方法应该不用理这个,结果是要的...其实也不知道这做法到底对不对,补题的时候看看吧 事实证明是可以的
贴一波代码,好像大家做的方法都不一样 CYC的方法好喵喵哇,太强辣~ 我人比较傻逼没法治的唉(LLQ也是这种写法 都炒鸡强哇%%%
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath> #include<map> #define ll long long using namespace std; const int maxn=500010,inf=1e9; ll n,m,x,y,z,tot,cnt,digit[maxn]; ll f[2333][2][2][2],ans; void read(ll &k) { int f=1;k=0;char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar(); k*=f; } int main() { read(n);read(m);bool flag=0; if(n==m)flag=1; ll x=m,cnt2=0; while(n){digit[++cnt]=n&1;n>>=1;} while(x){cnt2++;x>>=1;} if(cnt2>cnt) { puts("0"); return 0; } f[0][0][0][0]=1; for(int i=1;i<=cnt;i++) { ll now=m&(1ll<<(i-1)); if(now) { if(digit[i]) { f[i][1][0][0]+=f[i-1][1][0][0]+f[i-1][0][1][0]+f[i-1][0][0][0]+f[i-1][0][0][1]; f[i][0][1][0]+=f[i-1][1][0][0]+f[i-1][0][1][0]+f[i-1][0][0][0]+f[i-1][0][0][1]; if(i==cnt)ans=f[i][1][0][0]+f[i][0][1][0]; } else { f[i][1][0][1]+=f[i-1][1][1][1]+f[i-1][1][0][1]+f[i-1][0][1][1]+f[i-1][0][0][1]; f[i][0][1][1]+=f[i-1][1][1][1]+f[i-1][1][0][1]+f[i-1][0][1][1]+f[i-1][0][0][1]; } } else { if(digit[i]) { f[i][1][1][1]+=f[i-1][1][1][1]+f[i-1][1][0][1]+f[i-1][0][1][1]; f[i][0][0][0]+=f[i-1][1][1][1]+f[i-1][1][0][1]+f[i-1][0][1][1]; if(i==cnt)ans=f[i][0][0][0]; } else { f[i][1][1][1]+=f[i-1][1][0][0]+f[i-1][0][1][0]+f[i-1][0][0][0]; f[i][0][0][0]+=f[i-1][1][0][0]+f[i-1][0][1][0]+f[i-1][0][0][0]; } } } printf("%lld\n",flag?ans-2:ans); return 0; }
T3 1s O(500^3)居然是可以过的TAT
f[L][R]表示[L..R]这个区间的最小次数。
暴力是个O(N^4)的,枚举两个区间,哈希判回文。。。不知道哪里又写挂了只拿了第一部分的暴力分
O(N^3)的也很好想。。可以枚举[L..R]中的一点x,若a[R]==a[x],那么可以把[X+1..R-1]消剩下一个回文,然后把R和这个回文和X一起消掉,则有f[L][R]=min(f[L][R],f[L][X-1]+f[X+1][R-1]);
码力太有问题了...可能创下了最快补完题记录,真的是每题都离正解一步...
这已经不是一次两次了...不想着找原因老是觉得下次注意就行是不会解决的,这么粗糙的人不经过打磨也绝无可能取得好成绩,这段时间要尽力静下心改变自己了
希望没有下一次