Codeforces #536 A..D 题解

foreword

ummm... 开始前几个小时被朋友拉来打了这一场,总体海星,题目体验极佳,很符合口味,稍微有点点简单了不知道是不是因为是 New Year Round,很快就打到了 D,但是题目阅读难度有点点大,Alice 和 Bob 永远离不开的博弈论,呼应去年的博弈论。

少有的评测机出锅(也有可能是我打的少),一片 In queue 了大概 40 分钟,加时了以为会继续 Rated,结果又加时又 Unrated 可还行。太久不打有点不熟悉规则,手有点滑,A 题打成了 ... map[i+xd[k]][j+xd[k]] ...,调了十分钟。。还好 pretest 比较给力没有让我 fst。。另外就是 CF 上面的 printf 64 位整数输出用法的提示,%I64d 和 %l64d 傻傻分不清楚,结果 wa on test 1,又因为评测机锅了,过了一个多小时才看到。

总体来说,题目体验很好,这次的平台体验稍差。题目很经典,能学到很多。

A

没啥好说的,\(n^2\) 判一下相邻几个点的值就行了。。

#include<cstdio>
const int MAXN=500+5;
int xd[5]={0,-1,-1,1,1},yd[5]={0,-1,1,-1,1};
int n,cnt;char c[MAXN][MAXN];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%s",c[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            for(int k=0;k<5;k++)
                if(c[i+xd[k]][j+yd[k]]!=‘X‘) goto exit;
            cnt++;
            exit:;
        }
    printf("%d\n",cnt);
    return 0;
}

B

一个硬模拟,均摊 \(O(n)\)。

#include<cstdio>
#include<algorithm>
const int MAXN=100000+5;
typedef long long ll;
struct data{ll price,id;};
int n,m,ptr;data d[MAXN];long long cost,cnt[MAXN],price[MAXN],x,y,tot;
bool comp(data a,data b){return a.price==b.price?a.id<b.id:a.price<b.price;}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%I64d",&cnt[i]);
    }
    for(int i=1;i<=n;i++)
        scanf("%I64d",&price[i]);
    for(int i=1;i<=n;i++)
    {
        d[i].id=i;
        d[i].price=price[i];
        tot+=cnt[i];
    }
    std::sort(d+1,d+n+1,comp);
    ptr=1;long long q;
    for(int i=1;i<=m;i++)
    {
        scanf("%I64d %I64d",&x,&y);
        cost=0;
        if(cnt[x])
        {
            q=std::min(y,cnt[x]);
            y-=q;
            cnt[x]-=q;
            cost=q*price[x];
        }
        while(y&&ptr<=n)
        {
            q=std::min(y,cnt[d[ptr].id]);
            y-=q;
            cnt[d[ptr].id]-=q;
            cost+=q*price[d[ptr].id];
            if(!cnt[d[ptr].id])ptr++;
        }
        if(!y) printf("%I64d\n",cost); else printf("0\n");
    }
    return 0;
}

C

可以说是数学题了,最大配最小总答案最小。

#include<cstdio>
#include<algorithm>
const int MAXN=300000+5;
int n;long long ans,num[MAXN];//org:dp[MAXN][MAXN] len is i, start from j
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%I64d",&num[i]);
    std::sort(num+1,num+n+1);
    for(int i=1,j=n;i<=n/2;i++,j--)
        ans+=(num[i]+num[j])*(num[i]+num[j]);
    printf("%I64d\n",ans);
    return 0;
}

D

因为可以走回去,每次从所有已访问的点中选一个未访问的且能拓展出去的点,且点序号最小的,可以保证字典序最小。

# include<cstdio>
# include<cstring>
# include<algorithm>
# include<queue>
using namespace std;
const int N = 1e5 + 5;
priority_queue <int> q;
int st[N],to[N << 1],nx[N << 1],vis[N];
int n,m,tot;
inline void add(int u,int v)
{
    to[++tot] = v,nx[tot] = st[u],st[u] = tot;
    to[++tot] = u,nx[tot] = st[v],st[v] = tot;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i = 1 ; i <= m ; ++i)
    {
        int u,v; scanf("%d%d",&u,&v);
        add(u,v);
    } q.push(-1),vis[1] = 1;
    while (!q.empty())
    {
        int x = -q.top(); q.pop(); printf("%d ",x);
        for (int i = st[x] ; i ; i = nx[i])
        if (!vis[to[i]]) vis[to[i]] = 1,q.push(-to[i]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ksyx/p/cf-536-solution.html

时间: 2024-10-25 17:26:50

Codeforces #536 A..D 题解的相关文章

codeforces#536题解

CodeForces#536 A. Lunar New Year and Cross Counting Description: Lunar New Year is approaching, and you bought a matrix with lots of "crosses". This matrix \(M\) of size \(n \times n\) contains only 'X' and '.' (without quotes). The element in t

codeforces A. Supercentral Point 题解

One day Vasya painted a Cartesian coordinate system on a piece of paper and marked some set of points(x1,?y1),?(x2,?y2),?...,?(xn,?yn). Let's define neighbors for some fixed point from the given set (x,?y): point (x',?y') is (x,?y)'s right neighbor,

codeforces 536 c Tavas and Pashmaks

题意: 在一个运动比赛中有两种跑道,现在有n个选手,给出每个选手的在两种跑道上的速度,(ui,vi),求哪些选手可能赢得比赛. 限制: 1 <= n <= 2*1e5 思路: 维护一个类似凸包的一段. /*codeforces 536 c Tavas and Pashmaks 题意: 在一个运动比赛中有两种跑道,现在有n个选手,给出每个选手的在两种跑道上的速度,(ui,vi),求哪些选手可能赢得比赛. 限制: 1 <= n <= 2*1e5 思路: 维护一个类似凸包的一段. */

codeforces New Year Present 题解

The New Year is coming! That's why many people today are busy preparing New Year presents. Vasily the Programmer is no exception. Vasily knows that the best present is (no, it's not a contest) money. He's put n empty wallets from left to right in a r

codeforces Sereja and Dima 题解

Sereja and Dima play a game. The rules of the game are very simple. The players have n cards in a row. Each card contains a number, all numbers on the cards are distinct. The players take turns, Sereja moves first. During his turn a player can take o

codeforces D. Ice Sculptures 题解

The Berland University is preparing to celebrate the 256-th anniversary of its founding! A specially appointed Vice Rector for the celebration prepares to decorate the campus. In the center of the campus n ice sculptures were erected. The sculptures

Educational Codeforces Round 64部分题解

Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点个数是否有限,如果有限,输出. 很明显当正方形套三角形或者三角形套正方形是交点个数是无限的(因为有一条边相交) 其他图形的嵌套交点个数比较好判断,不多赘述 但是注意坑点: 当按照矩形,园,三角这样的顺序是,三角与圆的一个交点是与圆和正方形的交点重合的,判一下就好了 #include<cstdio>

Codeforces 7E - Defining Macros 题解

目录 Codeforces 7E - Defining Macros 题解 前言 做法 程序 结尾 Codeforces 7E - Defining Macros 题解 前言 开始使用博客园了,很想写点东西.(逃 这是一道Codeforces题目. 做法 一道大模拟 相信大家都看得懂题目意思,我就不赘述了. 首先我们读进来\(n\)行,对于每一行,我们把它初步分成一下四块内容: #号 define 宏的名字 宏的表达式 注意:#和define中间可能会有空格,define和宏的名字,宏的名字和宏

Codeforces Round #616 部分题解

老年选手诈尸? A,B 咕了. C - Prefix Enlightenment 很容易看出这个限制条件可以推出每个点最多被两个集合包含.按照套路,很容易联想到给这两个集合连一条边,表示他们的状态要相同/不同. 因为保证了有解,所以从左往右扫的时候拿并查集维护一下每个连通块的二分图情况,选较小的那一边. 如果只被一个集合覆盖,那么就相当于强制这个集合选/不选,在做并查集的时候特判一下即可. 代码咕了. D - Coffee Varieties (hard version) 作为一名憨憨,做法当然