Codeforces Round #562 (Div. 2)

A

 

題意:兩條循環線路,一條是遞增,逐次增長1,到最大和最小的相鄰;另外一條線路遞減,同前的規律。看他們是否會在同一時間,通過同一個站點ios

實際上是一個水題,題目開始時讀錯了,wa了幾發,還浪費了時間qwq,c++

 

B. Pairside

題意:判斷是否存在兩個x,y ,使x,y至少有一個是在這些實數對中的;spa

題目的意思很簡單,第一對a1,b1中,確定至少有一個數是在x,y;分兩種狀況,1:x=a1,在不含x的實數對中找y ; 2:x=b1,在不含x的實數對中找y ;只要兩種狀況中有一種符合條件便可code

/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ 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 Moduloblog

題意:經過n次操做是序列不遞減,操做:對能夠對序列中的任意個數ai ---> ai=(ai+1)mod m;ip

看題解才知道的,對操做數二分,找出最小知足條件的序列便可,太強了qwq,注意條件的判斷ci

對操做數二分,太神奇了。get

a:不知道作,有想法,沒辦法,it

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

相關文章
相關標籤/搜索