Codeforces Round #546題解
阿新 • • 發佈:2020-12-23
A題
遍歷找到第一個不覆蓋它的答案
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; struct node{ int l,r; }s[N]; int main(){ ios::sync_with_stdio(false); int n,k; cin>>n; int i; for(i=1;i<=n;i++) cinView Code>>s[i].l>>s[i].r; cin>>k; k--; for(i=1;i<=n;i++){ if(s[i].l<=k&&s[i].r>k||s[i].l>k){ cout<<n-i+1<<endl; break; } } return 0; }
B題
貪心題,剛開始的要特殊討論,之後的就是不斷往後放就行,這樣就不用多搬石頭
走的方向需要考慮一下,往短的那邊走
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; struct node{ int l,r; }s[N]; int main(){ ios::sync_with_stdio(false); int n,k; cin>>n; int i; for(i=1;i<=n;i++) cin>>s[i].l>>s[i].r; cinView Code>>k; k--; for(i=1;i<=n;i++){ if(s[i].l<=k&&s[i].r>k||s[i].l>k){ cout<<n-i+1<<endl; break; } } return 0; }
C題
規律題,不難看出,每條副對角線的元素要相等才行,因為只會在副對角線變化並且這條線上的答案可以通過2*2的方陣隨意排列
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; int a[1010][1010]; int b[1010][1010]; vector<int> num1[N],num2[N]; int main(){ ios::sync_with_stdio(false); int n,m; cin>>n>>m; int i,j; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>a[i][j]; num1[i+j].push_back(a[i][j]); } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>b[i][j]; num2[i+j].push_back(b[i][j]); } } for(i=1;i<=n+m;i++){ sort(num1[i].begin(),num1[i].end()); sort(num2[i].begin(),num2[i].end()); for(int j=0;j<(int)num1[i].size();j++){ if(num1[i][j]!=num2[i][j]){ cout<<"NO"<<endl; return 0; } } } cout<<"YES"<<endl; return 0; }View Code
D題
這題確實沒想到,老貪心敗狗了,我們發現當最後一個數要往前移,那麼他必須要和前面那個能夠調換,我們觀察一個性質,當一個位置上的數能夠和他後面的數調換位置直到碰到最後一個數,那麼就能答案++
並且這個不會改變後面數的順序,因此倒序列舉,維護棧,棧中存的是不能再調換的數。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e5+10; vector<int> num[N]; int ins[N]; int a[N]; int main(){ ios::sync_with_stdio(false); int n,m; cin>>n>>m; int i; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=m;i++){ int a1,b; cin>>a1>>b; num[a1].push_back(b); } ins[a[n]]=1; int cnt; int ans=0; for(i=n-1;i>=1;i--){ cnt=0; for(auto x:num[a[i]]){ if(ins[x]) cnt++; } if(n-i-ans==cnt){ ans++; } else{ ins[a[i]]=1; } } cout<<ans<<endl; return 0; }View Code