Codeforces Round #815 (Div. 2)

Codeforces Round #815 (Div.2)

「CF1720A」 Burenka Plays with Fractions

Codeforces 链接

Solution#

每次可以对分子分母同时乘上 k,相当于对分数乘上 k 或除以 k。令 p=ab,q=cd,因为 p,qQ,所以 qpQ,可以发现答案为 qp 分子分母不为 1 的个数

Code#

点击查看代码
#include<bits/stdc++.h>
#define MOD (1000000007)
#define ll long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define lowbit(x) (x&-x)
#define Swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
void read(ll &x)
{
	register char ch=0;register bool f=0;x=0;
	while(ch<'0'||ch>'9'){f|=!(ch^'-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?-x:x;
}
void write(ll x,bool bk)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(!x)
	{
		if(!bk) putchar('0');
		return;
	}
	write(x/10,1);
	putchar((x%10)^48);
}
void print(ll x,char ch)
{
	write(x,0);
	if(ch) putchar(ch);
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll lcm(ll x,ll y){return x*y/gcd(x,y);}
ll t,a,b,c,d;
int main()
{
    //freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    read(t);
    while(t--)
    {
        read(a),read(b),read(c),read(d);
        if(!((a*d)^(b*c)))
        {
            print(0,'\n');
            continue;
        }
        if((!a)||(!c))
        {
            print(1,'\n');
            continue;
        }
        if(a*d>=b*c) Swap(a,c),Swap(b,d);
        if(!((b*c)%(a*d))) print(1,'\n');
        else print(2,'\n');
    }
}

「CF1720B」 Interesting Sum

Codeforces 链接

Solution#

对于 [l,r],其答案为

max(maxi=1lai,maxi=r+1nai)min(mini=1lai,maxi=r+1nai)+maxi=lraimini=lrai

发现如果能够使得最大值与次大值分隔开,最小值与次小值分隔开,就能达到最大。考虑将最大与次大分开可以在两者间选择一个间隔分开,最小与次小同理,可以得到两个不同的分隔线,两者间即为区间 [l,r]。所以一定可以分隔。直接扫一遍即可。

Code#

点击查看代码
#include<bits/stdc++.h>
#define MOD (1000000007)
#define ll long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define lowbit(x) (x&-x)
#define Swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
void read(ll &x)
{
	register char ch=0;register bool f=0;x=0;
	while(ch<'0'||ch>'9'){f|=!(ch^'-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?-x:x;
}
void write(ll x,bool bk)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(!x)
	{
		if(!bk) putchar('0');
		return;
	}
	write(x/10,1);
	putchar((x%10)^48);
}
void print(ll x,char ch)
{
	write(x,0);
	if(ch) putchar(ch);
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll lcm(ll x,ll y){return x*y/gcd(x,y);}
ll t,n,smn,mn,smx,mx;
int main()
{
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    read(t);
    while(t--)
    {
        smn=LONG_LONG_MAX,
        mn=LONG_LONG_MAX;
        smx=LONG_LONG_MIN;
        mx=LONG_LONG_MIN;
        read(n);
        for(ll i=1;i<=n;i++)
        {
            ll x;
            read(x);
            if(x>mx)
            {
                smx=mx;
                mx=x;
            }
            else if(x>smx) smx=x;
            if(x<mn)
            {
                smn=mn;
                mn=x;
            }
            else if(x<smn) smn=x;
        }
        print(mx+smx-mn-smn,'\n');
    }
}

「CF1720C」 Corners

Codeforces 链接

Solution#

考虑如果存在两个为 0 的相邻元素(相邻指与上下左右左上右上左下右下相邻),可以以此为第一步操作,之后这个条件一定满足,每次选择两个为 0 的相邻元素与 1 搭配每次可以使得 1 的数量减 1,此时答案为 1 的数量。
否则如果存在 0 元素,第一步可以选择 0 和其他元素消掉,规约到第一个问题,此时答案为 1 的数量减 1
如果不存在 0 元素,第一步可以选择任意 L 消掉,规约到第一个问题, 此时答案为 1 的数量减 2

Code#

点击查看代码
#include<bits/stdc++.h>
#define MOD (1000000007)
#define ll long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define lowbit(x) (x&-x)
#define Swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
void read(ll &x)
{
	register char ch=0;register bool f=0;x=0;
	while(ch<'0'||ch>'9'){f|=!(ch^'-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?-x:x;
}
void write(ll x,bool bk)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(!x)
	{
		if(!bk) putchar('0');
		return;
	}
	write(x/10,1);
	putchar((x%10)^48);
}
void print(ll x,char ch)
{
	write(x,0);
	if(ch) putchar(ch);
}
ll t,n,m;
ll cnt[2],a[505][505];
bool flg;
int main()
{
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    read(t);
    while(t--)
    {
        flg=0;
        memset(cnt,0,sizeof(cnt));
        read(n),read(m);
        for(ll i=1;i<=n;i++)
        {
            for(ll j=1;j<=m;j++)
            {
                a[i][j]=getchar()^48;
                ++cnt[a[i][j]];
            }
            getchar();
        }
        for(ll i=1;i<n;i++)
        {
            for(ll j=1;j<m;j++)
            {
                if((!a[i][j])&&(!a[i+1][j+1]))
                {
                    flg=1;
                    break;
                }
            }
        }
        for(ll i=1;i<n;i++)
        {
            for(ll j=2;j<=m;j++)
            {
                if((!a[i][j])&&(!a[i+1][j-1]))
                {
                    flg=1;
                    break;
                }
            }
        }
        for(ll i=1;i<n;i++)
        {
            for(ll j=1;j<=m;j++)
            {
                if((!a[i][j])&&(!a[i+1][j]))
                {
                    flg=1;
                    break;
                }
            }
        }
        for(ll i=1;i<=n;i++)
        {
            for(ll j=1;j<m;j++)
            {
                if((!a[i][j])&&(!a[i][j+1]))
                {
                    flg=1;
                    break;
                }
            }
        }
        if(flg) print(cnt[1],'\n');
        else if(cnt[0]) print(cnt[1]-1,'\n');
        else print(cnt[1]-2,'\n');
    }
}

「CF1720D1」 Xor-Subsequence (easy version)

Codeforces 链接

Solution#

fi 为以 ai 结尾的最长子序列的长度,可以写出 O(n2) 的朴素状态转移方程式

fi=maxj=0i1fj[aji<aij]+1

考虑·优化,注意到 esay verisonai200 的限制,小于 200 的数可能为 1 的二进制位只有第 07 位。所以根据异或的性质 aji<aij 每次将 i,j 与至多改变后面八位,所以符合要求的 i,j 一定满足 ij512。根据这个性质进行转移,复杂度优化至 O(Vn),其中 Vai 的值域。

Code#

点击查看代码
#include<bits/stdc++.h>
#define MOD (1000000007)
#define ll long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define lowbit(x) (x&-x)
#define Swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
void read(ll &x)
{
	register char ch=0;register bool f=0;x=0;
	while(ch<'0'||ch>'9'){f|=!(ch^'-');ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?-x:x;
}
void write(ll x,bool bk)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(!x)
	{
		if(!bk) putchar('0');
		return;
	}
	write(x/10,1);
	putchar((x%10)^48);
}
void print(ll x,char ch)
{
	write(x,0);
	if(ch) putchar(ch);
}
ll t,n,ans;
ll a[300005],dp[300005];
bool flg;
int main()
{
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    read(t);
    while(t--)
    {
        ans=0;
        read(n);
        for(ll i=0;i<n;i++)
        {
            read(a[i]);
            dp[i]=1;
            for(ll j=i-1;j>=max(0ll,i-512);j--)
                if((a[j]^i)<(a[i]^j))
                    dp[i]=max(dp[i],dp[j]+1);
            ans=max(ans,dp[i]);
        }
        print(ans,'\n');
    }
}

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/16603477.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

你可以在这里自定义其他内容

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/16603477.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   little_pinkpig  阅读(57)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu