2.4k2 分钟

首先想到将各个联通块缩成一个点来解决问题,接下来就是考虑将各个联通块经过变换都变为P态: 一个贪心的想法是将连有三个及以上N态点的P态点删去,同时,然后再加上剩下的N态点数就为答案,但贪心做法并不能达到全局最优,如: 1_P-->2_P; 2_P-->3_N; 3_N-->4_P; 3_N-->5_P; 5_P-->6_N; 5_P-->7_N; 4_P-->8_N; 4_P-->9_N; 4_P-->10_N; 贪心做法为4,而正解应该为3 那么我们接下来应该考虑的是每次操作的影响,对于每次操作,都会使该块与相邻联通块合成
4851 分钟

第一问是求最长不升子序列,第二问是求最长上升子序列 对于第一问利用vector的反向迭代器来转换为最长不降子序列 LL x; vi v(1, -1),j(1,-1),s; int main() { while (scanf("%lld",&x)==1) { s.pb(x); if (x > v.back()) v.pb(x); else *lower_bound(all(v), x) = x;
1.8k2 分钟

A题排序然后从l开始由小到大加到不超过最大值即可 B题贪心,但写的烂代码,爆int还tle,看到别人的排序是真帅 D1题是个dp,考虑每个因子的转移,不应该仅想到直接求该数因子,一个考虑遍历方法 ```cpp LL tt,n,l,r,k; int main() { //IN;OUT; ios::sync_with_stdio(false); cin.tie(0); cin>>tt; f(sb,1,tt){ cin>>n>>l>>r>>
1.5k1 分钟

主席树可A,回头试试其他做法 const int N=1e5+86; int root[N],len[N],tot; char c[N*30]; struct Node { int l,r; }tr[N*30]; void build(int &rt,int l,int r){ rt=++tot; if(l==r){ c[rt]='#'; return ; } int mid=(l+r)