Codeforces Round #497 (Div.1)

Posted absi2011

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #497 (Div.1)相关的知识,希望对你有一定的参考价值。

比赛过程:

A是个水题,花了3分钟A了

没了,后面都没过

涨分15

==================================

A

给你n个数,你可以任意重新排列这些数

求最多有几个数能严格大于这个位置原来的数

n<=105

 

排序以后直接做...

 

B

给你三个数A,B,C

求有多少个整数的(a,b,c)使得A*B*C的立方体可以被切成若干个a*b*c的立方体

要求a<=b<=c

多测,100000组数据,1<=A,B,C<=100000

 

C

给你一个n,让你猜x和y

x,y都是[1,n]以内的整数

每次你猜一个x,y

对面会回答:

x小了

y小了

x大了或者y大了

不会说谎,但是有多个回答可能会随机回答

 

DE

没看

==================================================
C题赛后过了

用类似于二分的办法

针对了一下数据

应该是错的

每次把看到1,2就修改l

看到3就修改r,两个r都修改,直到出现一维r>l

这时候另一个r显然就是真实的范围,同时把这个r恢复到最大值(n或者上一次矛盾推导出的r)

复杂度O(log^2),会炸

我每次修改完l以后会直接把l拉到上限再做一次询问,这样做针对了下数据,过了

 

 

 

代码:

A

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    int i;
    for (i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    int cnt=0;
    a[n]=-1;
    int ans=0;
    for (i=0;i<n;)
    {
        int j;
        for (j=i;a[j]==a[i];j++)
        {
            if (cnt>0)
            {
                cnt--;
                ans++;
            }
        }
        cnt+=(j-i);
        i=j;
    }
    printf("%d
",ans);
    return 0;
}

C

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int query(long long x,long long y)
{
    cout<<x<<" "<<y<<"
";
    fflush(stdout);
    int n;
    if (cin>>n)
    {
        return n;
    }
    else
    {
        exit(-1);
    }
}
int main()
{
    #ifdef absi2011
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    #endif
    long long n;
    cin>>n;
    long long l1=1,l2=1,r1=n,r2=n;
    for (;;)
    {
        long long t_l1=l1,t_l2=l2,t_r1=r1,t_r2=r2;
        for (;;)
        {
            long long mid1=(l1+r1)/2;
            long long mid2=(l2+r2)/2;
            int ans=query(mid1,mid2);
            if (ans==0)
            {
                return 0;
            }
            else if (ans==1)
            {
                l1=mid1+1;
                t_l1=mid1+1;
                int ans=query(r1,mid2);
                if (ans==1)
                {
                    l1=r1+1;
                }
                else if (ans==0)
                {
                    return 0;
                }
                else if (ans==2)
                {
                    l2=mid2+1;
                    t_l2=mid2+1;
                }
            }
            else if (ans==2)
            {
                l2=mid2+1;
                t_l2=mid2+1;
                int ans=query(mid1,r2);
                if (ans==2)
                {
                    l2=r2+1;
                }
                else if (ans==0)
                {
                    return 0;
                }
                else if (ans==1)
                {
                    l1=mid1+1;
                    t_l1=mid1+1;
                }
            }
            else
            {
                r1=mid1-1;
                r2=mid2-1;
            }
            if (r1<l1)
            {
                t_r2=r2;
                break;
            }
            if (r2<l2)
            {
                t_r1=r1;
                break;
            }
        }
        l1=t_l1;
        l2=t_l2;
        r1=t_r1;
        r2=t_r2;
        if ((l1>r1)||(l2>r2)) return 1;
        /* 
        if (l1==r1)
        {
            for (;;)
            {
                int mid=(l2+r2)/2;
                int ans=query(l1,mid);
                if (ans==0)
                {
                    return 0;
                }
                else if (ans==2)
                {
                    l2=mid+1;
                }
                else if (ans==3)
                {
                    r2=mid-1;
                }
            }
        }
        if (l2==r2)
        {
            for (;;)
            {
                int mid=(l1+r1)/2;
                int ans=query(mid,l2);
                if (ans==0)
                {
                    return 0;
                }
                else if (ans==1)
                {
                    l1=mid+1;
                }
                else if (ans==3)
                {
                    r1=mid-1;
                }
            }
        }
        */ 
    }
    return 0;
}

  


以上是关于Codeforces Round #497 (Div.1)的主要内容,如果未能解决你的问题,请参考以下文章

[ACM]Codeforces Round #534 (Div. 2)

codeforces 497E Subsequences Return

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces Global Round 19

Codeforces Educational Codeforces Round 67

Codeforces Round 1132Educational Round 61