codeforces - 1257(div2)

A-Two Rival Students 

贪心,判断一下左边和右边

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#pragma GCC optimize(2)
 
#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second
 
using namespace std;
typedef long long ll;
typedef pair<int, int > PII;
 
const int N = 1e6 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f;
int t, n, x, a, b;
 
int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
//    cin.tie(0);
//    cout.tie(0);
//    ios::sync_with_stdio(0);
    cin >> t;
    while (t--) {
        cin >> n >> x >> a >> b;
        if (abs(a - b) == n - 1) {
            cout << n - 1 << endl;
            continue;
        }
        
        int sum = a + b;
        b = a + b - min(a, b);
        a = sum - b;
        int tmp1 = a - 1, tmp2 = n - b;
        b = b + min(x, tmp1 + tmp2);
        cout << (b - a) << endl;
    }
}
View Code

 

B - Magic Stick 

因为当x大于等于y的时候是一定可以通过把x减一的方式将他变成y的,所以我们要尽可能把x变大。策略就是如果x是奇数就把他减去1变成偶数,偶数就直接成二分之三。特判一下如果x是奇数并且(x - 1) * 3 / 2 等于x的话就不可能达到 

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#pragma GCC optimize(2)
 
#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second
 
using namespace std;
typedef long long ll;
typedef pair<int, int > PII;
 
const int N = 1e6 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f;
ll t, x, y;
 
int main()
{
    cin >> t;
    while (t--) {
        cin >> x >> y;
        while (1) {
            if (x >= y) {
                puts("YES");
                break;
            }
            if (!(x & 1)) {
                x = x * 3 / 2;
            } else {
                x--;
                ll tmp = x * 3 / 2;
                if (tmp == x + 1 || tmp == 0) {
                    puts("NO");
                    break;
                }
            }
        }
    }
    
}
/*
1
858993461 1000000000
*/ 
View Code

 

C - Dominated Subarray

在读入的时候一边读一边用map记录并更新当前这个数上次出现的位置,更新答案。

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#pragma GCC optimize(2)
 
#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second
 
using namespace std;
typedef long long ll;
typedef pair<int, int > PII;
 
const int N = 2e5 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f;
int t, n;
int a[N];
map <int, int> Map;
 
int main()
{
    cin >> t;
    while (t--) {
        cin >> n;
        Map.clear();
        int ans = INF;
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
            if (Map[a[i]] != 0) {
                if (i - Map[a[i]] + 1 < ans) {
                    ans = i - Map[a[i]] + 1;
                    Map[a[i]] = 0;
                }
            }
            Map[a[i]] = i;
        }
        if (n == 1) {
            puts("-1");
            continue;
        }
        if (ans != INF)
        cout << ans << endl;
        else
        puts("-1");
    }
}
View Code

 

D - Yet Another Monster Killing Problem

特判后把奥特曼二分着来打怪兽

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#pragma GCC optimize(2)
 
#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second
 
using namespace std;
typedef long long ll;
typedef pair<int, int > PII;
 
const int N = 2e5 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f;
int t, n, m, maxx, tid, pos, res;
int a[N], id[N];
PII e[N];
 
int main()
{
    cin >> t;
    while (t--) {
        cin >> n;
        int w = -1;
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
            w = max(w, a[i]);
        }
        cin >> m;
        bool flag = 1;
        for (int i = 1; i <= m; ++i) {
            scanf("%d%d", &e[i].first, &e[i].second);
            if (e[i].first >= w)
                flag = 0;
        }
        
        if (flag) {
            puts("-1");
            continue;
        }
        
        sort(e + 1, e + 1 + m);
        
        maxx = 0;
        for (int i = m; i >= 1; --i) {
            if (e[i].second > maxx) {
                maxx = e[i].second;
                tid = i;
            }
            id[i] = tid;
        }
        
        pos = 1, res = 0;
        while (pos <= n) {
            tid = lower_bound(e + 1, e + 1 + m, PII(a[pos], -1)) - e;
            tid = id[tid];
            maxx = e[tid].second;
            for (int j = 1; j <= maxx; ++j) {
                if (a[pos] <= e[tid].first) pos++;
                else {
                    tid = lower_bound(e + 1, e + 1 + m, PII(a[pos], -1)) - e;
                    tid = id[tid];
                    if (e[tid].second >= j) {
                        maxx = e[tid].second;
                        pos++;
                    }
                    else
                    break;
                }
            }
            res++;
        }
        cout << res << endl;
    }
}
/*
1
5
78 22 90 12 42
5
51 1
87 3
48 2
13 1
98 5
*/
View Code

 

posted @ 2019-11-19 16:04  violet72  阅读(135)  评论(0编辑  收藏  举报