Codeforces 911 三循环数覆盖问题 逆序对数结论题 栈操作模拟

 A

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!
")
#define pb push_back
#define inf 0x3f3f3f3f
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[4][2] = {{0, 1}, { 1, 0}, { 0, -1}, { -1, 0}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
int num[100005];
int main()
{
    vector<int> ans;
    int minn=2e9;
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        minn=min(minn,num[i]);
    }
    for(int i=1;i<=n;i++)
    {
        if(num[i]==minn)
        {
        ans.push_back(i);
        }
    }
    int anser=1e9;
    for(int i=0;i<ans.size()-1;i++)
    {
        anser=min(anser,ans[i+1]-ans[i]);
    }
    cout<<anser<<endl;
}
View Code

B

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!
")
#define pb push_back
#define inf 0x3f3f3f3f
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[4][2] = {{0, 1}, { 1, 0}, { 0, -1}, { -1, 0}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
int num[100005];
int main()
{
    int n,a,b;
    cin >> n >> a >> b;
    for(int i=min(a,b);;i--)
    {
        if(a/i+b/i>=n)
        {
            cout<<i<<endl;
            return 0;
        }
    }
}
View Code

C

我们知道当三个里面的最小值都大于三的时候肯定不行 当有一个为1的时候肯定行 当2的个数不小于两个的时候肯定行 三个全为3也肯定行 

剩下的就是 244这种情况

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!
")
#define pb push_back
#define inf 0x3f3f3f3f
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[4][2] = {{0, 1}, { 1, 0}, { 0, -1}, { -1, 0}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
int num[1505];
int main()
{
        int a, b, c;
        cin >> a >> b >> c;
        num[a]++, num[b]++, num[c]++;
        if (min(min(a, b), c) == 1)
        {
                cout << "YES" << endl;
                return 0;
        }
        if (num[2] == 1 && num[4] == 2)
        {
                cout << "YES" << endl;
                return 0;
        }
        if (num[2] >= 2 || num[3] == 3)
        {
                cout << "YES" << endl;
                return 0;
        }
        cout << "NO" << endl;
}
View Code

D

假设一个区间内的逆序对数为N 区间为L-R 则不为逆序对的数翻转之后会变成逆序对 本为逆序对的翻转之后变成正常 而1-L -1 R+1-N的逆序对并不会受到影响

所以最终的答案就是SUM-N+(R-L+1)*(R-L)/2-N=SUM+(R-L+1)*(R-L)/2-2*N 因为2*N肯定是偶数 减去不影响答案的奇偶性 所以只要判断(R-L+1)*(R-L)/2是奇数还是偶数就行

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!
")
#define pb push_back
#define inf 0x3f3f3f3f
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[4][2] = {{0, 1}, { 1, 0}, { 0, -1}, { -1, 0}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
int num[1505];
int c[1505][1505];
int dp[1505][1505];
ll sum = 0;
int main()
{
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
                scanf("%d", &num[i]);
        }
        for (int i = 1; i <= n; i++)
        {
                for (int j = num[i] - 1; j >= 1; j--)
                {
                        c[i][j]++;
                }
        }
        for (int i = 1; i <= n; i++)
        {
                for (int j = 1; j <= n; j++)
                {
                        c[j][i] += c[j - 1][i];
                }
        }
        for (int i = 1; i <= n; i++)
        {
                sum += c[i - 1][num[i]];
        }
        int flag;
        if(sum%2)
    flag=1;
    else
    flag=0;
        int q;
        cin >> q;
        while (q--)
        {
                int l,r;
                cin >> l >> r;
                if(((r-l+1)*(r-l)/2)%2)
        flag^=1;
        if(flag)
        cout<<"odd"<<endl;
        else
        cout<<"even"<<endl;
        }
}
View Code

E

#include <bits/stdc++.h>

#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!
")
#define pb push_back
#define inf 0x3f3f3f3f
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que; get min
const double eps = 1.0e-10;
const double EPS = 1.0e-4;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 3e5 + 10;
const int turn[4][2] = {{0, 1}, { 1, 0}, { 0, -1}, { -1, 0}};
//priority_queue<int, vector<int>, less<int>> que;
//next_permutation
int anser[200005];
int num[200005];
int visit[200005];
stack<int> sta;
vector<int> ans;
int main()
{
        int cur = 1;
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= m; i++)
        {
                cin >> num[i];
                anser[i] = num[i];
                visit[num[i]] = 1;
                sta.push(num[i]);
                while (sta.size() && cur == sta.top())
                {
                        sta.pop();
                        cur++;
                }
        }
        int now;
        while (cur <= n || (!sta.empty() && sta.top() > cur))
        {
                if (sta.size())
                {
                        now = sta.top();
                }
                else
                {
                        now = n + 1;
                }
                for (int i = now - 1; i >= cur; i--)
                {
                        if (visit[i])
                        {
                                cout << -1 << endl;
                                return 0;
                        }
                        else
                        {
                                anser[++m] = i;
                                sta.push(i);
                                visit[i] = 1;
                        }
                }
                while (sta.size() && cur == sta.top())
                {
                        sta.pop();
                        cur++;
                }
        }
        if (sta.size())
        {
                cout << -1 << endl;
                return 0;
        }
        for (int i = 1; i <= n; i++)
        {
                cout << anser[i] << " ";
        }
        cout << endl;
}
View Code
原文地址:https://www.cnblogs.com/Aragaki/p/8807124.html