AtCoder ABC 138

C - Alchemist
排序贪心,小的应该先除,大的后除
D - Ki
搜索
pypy不出意外的挂了

// atcoder.cpp : 
//
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef pair<int, int> PII;
typedef long long LL;
typedef vector<int> vi;

int N, P;
vector<int> g[200005];
LL add[200005];
LL a[200005];


void dfs(int u, int fa, LL cur_s) {
	a[u] = add[u] + cur_s;
	for (auto v : g[u]) {
		if (v == fa) continue;
		dfs(v, u, a[u]);
	}
}


int main()  
{
	//freopen("in.txt", "r", stdin);
	scanf("%d%d", &N, &P);
	for (int i = 0; i < N - 1; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		u--, v--;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for (int i = 0; i < P; ++i) {
		int u, w;
		scanf("%d%d", &u, &w);
		u--;
		add[u] += w;
	}
	dfs(0, -1, 0);
	for (int i = 0; i < N; ++i) {
		if (i) printf(" ");
		printf("%lld", a[i]);
	}
	printf("\n");
	return 0;
}

E - Strings of Impurity
S中的每个字符都可以列出一个在S中的位置列表
二分搜索当前的位置,算出每次移动的step
由于当前的位置可能是在列表的后面,因此S重复一遍

# -*- coding: utf-8 -*-
# @time     : 2023/6/2 13:30
# @author   : [email protected]
# @desc     :
# @file     : atcoder.py
# @software : PyCharm
import bisect
import copy
import sys
from sortedcontainers import SortedList
from collections import defaultdict, Counter, deque
from functools import lru_cache, cmp_to_key
import heapq
import math
sys.setrecursionlimit(50005)


def get_pos(arr, target):
    lo, hi = 0, len(arr)
    while lo < hi:
        mi = lo + hi >> 1
        if target < arr[mi]:
            hi = mi
        else:
            lo = mi + 1
    return lo


def main():
    items = sys.version.split()
    if items[0] == '3.10.6':
        fp = open("in.txt")
    else:
        fp = sys.stdin
    S, T = fp.readline().strip(), fp.readline().strip()
    set_t = set([c for c in T])
    set_s = set([c for c in S])
    if set_t & set_s != set_t:
        print("-1")
        return
    S = S + S
    ns = len(S)
    n = ns // 2
    ch_dict = defaultdict(list)
    for i, c in enumerate(S):
        ch_dict[c].append(i)

    ans = 0
    cur = -1
    for c in T:
        arr = ch_dict[c]
        pos = get_pos(arr, cur)
        ans += arr[pos] - cur
        cur = arr[pos]
        if cur >= n:
            cur = cur - n
    print(ans)


if __name__ == "__main__":
    main()

F - Coincidence
待续。。。

你可能感兴趣的:(Atcoder,算法)