Codeforces Round #562 (Div. 2)

A

 

题意:两条循环线路,一条是递增,逐次增加1,到最大和最小的相邻;另一条线路递减,同前的规律。看他们是否会在同一时间,经过同一个站点

其实是一个水题,题目开始时读错了,wa了几发,还浪费了时间qwq,

 

B. Pairs

题意:判断是否存在两个x,y ,使x,y至少有一个是在这些实数对中的;

题目的意思很简单,第一对a1,b1中,肯定至少有一个数是在x,y;分两种情况,1:x=a1,在不含x的实数对中找y ; 2:x=b1,在不含x的实数对中找y ;只要两种情况中有一种符合条件即可

/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ Code is far away from bug with the animal protecting          
 *          ┃   ┃   神兽保佑,代码无bug
 *          ┃   ┃           
 *          ┃   ┃        
 *          ┃   ┃
 *          ┃   ┃           
 *          ┃   ┗━━━┓
 *          ┃       ┣┓
 *          ┃       ┏┛
 *          ┗┓┓┏━┳┓┏┛
 *           ┃┫┫ ┃┫┫
 *           ┗┻┛ ┗┻┛
 */
 
 
#include <bits/stdc++.h>
#include <iostream>
 
using namespace std;
 
#define  ll long long
const int maxn=5e5+5;
const int maxn1=(int)sqrt(maxn)+1;
int a[maxn],b[maxn];
set<int> s;
set<int>::iterator it;
int main(){
    std::ios::sync_with_stdio (false);
    int n,x,y,m,flag=1;
    cin>>x>>y;
    for(int i=1; i<=y; ++i) cin>>a[i]>>b[i];
  //第一种情况
    for(int i=2; i<=y; ++i){
        if(a[i]!=a[1]&&b[i]!=a[1]){//在不含x的实数对中找y 
            if(s.empty()) s.insert(a[i]),s.insert(b[i]);
            else {
                //cout<<i<<" "<<s.count(a[i])<<" "<<s.count(b[i])<<endl;
                //cout<<endl;
                if(s.count(a[i])&&s.count(b[i])) continue;
                else if(s.count(a[i])){
                    for(it=s.begin(); it!=s.end(); ++it)
                    if(*it!=a[i]){
                        s.erase(it);
                        break;
                    }
                }
                else if(s.count(b[i])){
                    for(it=s.begin(); it!=s.end(); ++it)
                    if(*it!=b[i]){
                        s.erase(it);
                        break;
                    }
                }
                else {
                    flag=0;
                    break;
                }
            }
        }
    }
    if(flag){
        cout<<"YES";
        return 0;
    }
  
  //第二种情况
    s.clear(),flag=1;
    for(int i=2; i<=y; ++i){
        if(a[i]!=b[1]&&b[i]!=b[1]){//在不含x的实数对中找y 
            if(s.empty()) s.insert(a[i]),s.insert(b[i]);
            else {
                if(s.count(a[i])&&s.count(b[i])) continue;
                else if(s.count(a[i])){
                    for(it=s.begin(); it!=s.end(); ++it)
                    if(*it!=a[i]){
                        s.erase(it);
                        break;
                    }
                }
                else if(s.count(b[i])){
                    for(it=s.begin(); it!=s.end(); ++it)
                    if(*it!=b[i]){
                        s.erase(it);
                        break;
                    }
                }
                else {
                    flag=0;
                    break;
                }
            }
        }
    }
    if(flag){
        cout<<"YES";
        return 0;
    }
    else cout<<"NO";
    return 0;
}
View Code

 

C. Increasing by Modulo

题意:通过n次操作是序列不递减,操作:对可以对序列中的任意个数ai ---> ai=(ai+1)mod m;

看题解才知道的,对操作数二分,找出最小满足条件的序列即可,太强了qwq,注意条件的判断

对操作数二分,太神奇了。

a:不知道做,有想法,没办法,

b:按要求结果暴力啊

a:超时了qwq

b:神马,超时,暴力+二分

qwq

/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ Code is far away from bug with the animal protecting          
 *          ┃   ┃   神兽保佑,代码无bug
 *          ┃   ┃           
 *          ┃   ┃        
 *          ┃   ┃
 *          ┃   ┃           
 *          ┃   ┗━━━┓
 *          ┃       ┣┓
 *          ┃       ┏┛
 *          ┗┓┓┏━┳┓┏┛
 *           ┃┫┫ ┃┫┫
 *           ┗┻┛ ┗┻┛
 */
 
 
#include <bits/stdc++.h>
#include <iostream>
 
using namespace std;
 
#define  ll long long
const int maxn=5e5+5;
const int maxn1=(int)sqrt(maxn)+1;
int a[maxn],b[maxn],low[maxn];
set<int> s;
set<int>::iterator it;
int n,m;
bool check(int k){
    memset(low,0,sizeof(low));
    for(int i=1; i<=n; ++i){
        if(low[i-1]==a[i]) {
            low[i]=low[i-1];
            continue;
        }
        int tmp=(a[i]+k)%m;
        if((a[i]<low[i-1]&&tmp>=a[i]&&tmp<low[i-1]))
            return false;
        if((a[i]>low[i-1]&&(tmp>=a[i]||tmp<low[i-1]))){
            low[i]=a[i];}
        else low[i]=low[i-1];
        //cout<<i<<" "<<low[i]<<endl;
    }
    return true;
}
 
 
int main(){
    std::ios::sync_with_stdio (false);
    int flag=1;
    cin>>n>>m;
    for(int i=1; i<=n; ++i) cin>>a[i];
    int l=0,r=m;
    int ans=0;
    while(l<=r){
        //cout<<l<<" "<<r<<" "<<ans<<endl;
        int mid=(l+r)>>1;
        if(check(mid)) {
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
 
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

D. Good Triple

wa声一遍,写出来了再来写

 

思路清晰,在纸上模了一遍,写代码时,就会少一些bug

posted @ 2019-07-08 22:59  mrdushe  阅读(192)  评论(0编辑  收藏  举报