寒假cf补题

Codeforces Round #695 (Div. 2)B. Hills And Valleys
*1700,这题直接暴力,不需要dp,判断的时候注意下标

#include 

using namespace std;
const int N = 3e5+10,M=2e5+10;
typedef long long ll;
int a[N];
bool judge(int left,int right,int now)
{
     
    if(now>left&&now>right||now<left&&now<right)
        return 1;
    return 0;
}
int main()
{
     
    int t;
    cin>>t;
    int n;
    while(t--)
    {
     
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        int ans=0;
        for(int i=1;i<n-1;i++)
        {
     
            if(judge(a[i-1],a[i+1],a[i]))
                ans++;
        }
        int tmp=ans;
        for(int i=0;i<n;i++)
        {
     
            int x=max(a[i-1],a[i+1]);
            int pre=0,now=0;
            if(i>0&&i<n-1&&judge(a[i-1],a[i+1],a[i]))
                pre++;
            if(i<n-2&&judge(a[i],a[i+2],a[i+1]))
                pre++;
            if(i>1&&judge(a[i-2],a[i],a[i-1]))
                pre++;

            if(i>0&&i<n-1&&judge(a[i-1],a[i+1],x))
                now++;
            if(i<n-2&&judge(x,a[i+2],a[i+1]))
                now++;
            if(i>1&&judge(a[i-2],x,a[i-1]))
                now++;

            ans=min(ans,tmp-(pre-now));
            x=min(a[i-1],a[i+1]);
            now=0;
            if(i>0&&i<n-1&&judge(a[i-1],a[i+1],x))
                now++;
            if(i<n-2&&judge(x,a[i+2],a[i+1]))
                now++;
            if(i>1&&judge(a[i-2],x,a[i-1]))
                now++;
            ans=min(ans,tmp-(pre-now));
        }
        printf("%d\n",ans);

    }
    return 0;
}

Codeforces Round #696 (Div. 2)C. Array Destruction
*1700
这题主要是卡时间,memset的时间复杂度是O(N),map的时间复杂度是O(logn),也有超时的可能,所以用到一个桶标记的小技巧,怎么标记的就怎么清除即可。

    #include 
     
    using namespace std;
    const int N = 2e3+10,M=2e5+10;
    typedef long long ll;
    int a[N];
    int flag,ans,n;
    int ans_index;
    int ans_array[N];
    int vis[1000005];
    bool cmp(int x,int y)
    {
     
        return x>y;
    }
    void clear()
    {
     
        for(int i=0;i<2*n;i++)
            vis[a[i]]=0;
    }
    void Init()
    {
     
        for(int i=0;i<2*n;i++)
            vis[a[i]]++;
    }
     
    void dfs(int index,int val,int step)
    {
     
        //printf("step=%d index=%d val=%d\n",step,index,val);
        if(flag==0)return ;
        if(step==n){
     ans=1;return ;}
        int next=index+1;
        while(vis[a[next]]<=0)next++;
        vis[a[next]]--;
        ans_array[ans_index++]=next;
        for(int i=next+1;;i++)
        {
     
            if(a[next]+a[i]==val&&vis[a[i]]>0)
            {
     
                ans_array[ans_index++]=i;
                vis[a[i]]--;
                break;
            }
            if(i>=2*n)
            {
     
                flag=0;
                return ;
            }
        }
        dfs(next,a[next],step+1);
    }
    int main()
    {
     
        int t;
        cin>>t;
        while(t--)
        {
     
            scanf("%d",&n);
            for(int i=0;i<2*n;i++)
                scanf("%d",&a[i]);
            sort(a,a+2*n,cmp);
     
            int fl=0;
            for(int i=1;i<2*n;i++)
            {
     
                flag=1;
                ans=0;
                ans_index=0;
                Init();
                //mp[a[i]]=1;
                dfs(-1,a[0]+a[i],0);
                if(ans==1)
                {
     
                    fl=1;
                    printf("YES\n");
                    printf("%d\n",a[0]+a[i]);
                    for(int i=0;i<n;i++)
                    {
     
                        printf("%d %d\n",a[ans_array[2*i]],a[ans_array[2*i+1]]);
                    }
                    break;
                }
                clear();
            }
            if(fl==0)
                printf("NO\n");
        }
        return 0;
    }

Codeforces Round #693 (Div. 3)E. Correct Placement
*1700
这题是没有将初始数据进行处理,导致处理复杂。
这题用到了双指针的思想,比赛时做题没有一下想到,导致处理复杂。

#include 
using namespace std;
const int N=2e5+10;
struct node
{
     
    int h,w,num,pre;
}a[N];
bool cmp(node x,node y)
{
     
    if(x.w!=y.w)
        return x.w<y.w;
    else return x.h<y.h;
}
bool cmp2(node x,node y)
{
     
    return x.num<y.num;
}
int main()
{
     
    int t;
    cin>>t;
    while(t--)
    {
     
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
     
            scanf("%d%d",&a[i].w,&a[i].h);
            if(a[i].w<a[i].h)swap(a[i].w,a[i].h);
            a[i].num=i;
            a[i].pre=-1;
        }

        sort(a+1,a+n+1,cmp);

        int j=1;
        int min_h=0x3f3f3f3f,min_id=1;
        for(int i=1;i<=n;i++)
        {
     
            while(a[i].w>a[j].w&&j<i)
            {
     
                if(a[j].h<min_h)
                {
     
                    min_h=a[j].h;
                    min_id=j;
                }
                j++;
            }
            if(a[i].w==a[min_id].w)
            {
     
                continue;
            }
            if(a[i].h>min_h)
                a[i].pre=a[min_id].num;
        }
        sort(a+1,a+1+n,cmp2);
        for(int i=1;i<=n;i++)
        {
     
            printf("%d ",a[i].pre);
        }
        cout<<endl;
    }
    return 0;
}

你可能感兴趣的:(codeforces,算法)