Codeforces Round 963 (Div. 2) 补题记录(A~D,F1)
不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.不会做 F1.
A
直接计算每一个选项最多对多少个题加起来即可。
时间复杂度为
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pb emplace_back
#ifdef __unix__
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
#define int long long
using namespace std;
int read(){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
void read(int &x){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
x=s*w;
}
template<typename...argme>
void read(int &x,argme &...vv){
read(x),read(vv...);
}
const int N=1000100;
int a[N];
signed main(){
int T=read();
while(T--){
string s;
int n;
cin>>n>>s;
s=' '+s;
int box[10]={0};
for(int i=1;i<=4*n;++i)
if(s[i]!='?')++box[s[i]-'A'];
int mx=0;
for(int i=0;i<4;++i)
mx+=min(box[i],n);
cout<<mx<<'\n';
}
}
B
这是 B?这不比 C 难?
首先如果一开始全部是奇数或者全部是偶数的话不需要操作。其他的时候一定是把所有的数都变成奇数。
然后贪心的找到最大的奇数
。那么此时 ,有 。 变成新的最大的奇数, 。 。那么此时 ,有 ,随后 ,有 。 变成新的最大的奇数, 。
但是上面的贪心策略其实是错误的。发现
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pb emplace_back
#ifdef __unix__
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
#define int long long
using namespace std;
int read(){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
void read(int &x){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
x=s*w;
}
template<typename...argme>
void read(int &x,argme &...vv){
read(x),read(vv...);
}
const int N=1000100;
int a[N];
signed main(){
int T=read();
while(T--){
int n=read();
for(int i=1;i<=n;++i)a[i]=read();
int cnt=0;
for(int i=1;i<=n;++i)if(a[i]%2!=a[1]%2){cnt=1;break;}
if(!cnt)cout<<"0\n";
else{
sort(a+1,a+n+1);
int val;
for(int i=1;i<=n;++i)
if(a[i]&1)val=a[i];
int cnt=0;
for(int i=1;i<=n;++i)
if(~a[i]&1){
if(val>=a[i]){
++cnt;
a[i]+=val;
val=a[i];
}
else{
int p=n;
for(int j=n;j;--j)
if(~a[j]&1){
p=j;
break;
}
val+=a[p];
++cnt,++cnt;
a[p]+=val;
val=a[p];
--i;
}
}
cout<<cnt<<'\n';
}
}
}
C
对
可以发现大体上就是解一个方程组:
其中
求
其中
方程可以解得
时间复杂度为
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pb emplace_back
#ifdef __unix__
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
#define int long long
using namespace std;
int read(){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
void read(int &x){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
x=s*w;
}
template<typename...argme>
void read(int &x,argme &...vv){
read(x),read(vv...);
}
const int N=1000100;
int a[N];
signed main(){
int T=read();
while(T--){
int n=read(),m=read();
for(int i=1;i<=n;++i)a[i]=read();
vector<int>v;
sort(a+1,a+n+1);
for(int i=1;i<=n;++i)v.pb(a[i]%(m+m));
sort(v.begin(),v.end());
int mx=*max_element(a+1,a+n+1);
int res=-1;
if(v.back()-v[0]<m){
//mod 2m 同余 v.back()
//且>=mx
res=max(res,((mx-v.back()+m+m-1)/(m+m))*(m+m)+v.back());
}
for(int i=1;i<v.size();++i){
//从v[i]到v[i-1]+m+m
int cho=v[i-1]+m+m-v[i]+1;
if(cho<=m){
//mod 2m 同余 v[i-1]
//且>=mx
res=max(res,((mx-v[i-1]+m+m-1)/(m+m))*(m+m)+v[i-1]);
// cout<<i-1<<": "<<(mx-v[i-1]+m+m-1)/(m+m)<<'\n';
// int rres=mx-v[i-1];
// rres=(rres+m+m-1)/(m+m);
// res=max(res,rres);
}
}
cout<<res<<'\n';
}
}
D
考虑经典套路二分答案
考虑判定的时候 dp。定义
因此有初始条件
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pb emplace_back
#ifdef __unix__
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
using namespace std;
int read(){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
void read(int &x){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
x=s*w;
}
template<typename...argme>
void read(int &x,argme &...vv){
read(x),read(vv...);
}
const int N=1000100;
int a[N],n,k,f[N],g[N];
bool check(int p){
//需要有至少Q/2+1个数>=p
f[0]=0;g[0]=0;
int Q=n%k;if(!Q)Q=k;
// for(int i=1;i<=k;++i)g[i]=-1e9;
for(int i=1;i<=n;++i)f[i]=-1e9;
for(int i=1;i<=n;++i)if(a[i]>=p){
if((i-1)%k==0){
if(i-k>=0)f[i]=max(f[i-k],1);
else f[i]=1;
}else{
if(i-k>=0)
f[i]=max(f[i-1]+1,f[i-k]);
else
f[i]=f[i-1]+1;
}
}else{
if((i-1)%k==0){
if(i-k>=0)f[i]=max(f[i-k],-1);
else f[i]=-1;
}else{
if(i-k>=0)
f[i]=max(f[i-1]-1,f[i-k]);
else
f[i]=f[i-1]-1;
}
}
// for(int i=1;i<=n;++i)if(a[i]>=p){
// f[i]=g[(i-1+k)%k]+1;
// g[i%k]=max(g[i%k],f[i]);
// }
return f[n]>0;
}
signed main(){
int T=read();
while(T--){
n=read(),k=read();
for(int i=1;i<=n;++i)a[i]=read();
int l=1,r=1e9,best=-1;
while(l<=r){
int mid=l+r>>1;
if(check(mid))best=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",best);
}
}
F1
考虑忘了是哪一场远古 CF 的一个题套路,每
设第一次结束之后位于坐标
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pb emplace_back
#ifdef __unix__
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
#define int long long
using namespace std;
int read(){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
void read(int &x){
int s=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-w;
ch=getchar();
}
while(isdigit(ch))
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
x=s*w;
}
template<typename...argme>
void read(int &x,argme &...vv){
read(x),read(vv...);
}
const int N=1000100;
int a[N],n,k,f[N],g[N];
signed main(){
int T=read();
while(T--){
int n,k,w,h;read(n,k,w,h);
string s;cin>>s;
map<pair<int,int>,int>mp;
int x=0,y=0;
for(int i=0;i<n;++i){
if(s[i]=='L')--x;
else if(s[i]=='R')++x;
else if(s[i]=='U')++y;
else --y;
x=(x+w+w)%(w+w);
y=(y+h+h)%(h+h);
++mp[{x,y}];
}
int res=0;
for(int i=0;i<k;++i){
int _x=(-i*x%(w+w)+(w+w))%(w+w);
int _y=(-i*y%(h+h)+(h+h))%(h+h);
res+=mp[{_x,_y}];
}
cout<<res<<'\n';
}
}
本文来自博客园,作者:yhbqwq,转载请注明原文链接:https://www.cnblogs.com/yhbqwq/p/18342560,谢谢QwQ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)