目录
Educational Codeforces Round 128 (Rated for Div. 2)
Codeforces Round #791 (Div. 2)
Codeforces Round #792 (Div. 1 + Div. 2)
Educational Codeforces Round 128 (Rated for Div. 2)
A |
思维,区间求交,swap维护大值
void solved()
{
int l1, l2, r1, r2;
cin >> l1 >> r1 >> l2 >> r2;
if (l1 > l2)swap(l1, l2), swap(r1, r2);
int t=get(l1, r1, l2, r2);
if (t >= 0)printf("%d\n", l2);
else printf("%d\n", l1 + l2);
//priority_queue<ll, vector<ll>, greater<ll>> heap;
;
}
B |
只有一个机器人能到左上角,多个到达会改变x,y
void solved() {
int n, m;
cin >> n >> m;
char s[5][5];
int x = n - 1, y = m - 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> s[i][j],
x = s[i][j] == 'R' ? min(x, i) : x,
y = s[i][j] == 'R' ? min(y, j) : y;
if (s[x][y] == 'R')
cout << "YES\n";
else
cout << "NO\n";
}
Codeforces Round #791 (Div. 2)
A |
特判奇数,再考虑偶数,因为要么4轮子,要么6轮子,考虑全是4轮或6轮,枚举找规律。。
void solved()
{
ll n;
cin >> n;
if (n & 1||n<4)puts("-1");
else
{
cout << n / 6 + (n%6!=0) << " " << n / 4 << endl;
}
}
Codeforces Round #792 (Div. 1 + Div. 2)
A |
思维,区间长度为2特判,其余情况找最大值
string s; cin >> s;
if (s.size() == 2)printf("%c\n", s[1]);
else {
int mx = 2e9;
for (auto c : s)mx = min(mx, c - 48);
printf("%d\n", mx);
}
B |
思维,意思是取模的逆运算,只要找最大值
然后其他扩大1倍就可以满足条件了
int a, b, c; cin >> a >> b >> c;
int mx; mx = max(a, b); mx = max(mx, c);
int x, y, z;
if (mx == c)
{
z = c;
y = b + z, x = a + y;
printf("%d %d %d\n", x, y, z);
}
else if (mx == b)
{
y = b;
x = a + y,z=c+x;
printf("%d %d %d\n", x, y, z);
}
else if (mx == a)
{
x = a;
z = c + x,y=b+z;
printf("%d %d %d\n", x, y, z);
}
周赛同济
A | 盒饭盲盒 |
直接冰冷给出解释,做题做少了,不知道怎么把分子分母全部质数
其实就是维护分子分母全部为整数再取最小公因数
由二项分布容易知道答案怎么来的,分子分母同时(去分母)转化成整数
求概率记得1.0*
void solved()
{
ll n,s,r;cin>>n>>s;r=n-s;
double t=1.0*s/r;
ll a=r*r,b=r*r+3*s*r+3*s*s;
ll x=gcd(a,b);
printf("%lld/%lld\n",a/x,b/x);
}
反面考虑更快
K | 乐观的R家族 |
思路清楚,但是对STL容器使用不熟练,暴力模拟即可
void solved()
{
int n,m;cin>>n>>m;
string s[1010];string res;
for(int i=0;i<n;i++)cin>>s[i];
for(int i=0;i<m;i++)cin>>q[i];
for(int i=0;i<m;i++)
{
map<char,int> mp;
for(int j=0;j<n;j++)
mp[s[j][i]]++;
int mx=0;char ch;
for(auto& [c,v]:mp)
{
if(v>mx)mx=v,ch=c;
}
res+=ch;
}
ll ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
//cout<<ans<<endl;
if(s[i][j]==res[j])ans+=q[j];
}
;
printf("%lld\n",ans);
}
C | 攻城 |
模拟数据后特判
一个是第一次结束,n==1特判
还有一个公式规律
if(s%(n+6)==0&&s/(n+6)<=min||n==1)
printf("YES\n");
else printf("NO\n");
G | 归零 |
前缀和优化卡数据范围,真的笑死
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
maxv=max(a[i],maxv);
sum[i]=sum[i-1]+a[i];
}
for(int tt=0;tt<m;tt++){
cin>>l>>r>>k;
if(k/2>=maxv)cout<<sum[r]-sum[l-1]<<endl;
else {
ll ans=0;
for(int i=l;i<=r;i++){
ans+=min(a[i],k-a[i]);
}cout<<ans<<endl;
}
}
牛客小白月赛50
A 直接模拟
B 递归,贪心
void solved()
{
int n,x;cin>>n>>x;
int cnt=0;
while(n>0)
{
if(n-n/2<x)n-=x;
else n/=2;
cnt++;
}
;
print(cnt);puts("");
}
C 题目意思是任意X不是来自数组,WA了几发
考虑%2最优,特判全0,(1,0序列)
答案0,1,2
void solved()
{
int n;cin>>n;
;
ll sum=0;
bool ok=0;
for(int i=1;i<=n;i++){cin>>q[i];if(q[i]==1)ok=1;sum+=q[i];}
if(sum==0){puts("0");return;}
int cnt=0;
int mx=2e9;
sort(q+1,q+n+1,cmp);
//for(int i=1;i<=n;i++)cout<<q[i]<<" ";cout<<endl;
for(int i=1;i<=n;i++)
{
if(q[i]>=2)mx=min(mx,q[i]);
}
int ans=0;
// cout<<mx<<endl;
for(int i=1;i<=n,q[i];i++)
{ans+=q[i]%mx;}
if(ans==0){puts("1");return;}
if(ok&&q[1]==1){puts("1");return;}
else
{
{puts("2");return;}
}
}
D 生日
注意到每个i只能来自2i和2i+1最多组合为4
考虑方案数2^(n-3),2^(n-2)
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>g[i];
pr[0]=1;
for(int i=1;i<=n;i++)
pr[i]=pr[i-1]*2ll%mod;
LL ans=0;
for(int i=1;i<=n;i++)
{
if(2*i>n) break;
else if(2*i+1>n)
{
ans=(ans+pr[n-2]*(g[i]^g[i*2]))%mod;
}
else
{
ans=(ans+pr[n-3]*((g[i]^g[i*2])+(g[i]^g[i*2+1])+(g[i*2]^g[i*2+1])+(g[i]^g[i*2]^g[i*2+1])))%mod;
}
}
printf("%lld",ans);
return 0;
}