首页 > 其他分享 >Codeforces Round 982 (Div. 2)

Codeforces Round 982 (Div. 2)

时间:2024-10-30 20:59:12浏览次数:1  
标签:min 982 ll Codeforces long int ans Div include

Codeforces Round 982 (Div. 2) 总结

A

猜结论,最后的图形的周长都能移成一个长方形的周长,这个长方形就是 \(w\) 和 \(h\) 的最大值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=1;
int n;
int w,h;
int x,y;
void solve()
{
    x=y=0;
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>w>>h;
        x=max(x,w),y=max(y,h);
    }
    cout<<2*(x+y)<<'\n';
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

B

首先,Stalin Sort 后的结果是会产生单调不下降。对于 \(a_i\),要保留 \(a_i\) 的话,\(a_i\) 前面不能有数,且后面不能有大于 \(a_i\) 的数。枚举 \(a_i\) 分别计算要删去的数,复杂度为 \(O(n^2)\)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=2005;
int n;
int a[N];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int ans=n;
    for(int i=1;i<=n;i++)
    {
        int cnt=i-1;
        for(int j=i+1;j<=n;j++) cnt+=(a[j]>a[i]);
        ans=min(ans,cnt);
    }
    cout<<ans<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

C

转化一下条件,若有 \(1 \le i \le n\),\(a_i+i-1=|a|\),调整大小为 \(a_i+i-1+i-1\)。可以用 dfs,用 map 标记是否搜过,这样每个值最多进去搜索一次,出去一次,复杂度为 \(O(n)\)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map> 

using namespace std;
typedef long long ll;
const int N=3e5+5;
int n;
ll a[N];
ll ans;
typedef pair<ll,int> PLI;
PLI b[N];
#define fi first 
#define se second 
map<ll,bool> H;
void dfs(ll siz)
{
    if(H.count(siz)) return ;
    H[siz]=1;
    ans=max(ans,siz);
    if(siz>b[n].fi) return ;
    PLI tmp={siz,0};
    int l=lower_bound(b+1,b+n+1,tmp)-b;
    tmp.se=n;
    int r=upper_bound(b+1,b+n+1,tmp)-b-1;
    for(int i=l;i<=r;i++)
    {
        if(b[i].se==0) continue;
        dfs(siz+b[i].se);
    }
}
void solve()
{
    H.clear();
    cin>>n;
    ans=n;
    for(int i=1;i<=n;i++) cin>>a[i],b[i]={a[i]+i-1,i-1};
    sort(b+1,b+n+1);
    dfs(n);
    cout<<ans<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

D1

观察到诡异的数据范围 \(nm \le 3e5\),不难想到应该是个 \(O(nm)\) 的解法。

考虑 dp。设 \(f_{i,j}\) 为 \(k\) 的值为 \(i\) 时,\(a\) 剩下的第一个元素的下标为 \(j\) 的最小代价。

  • 操作一:\(j\) 不变,\(i\) 变为 \(i+1\),则有 \(f_{i+1,j}=\min{f_{i,j}}\)。
  • 操作二:查找第一个位置 \(c\) 满足 \(\sum_{t=i}^c a_t > b_i\),则有 \(f_{i,c}=\min{f_{i,j}+m-i}\)。

答案就是 \(\min_{i=1}^m f_{i,n+1}\)。

然后因为 \(n,m \le 3e5\),不好开数组,所以要么用 vector,要么用滚动数组。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=3e5+5;
const ll inf=1e18;
int n,m;
ll a[N],b[N];
ll f[2][N];
ll ans=inf;
void solve()
{
    ans=inf;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1];
    for(int i=1;i<=m;i++) cin>>b[i];
    for(int j=1;j<=n+1;j++) f[1][j]=inf;
    f[1][1]=0;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n+1;j++) f[i+1&1][j]=inf;
        for(int j=1;j<=n;j++)
        {
            int k=upper_bound(a+j,a+n+1,b[i]+a[j-1])-a;
            if(k>j) f[i&1][k]=min(f[i&1][k],f[i&1][j]+m-i);
            f[i+1&1][j]=min(f[i+1&1][j],f[i&1][j]);
        }
        ans=min(ans,f[i&1][n+1]);
    }
    cout<<(ans==inf ? -1 : ans)<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

标签:min,982,ll,Codeforces,long,int,ans,Div,include
From: https://www.cnblogs.com/zhouruoheng/p/18516562

相关文章

  • CSS(块级,行级,行块级,display,div和span,盒子模型,文档流,浮动)
    块级,行级,行块级块级:无论内容都是,都会独自占据一行的.可以设置宽高,若没有设置宽高,默认于父级标签相同.例如:<p>,<h1>,<ul>,<ol>,<hr/>等.行级:只占自身大小的标签,不会占一行.设置宽高无效.例如:<font>,<b>,<i>,<a>等.行块级:不会占一行,而且可以设置宽高.例如:<inp......
  • # [Educational Codeforces Round 171](https://codeforces.com/contest/2026)
    EducationalCodeforcesRound171D.SumsofSegments定义四个前缀和:\(s_i=a_1+a_2+\dots+a_i\)\(u_i=s_1+s_2+\dots+s_i\)\(t_i=s(i,i)+s(i,i+1)+\dots+s(i,n)\)\(ts_i=t_1+t_2+\dots+t_i\)\(s_i\)为\(a_i\)的前缀和,\(u_i\)为\(s_i\)的前缀和,\(t_i\)为分块之后第......
  • Codeforces 4 A-D
    题面ABCD难度:红橙橙黄题解A题目大意:判断一个正整数\(w\)能否表示成两个正偶数之和。解题思路:考虑分类讨论\(w\)。对于\(1\)和\(2\),显然为NO;对于\(w\ge3\),考虑将其表示为\(x+2\)。根据题意,若\(x\)为偶数,则答案显然必为YES;否则必然为NO。因为\(......
  • [CodeForces] CF628 题解
    A.TennisTournamentLink-CFLink-Luogu【题目大意】\(n\)个选手进行若干场比赛,胜者保留,败者淘汰。每场比赛为两人。每场比赛每个人需要\(b\)瓶水,裁判需要\(1\)瓶水。每个人参加这些比赛总共需要\(p\)条毛巾。注意:洛谷题面翻译有误!建议看英文版。【解题思路】每场比......
  • Educational Codeforces Round 171 (Rated for Div. 2) 10.28 ABCD题解
    EducationalCodeforcesRound171(RatedforDiv.2)10.28(ABCD)题解A.PerpendicularSegments数学(math)计算几何(geometry)题意:给定一个\(X,Y,K\)。需要求解出二维坐标系中的四个点\(A,B,C,D\),满足:\(0\leqA_x,B_x,C_x,D_x\leqX\),\(0\leqA_y,B_y,C_y,D_y\leqY\)。并......
  • Educational Codeforces Round 171 (Div. 2)
    EducationalCodeforcesRound171(Div.2)A猜结论,两条边的最小值最大时,两条边相等。所以取\(min(x,y)\)为边长的正方形,对角线就是所求。#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>usingnamespacestd;intx,y,k;voidsolve(){......
  • Codeforces Global Round 27
    CodeforcesGlobalRound27总结A将红色的位置\((r,c)\)移走,分为三块来考虑,蓝色的块移动\(m-c\),黄色的块移动\(m*(n-r)\),绿色的块移动\((m-1)*(n-r)\)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#in......
  • 2024.10.19 CF2030(Div.2)
    比赛链接Solved:5/8Upsolved:6/8Rank:166E.MEXmizetheScore题意定义一个集合的分数为:将它分成若干个子集,mex和的最大值。(mex从0开始算)给n个数,求所有非空子集的分数之和。\(n\leq2\times10^5\)题解对一个确定的集合,它的划分方式一定是每次分出去一个最长的{0,......
  • 2024.10.14 Codeforces Round 978 (Div. 2)
    比赛链接Solved:4/7Upsolved:5/7Rank:447(rated343)D2.Asesino(HardVersion)题意:有n个人,除了一个卧底以外,其他人或者只会说真话,或者只会说谎,且他们知道彼此的身份。卧底只会说谎,但其他人都认为他只会说真话。现在你可以进行若干次询问,每次询问形如问第i个人第j个人是什么......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解(A-C)
    EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)这场ABC全都犯病了(悲伤)目录EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)目录A.PerpendicularSegmentsB.BlackCellsC.ActionFiguresA.PerpendicularSegments大意给你一个......