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)
3.4k3 分钟

题意是维护一个带删除操作的可持久化并查集,但不会实现,于是看题解考虑离线操作,解决完一个儿子就回溯操作 注意到离线仍需要带删除操作的并查集,所以需要虚根来实现 一开始操作数组开大了N*30爆MLE,后来因为答案要求的是Yes和No,而打的是YES和NO给了几发WA const int N = 1e6 + 86; int fa[N * 2], flag[N], sz[N * 2], tot, n, m, ans[N], dp[N * 2]; vi v[N]; struct NODE { int op, a, b; } e[N]; int find(int
2.4k2 分钟

题意为给定一个二分图,左右点数均为n,并给定左右相连的边,对这些边两端点满足,并且原图左边点的度数 现给定你一些限制条件并要求你选定一些点及其边,使得右边的点全部被覆盖到 状态压缩dp: 设以数组dp[i][j]其中表示二进制下中前位反应左边点的选取情况,后至位表示右边点的覆盖情况,注意判断是否满足的情况,便可不用三维数组来dp vi v[20], m(30); LL dp[20][(1 << 20) - 1], tt, n, b[20]; int main() { ios::sync_with_stdio(false); cin.tie(0);