1. 程式人生 > 實用技巧 >Codeforces Round #546題解

Codeforces Round #546題解

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++)
        cin
>>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; }
View Code

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;
    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; }
View Code

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