摘要: 一种分治的思想,看每次的左右区间,找一个需要更改小的进行更改,然后对另一个区间进行继续往下分治的更改。 #include<cstdio> #include<iostream> using namespace std; int T,n; char s[200005]; int solve(int l, 阅读全文
posted @ 2021-09-30 22:14 dfydn 阅读(31) 评论(0) 推荐(0) 编辑
摘要: 可以将分组的背包看成若干个01背包来做。 #include<cstdio> #include<iostream> using namespace std; int read(){ int num=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c== 阅读全文
posted @ 2021-09-30 21:44 dfydn 阅读(60) 评论(0) 推荐(0) 编辑
摘要: 二进制拆分来考虑,设f[i]表示一个数第i位为1的最长长度,那么在处理数a时,如果它的第i位为1,那么可以从f[i]转移过来。取max{f[i]},作为a的序列最长长度,用这个最长长度来更新数a为1的位的f[i]。 语言描述有限,详见代码。 #include<cstdio> #include<ios 阅读全文
posted @ 2021-09-30 21:43 dfydn 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 如果存在一堆石子个数大于剩余所有堆的的石子总数,那么先手占据此堆石子,先手胜。 否则,考虑最终状态必定只有一堆石子,现证明双方都可以通过设定操作策略为取走目前可取的石子最多的那堆做到最后一堆石子被拿干净: 假设不被拿干净,必定是出现了最多石子的那堆石子数目大于其他之和的状态(例如最终状态),逆推回去 阅读全文
posted @ 2021-09-30 21:28 dfydn 阅读(38) 评论(0) 推荐(0) 编辑