ABC190 速通

ABC190

A, Very Very Primitive Game

显然,若两人的初始值不同,大的胜,否则后手胜。

时间复杂度 \(O(n)\)

B, Magic 3

循环一遍看看有没有 \(x_i \lt S\)\(y_i \gt D\) 的即可。

时间复杂度 \(O(n)\)

C, Bowls and Dished

暴力枚举每一种选的情况即可。

时间复杂度 \(O(2^k(n + m))\)

D, Staircase Sequence

假设 \(i + (i + 1) + \dots + j = n\),则 \((-i + 1) + (-i + 2) + \dots + j = n\)

所以我们枚举项数,如果首相 \(\gt 0\),则 \(res \overset{+}{\gets} 2\)。否则退出循环。

时间复杂度 \(O(\sqrt{n})\)

E, Magical Ornament

链接

F, Shift and Inversions

链接

代码

// A
#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    if (c == 0)
    {
        if (a <= b)
        {
            cout << "Aoki" << endl;
        }
        else
        {
            cout << "Takahashi" << endl;
        }
    }
    else
    {
        if (a >= b)
        {
            cout << "Takahashi" << endl;
        }
        else
        {
            cout << "Aoki" << endl;
        }
    }
    return 0;
}

// B
#include <iostream>
using namespace std;

int main()
{
    long long n, s, d;
    cin >> n >> s >> d;
    bool e = 0;
    for (int i = 1; i <= n; i++)
    {
        long long x, y;
        cin >> x >> y;
        if (x >= s || y <= d)
        {
            continue;
        }
            e = true;
            break;
    }
    if (e)
    {
        cout << "Yes" << endl;
    }
    else
    {
        cout << "No" << endl;
    }
    return 0;
}

// C
#include <iostream>
using namespace std;

#define MAXN 105

int n, m, k;

int a[MAXN];
int b[MAXN];

int c[MAXN];
int d[MAXN];

int v[MAXN];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> a[i] >> b[i];
    }
    cin >> k;
    for (int i = 1; i <= k; i++)
    {
        cin >> c[i] >> d[i];
    }
    int res = 0;
    for (int s = 0; s < (1 << k); s++)
    {
        for (int i = 1; i <= n; i++)
        {
            v[i] = 0;
        }
        for (int i = 1; i <= k; i++)
        {
            if (s & (1 << (i - 1)))
            {
                v[c[i]] = 1;
            }
            else
            {
                v[d[i]] = 1;
            }
        }
        int r = 0;
        for (int i = 1; i <= m; i++)
        {
            if (v[a[i]] && v[b[i]])
            {
                r++;
            }
        }
        res = max(res, r);
    }
    cout << res << endl;
    return 0;
}

// D
#include <iostream>
using namespace std;

using ll = long long;

ll n;

int main()
{
    ll n;
    cin >> n;
    n *= 2;
    // 2 * S = (a1 + ai) * i = i * (2 * a1 + (i - 1)) = n
    // 2 * a1 + i - 1 = n / i
    ll res = 0;
    for (ll i = 1; i <= 10000006; i++)
    {
        if (!(n % i) && !((n / i - i + 1) % 2) && ((n / i - i + 1) / 2 > 0))
        {
            res += 2;
        }
    }
    cout << res << endl;
}

// E
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

#define MAXN 100005
#define MAXK 18
#define MAXS 132020

// using ll = long long;
#define int long long

using pii = pair<int, int>;

vector<int> e[MAXN];

int dis[MAXN];

int n;

void bfs(int p)
{
    queue<int> q;
    for (int i = 1; i <= n; i++)
    {
        dis[i] = 0x3ffff3fff3ff;
    }
    dis[p] = 0;
    q.push(p);
    while (!q.empty())
    {
    	int c = q.front();
	   	q.pop();
        for (int u : e[c])
        {
            if (dis[u] > n)
            {
            	dis[u] = dis[c] + 1;
                q.push(u);
            }
        }
    }
}

int d[MAXK][MAXK];

int c[MAXK];

int dp[MAXS][MAXK];

signed main()
{
    cin >> n;
    int m;
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        int a, b;
        cin >> a >> b;
        e[a].push_back(b);
        e[b].push_back(a);
    }
    int k;
    cin >> k;
    if (k == 1)
    {
    	cout << 1 << endl;
    	return 0;
	}
    for (int i = 1; i <= k; i++)
    {
        cin >> c[i];
    }
    for (int i = 1; i <= k; i++)
    {
        bfs(c[i]);
        for (int j = 1; j <= k; j++)
        {
            d[i][j] = dis[c[j]];
        }
    }
    memset(dp, 0x1f, sizeof(dp));
    for (int i = 1; i <= k; i++)
    {
    	dp[1 << (i - 1)][i] = 1;
	}
    for (int s = 1; s < (1 << k); s++)
    {
    	if (__builtin_popcount(s) == 1)
    	{
    		continue;
		}
        for (int i = 1; i <= k; i++)
        {
            if (!(s & (1 << (i - 1))))
            {
                continue;
            }
            for (int j = 1; j <= k; j++)
            {
                if (i == j)
                {
                    continue;
                }
                if (!(s & (1 << (j - 1))))
                {
                    continue;
                }
                dp[s][j] = min(dp[s][j], dp[s ^ (1 << (j - 1))][i] + d[i][j]);
            }
        }
    }
    int res = 0x3ffff3fff3ff;
    for (int i = 1; i <= k; i++)
    {
        res = min(res, dp[(1 << k) - 1][i]);
    }
    if (res >= 0x3ffff3fff3ff)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << res << endl;
    }
    return 0;
}

// F
#include <iostream>
using namespace std;

#define MAXN 300005
#define lowbit(x) ((x) & -(x))

#define int long long

int n;

int t1[MAXN];

void a1(int p, int v)
{
    while (p <= n)
    {
        t1[p] += v;
        p += lowbit(p);
    }
}

int q1(int p)
{
    int res = 0;
    while (p)
    {
        res += t1[p];
        p -= lowbit(p);
    }
    return res;
}

int t2[MAXN];

void a2(int p, int v)
{
    while (p <= n)
    {
        t2[p] += v;
        p += lowbit(p);
    }
}

int q2(int p)
{
    int res = 0;
    while (p)
    {
        res += t2[p];
        p -= lowbit(p);
    }
    return res;
}

int a[MAXN];

int r[MAXN];

signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    int res = 0;
    for (int i = 1; i <= n; i++)
    {
        res += q1(n - a[i]);
        a1(n - a[i], 1);
        a2(a[i] + 1, 1);
    }
    r[0] = res;
    for (int i = 1; i < n; i++)
    {
        a2(a[i] + 1, -1);
        a1(n - a[i], -1);
        res -= q2(a[i] + 1);
        res += q1(n - a[i]);
        a1(n - a[i], 1);
        a2(a[i] + 1, 1);
        r[i] = res;
    }
    for (int i = 0; i < n; i++)
    {
        cout << r[i] << endl;
    }
    return 0;
}

posted @ 2023-12-15 21:17  cosf  阅读(57)  评论(0)    收藏  举报