前言

初中了没法打小学生比赛了。膜拜小学但是吊打我的巨佬。但是虽然初中仍然能写炸 T1 并且只能口胡到 T2。

T1 矩形纸片

题目链接

http://czoj.com.cn/p/P1672

来源 CZOJ

题目思路

题面中的 $10^9$ 完全吓唬人用的。

考虑到 $1\leq a,b,c,d,x,y\leq 1000$,最暴力的方法开个 $2000\times 2000$ 大小的数组存每个位置是否覆盖。

时间复杂度 $\mathcal O(a\times b+c\times d+2000^2)$。

或者考虑容斥,用第一个的覆盖面积加上第二个的覆盖面积减去重合面积。特判如果 $(x,y)$ 与第一个纸片没有重合就没有重合面积。


Solution by @cyx2009

完整代码

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,c,d,x,y;
    cin>>a>>b>>c>>d>>x>>y;
    cout<<(a*b)+(c*d)-(x>a||y>b?0:min(a-x+1,c)*min(b-y+1,d))<<endl;   
    return 0;
}


Code by @cyx2009

T2 奶牛农场

题目链接

http://czoj.com.cn/p/P1673

来源 CZOJ

题目思路

考虑贪心,对于每个为 $0$ 的位置只设置比前面高 $1$,尽可能的让后面的位置选的高度数量更多。


Solution by @cyx2009

完整代码

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int ans[100020];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>ans[i];
        if(ans[i]==0)ans[i]=ans[i-1]+1;
    }
    for(int i=1;i<=n;i++)
    {
        if(ans[i]<=ans[i-1]||ans[i]>1000000000||ans[i]<=0)
        {
            puts("NO");
            return 0;
        }
    }
    puts("YES");
    for(int i=1;i<=n;i++)
    {
        cout<<ans[i]<<" ";
    }
    cout<<endl;
    return 0;
}


Code by @cyx2009

最后修改:2023 年 05 月 22 日
v我50吃疯狂星期四