Codeforces Round#509 Div.2翻车记

  A:签到

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 1010
int n,a[N];
int main()
{
    n=read();
    for (int i=1;i<=n;i++) a[i]=read();
    sort(a+1,a+n+1);
    cout<<a[n]-a[1]+1-n;
    return 0;
}

  B:签到

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define ll long long
ll a,b,x,y;
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
int main()
{
    cin>>a>>b>>x>>y;
    ll tmp=gcd(x,y);x/=tmp,y/=tmp;
    cout<<min(a/x,b/y);
    return 0;
}

  C:贪心,每次选择最后一次喝咖啡最早的一天,看是否能将此次喝咖啡加入这天,不行就新开一天。堆维护即可。开始的时候写了半天线性的一直wa on 9,掉rating瞬间稳了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 200010
int n,m,k,tot,ans[N];
struct data{int x,i;
    bool operator <(const data&a) const
    {
        return x<a.x;
    }
}a[N];
struct data2{int id,tim;
    bool operator <(const data2&a) const
    {
        return tim>a.tim;
    }
};
priority_queue<data2> q;
int main()
{
    n=read(),m=read(),k=read()+1;
    for (int i=1;i<=n;i++) a[i].x=read(),a[i].i=i;
    sort(a+1,a+n+1);
    for (int i=1;i<=n;i++)
    {
        if (q.empty()||q.top().tim+k>a[i].x)
        {
            tot++;ans[a[i].i]=tot;
            q.push((data2){tot,a[i].x});
        }
        else
        {
            ans[a[i].i]=q.top().id;
            data2 y=q.top();q.pop();
            q.push((data2){y.id,a[i].x});
        }
    }
    cout<<tot<<endl;
    for (int i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}

  D:按间隔长度尺取即可。没看到没有相交段,惨惨。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 200010
int n,m,cnt,c[N],d[N],ans,t=0;
struct data{int x,y;
    bool operator <(const data&a) const
    {
        return x<a.x;
    }
}a[N],b[N];
int main()
{
    n=read(),m=read();
    for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
    sort(a+1,a+n+1);
    for (int i=1;i<=n;i++)
    {
        int x=a[i].y,t=i;
        while (t<n&&a[t+1].x<=x) t++,x=max(x,a[t].y);
        cnt++,b[cnt].x=a[i].x,b[cnt].y=x;
        i=t;
    }
    for (int i=1;i<cnt;i++)
    t++,c[t]=b[i].y-b[i].x,d[t]=b[i+1].x-b[i].y;
    c[++t]=b[cnt].y-b[cnt].x;
    for (int i=1;i<=t;i++) c[i]+=c[i-1];
    for (int i=1;i<t;i++) d[i]+=d[i-1];
    ans=c[1]+m;
    int x=0;
    for (int i=1;i<t;i++)
    {
        while (x+1<t&&d[x+1]-d[i-1]<m) x++;
        ans=max(ans,c[x+1]-c[i-1]+m);
    }
    cout<<ans;
}

  E:容易发现任意一条边的两端总有一端包含最大值,先把这个判掉。不妨设n号点为树根,此时考虑n-1号点,其与n号点的距离就应为n-1号点的出现次数。类似地发现构造一个链或者菊花就好了,构造完再判断是否合法。n<=1000可能是为了写起来舒服一点。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 1010
int n,a[N],b[N],cnt[N],tree[N],x;
int main()
{
    n=read();
    for (int i=1;i<n;i++)
    {
        a[i]=read(),b[i]=read();cnt[a[i]]++;
        if (b[i]!=n) {printf("NO\n");return 0;}
    }
    tree[1]=n;x=1;
    for (int i=n-1;i;i--)
    if (cnt[i]) tree[x+=cnt[i]]=i;
    for (int i=n-1;i>=1;i--)
    if (!cnt[i])
        for (int j=1;j<=n;j++)
        if (!tree[j]) {tree[j]=i;break;}
    for (int i=1;i<n;i++)
    {
        int x=0;
        for (int j=i+1;j<=n;j++) x=max(x,tree[j]);
        cnt[x]--;
        if (cnt[x]<0) {printf("NO\n");return 0;}
    }
    printf("YES\n");
    for (int i=1;i<n;i++) cout<<tree[i]<<‘ ‘<<tree[i+1]<<endl;
}

  F:比赛时看错题了以为是找最长的交替等差子序列,这拿头做啊。结束半个小时了才发现。考虑如何选取公差,若d=a*b且b是奇数,那么d=a一定会更优。所以只枚举2的幂次作为公差然后map存一下取模的结果就行了。注意ans初值设成2,因为可能存在横坐标相同的点。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 100010
int n,m,x,y,a[N],b[N],ans=2;
map<int,int> f,g;
int main()
{
    n=read(),x=read();
    for (int i=1;i<=n;i++) a[i]=read();
    m=read(),y=read();
    for (int i=1;i<=m;i++) b[i]=read();
    for (int x=1;x<=1E9;x<<=1)
    {
        f.clear();g.clear();
        for (int i=1;i<=n;i++) f[a[i]%(x<<1)]++;
        for (int i=1;i<=m;i++) g[b[i]%(x<<1)]++;
        for (int i=1;i<=n;i++)
        ans=max(ans,f[a[i]%(x<<1)]+g[(a[i]+x)%(x<<1)]);
        for (int i=1;i<=m;i++)
        ans=max(ans,g[b[i]%(x<<1)]+f[(b[i]+x)%(x<<1)]);
    }
    cout<<ans;
}

  总体是一场readforces&speedforces。于是就翻车了。当然自己还是弱爆。

原文地址:https://www.cnblogs.com/Gloid/p/9657696.html

时间: 2024-11-05 22:02:07

Codeforces Round#509 Div.2翻车记的相关文章

Codeforces Round#500 Div.2 翻车记

A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=

Codeforces Round #485 Div. 1 vp记

A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define int long long #d

Codeforces Round #535 (Div. 3)小上分记

Codeforces Round #535 (Div. 3)小上分记 前言 被拉去买新年衣服了,导致半小时后才进场. 虽然做了4道题,但是rating还是涨得不多. 用predictor看了rating变化后心灰意冷,不看E题了. A ...800的难度. B 本来还在想要不要用什么STL.后来发现直接用桶就行了.然后就可以水过了. C 题意差点理解不了. 就6种情况都去考虑一下,找最小代价的即可.不要考虑少了. 每次都是\(O(n)\)的,所以能搞. D 贪心地换字母即可. E 坑.待填. 原

Codeforces Round #244 (Div. 2)

A. Police Recruits B. Prison Transfer A,B两个是水题. C. Checkposts DFS找出所有的环就行了. 每次搜索一个结点u时,给u加一个递增标号low[u],同时记录搜索u及u的子结点过程中遇到的最小标号minc,也就是当搜索u的子结点v时,minc = min(minc, low[v]).搜索完成后,如果minc < low[u],说明搜索u的子结点时又回到了u的父结点,也就是说u在一个环中,然后求出这个环的最小费用及取到最小费用的结点数. D.

Codeforces Round #354 (Div. 2) ABCD

Codeforces Round #354 (Div. 2) Problems # Name     A Nicholas and Permutation standard input/output 1 s, 256 MB    x3384 B Pyramid of Glasses standard input/output 1 s, 256 MB    x1462 C Vasya and String standard input/output 1 s, 256 MB    x1393 D T

Codeforces Round #261 (Div. 2)[ABCDE]

Codeforces Round #261 (Div. 2)[ABCDE] ACM 题目地址:Codeforces Round #261 (Div. 2) A - Pashmak and Garden 题意: 一个正方形,它的边平行于坐标轴,给出这个正方形的两个点,求出另外两个点. 分析: 推断下是否平行X轴或平行Y轴,各种if. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: A.cpp * Create Date: 2014-0

Codeforces Round 239 Div 1

都怪自己太懒了 这段时间比赛参加了大部分,但是一直都没写题解,趁这几天没事,计划把这段时间的题解都补上. 上一次比赛(248)终于升到了div1,所以从这次开始就开始写div1了. A. Triangle There is a right triangle with legs of length a and b. Your task is to determine whether it is possible to locate the triangle on the plane in such

Codeforces Round #245 (Div. 1)——Working out

题目链接 题意: 一个n*m的矩阵,每个方格有一个非负数,现在选择两条线路:一个左上到右下,一个左下到右上,且只能有一个公共点.求两个线路上数的最大值(公共点不算) 分析: 只有两种情况,dp即可.记两个线路为1和2,考虑一个公共点,1为左进右出,2为下进上出:1上进下出,2为左进右出 const int MAXN = 1005; int lu[MAXN][MAXN], ld[MAXN][MAXN]; int ru[MAXN][MAXN], rd[MAXN][MAXN]; int ipt[MAX

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities【最短路】

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities[最短路] 题目链接:点击打开 题目大意: 在一个国家中有n个城市(城市编号1~n),m条公路和k条铁路,编号为1的城市为首都,为了节约,不需要的铁路需要关闭,问在保证首都到其余所有城市的最短路不变的条件下,最多有多少条铁路是不需要的. 解法: 这个题比较麻烦,保证首都到其余城市的最短路不变,要求出最多有多少条铁路是不需要的,那肯定是从最短路的代码上下手了,我们首先考虑dijkstra算法