隐藏页面特效

Codeforces Round 961 (Div. 2)

1|0Preface


菜的批爆,B2 一直 WA 道心破碎了直接白兰去了,鉴定为纯纯的飞舞

本来想着周末补题的然后又摆了一天,E1 和 E2 都没时间补了,鉴定为纯纯的懒狗


2|0A. Diagonals


签到,贪心枚举即可

#include<cstdio> #include<iostream> #include<utility> #include<vector> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<set> #include<array> #include<random> #include<bitset> #include<ctime> #include<limits.h> #include<assert.h> #include<unordered_set> #include<unordered_map> #define RI register int #define CI const int& #define mp make_pair #define fi first #define se second #define Tp template <typename T> using namespace std; typedef long long LL; typedef long double LDB; typedef unsigned long long u64; typedef pair <int,int> pi; typedef vector <int> VI; typedef array <int,3> tri; int t,n,k; signed main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%d",&t);t;--t) { RI i; scanf("%d%d",&n,&k); int cnt=0; if (k==0) { puts("0"); continue; } if (k<=n) { puts("1"); continue; } for (cnt=1,k-=n,i=n-1;i>=1&&k>0;--i) { if (k>0) k-=i,++cnt; if (k>0) k-=i,++cnt; } printf("%d\n",cnt); } return 0; }

3|0B1. Bouquet (Easy Version)


当时 B2 先写了发三分发现 WA 了,就赶紧滚回来把 B1 写了,这题就直接双指针扫一遍就能过

#include<cstdio> #include<iostream> #include<utility> #include<vector> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<set> #include<array> #include<random> #include<bitset> #include<ctime> #include<limits.h> #include<assert.h> #include<unordered_set> #include<unordered_map> #define int long long #define RI register int #define CI const int& #define mp make_pair #define fi first #define se second #define Tp template <typename T> using namespace std; typedef long long LL; typedef long double LDB; typedef unsigned long long u64; typedef pair <int,int> pi; typedef vector <int> VI; typedef array <int,3> tri; const int N=200005; int t,n,m,a[N]; signed main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%lld",&t);t;--t) { RI i,j; for (scanf("%lld%lld",&n,&m),i=1;i<=n;++i) scanf("%lld",&a[i]); sort(a+1,a+n+1); int ans=0,sum=a[1]; for (i=j=1;i<=n;++i) { while (j<=n&&a[j]-a[i]<=1&&sum<=m) sum+=a[++j]; sum-=a[j--]; if (sum<=m) ans=max(ans,sum); sum-=a[i]; } printf("%lld\n",ans); } return 0; }

4|0B2. Bouquet (Hard Version)


Div.2 B 题战俘闪总出列

这题有个很简单的讨论方式,即对于一组 (a,a+1),我们假设先全部买 a,然后把剩下的钱拿来买 a+1

这样如果还有剩余的钱,可以考虑将一些刚开始买的 a 替换成 a+1,这种方法就不需要繁琐的讨论了

#include<cstdio> #include<iostream> #include<utility> #include<vector> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<set> #include<array> #include<random> #include<bitset> #include<ctime> #include<limits.h> #include<assert.h> #include<unordered_set> #include<unordered_map> #define int long long #define RI register int #define CI const int& #define mp make_pair #define fi first #define se second #define Tp template <typename T> using namespace std; typedef long long LL; typedef long double LDB; typedef unsigned long long u64; typedef pair <int,int> pi; typedef vector <int> VI; typedef array <int,3> tri; const int N=200005; int t,n,m,a[N],b[N]; signed main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%lld",&t);t;--t) { RI i; for (scanf("%lld%lld",&n,&m),i=1;i<=n;++i) scanf("%lld",&a[i]); map <int,int> rst; for (i=1;i<=n;++i) scanf("%lld",&b[i]),rst[a[i]]=b[i]; int ans=0; for (auto [a,x]:rst) { int c1=min(x,m/a),sum=c1*a,rem=m-c1*a; if (!rst.count(a+1)) { ans=max(ans,sum); continue; } int c2=min(rst[a+1],rem/(a+1)); sum+=c2*(a+1); rem-=c2*(a+1); sum+=min(c1,min(rem,rst[a+1]-c2)); ans=max(ans,sum); } printf("%lld\n",ans); } return 0; }

5|0C. Squaring


神秘题,感觉精度要爆炸但交上去就是过了,很神秘

首先这题的策略很简单,即从前往后贪心,每个位置操作到比前一个位置大了就停手一定最优

现在的难点就在于怎么比较两个数的大小,假设前一个数 ai1 操作了 x 次,考虑快速计算当前数 ai 操作的次数 y

原来要比较 ai12xai2y 的大小;两边取 ln 后变为比较 2x×lnai12y×lnai 的大小

两边再做商得 2xy×lnai1lnai,因此可以直接再取 log2 快速解出 y 的值,注意要对 0max

#include<cstdio> #include<iostream> #include<utility> #include<vector> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<set> #include<array> #include<random> #include<bitset> #include<ctime> #include<limits.h> #include<assert.h> #include<unordered_set> #include<unordered_map> #define int long long #define RI register int #define CI const int& #define mp make_pair #define fi first #define se second #define Tp template <typename T> using namespace std; typedef long long LL; typedef long double LDB; typedef unsigned long long u64; typedef pair <int,int> pi; typedef vector <int> VI; typedef array <int,3> tri; const int N=200005; int t,n,m,a[N]; signed main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%lld",&t);t;--t) { RI i,j; for (scanf("%lld",&n),i=1;i<=n;++i) scanf("%lld",&a[i]); int ans=0,lst=0; bool flag=1; for (i=2;i<=n;++i) { if (a[i]==1&&a[i-1]!=1) { flag=0; break; } lst=max(0LL,(int)ceil(log2(1.0L*log(a[i-1])/log(a[i]))+lst)); ans+=lst; } if (!flag) { puts("-1"); continue; } printf("%lld\n",ans); } return 0; }

6|0D. Cases


考虑原题的限制相当于对于任意连续的 k 个字符,其中必须至少有一个是终止字符

反过来思考下,这就等价于对于连续的 k 个字符组成的状压状态 T 不能为所有不是终止字符的字符构造的集合 S 的子集

因此把所有连续的 k 个字符对应的状态标记为不合法(注意最后一个字符要特判),然后把它们的超集也标记成不合法即可

最后用枚举子集或者 sosdp 即可 O(3c)O(2c×c) 通过此题

#include<cstdio> #include<iostream> #include<utility> #include<vector> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<set> #include<array> #include<random> #include<bitset> #include<ctime> #include<limits.h> #include<assert.h> #include<unordered_set> #include<unordered_map> #define RI register int #define CI const int& #define mp make_pair #define fi first #define se second #define Tp template <typename T> using namespace std; typedef long long LL; typedef long double LDB; typedef unsigned long long u64; typedef pair <int,int> pi; typedef vector <int> VI; typedef array <int,3> tri; const int N=(1<<18)+5; int t,n,c,k,f[N],bkt[20]; char s[N]; signed main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); for (scanf("%d",&t);t;--t) { RI i,j; scanf("%d%d%d%s",&n,&c,&k,s+1); for (i=0;i<(1<<c);++i) f[i]=0; f[1<<(s[n]-'A')]=1; int mask=0; for (i=0;i<c;++i) bkt[i]=0; auto add=[&](CI x) { if (++bkt[x]==1) mask^=(1<<x); }; auto del=[&](CI x) { if (--bkt[x]==0) mask^=(1<<x); }; for (i=1;i<=k;++i) add(s[i]-'A'); f[mask]=1; for (i=k+1;i<=n;++i) del(s[i-k]-'A'),add(s[i]-'A'),f[mask]=1; for (i=0;i<c;++i) for (j=0;j<(1<<c);++j) if ((j>>i)&1) f[j]|=f[j^(1<<i)]; int ans=c; for (i=0;i<(1<<c);++i) if (!f[i]) ans=min(ans,__builtin_popcount(((1<<c)-1)^i)); printf("%d\n",ans); } return 0; }

7|0Postscript


感觉再这么菜下去要被新一届 Div2 薄纱了


__EOF__

本文作者hl666
本文链接https://www.cnblogs.com/cjjsb/p/18328832.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
posted @   空気力学の詩  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2020-07-28 Luogu P6623 [省选联考 2020 A 卷] 树
2020-07-28 AtCoder Grand Contest 034
2018-07-28 Luogu P4211 [LNOI2014]LCA
点击右上角即可分享
微信分享提示