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; }
題意:經過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; }
wa聲一遍,寫出來了再來寫
思路清晰,在紙上模了一遍,寫代碼時,就會少一些bug