git reimport

This commit is contained in:
2019-03-15 13:47:54 +04:00
commit 3b461f73de
489 changed files with 1631603 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
22 A - Vasya And Password
12 MULTI_NUMBER
8 STANDARD
9 input.txt
8 STANDARD
10 output.txt
1
0
16 2
abcDCE
htQw27
14 abcD4E
htQw27
1
11 src/chelper
8 -Xmx256M
4 Main
13 chelper.TaskA
39 net.egork.chelper.checkers.TokenChecker
0
0
10 2018.09.20
50 Educational Codeforces Round 51 (Rated for Div. 2)
1
14 io.InputReader
15 io.OutputWriter
0
0

View File

@@ -0,0 +1,31 @@
26 B - Relatively Prime Pairs
6 SINGLE
8 STANDARD
-1
8 STANDARD
-1
1
0
4 1 8
20 YES
2 7
4 1
3 8
6 5
1
11 src/chelper
8 -Xmx256M
4 Main
13 chelper.TaskB
39 net.egork.chelper.checkers.TokenChecker
0
0
10 2018.09.20
50 Educational Codeforces Round 51 (Rated for Div. 2)
1
14 io.InputReader
15 io.OutputWriter
0
0

View File

@@ -0,0 +1,42 @@
23 C - Vasya and Multisets
6 SINGLE
8 STANDARD
-1
8 STANDARD
-1
3
0
10 4
3 5 7 1
9 YES
BABA
1
1
8 3
3 5 1
3 NO
1
2
9 4
1 2 2 2
8 YES
ABAA
1
11 src/chelper
8 -Xmx256M
4 Main
13 chelper.TaskC
39 net.egork.chelper.checkers.TokenChecker
0
0
10 2018.09.20
50 Educational Codeforces Round 51 (Rated for Div. 2)
1
14 io.InputReader
15 io.OutputWriter
0
0

View File

@@ -0,0 +1,63 @@
15 D - Bicolorings
6 SINGLE
8 STANDARD
-1
8 STANDARD
-1
9
0
4 3 4
3 12
1
1
4 4 1
2 2
1
2
4 1 2
2 2
1
3
9 1000 2000
1 2
1
4
3 1 1
1 2
1
5
3 1 2
1 2
1
6
6 1000 1
1 2
1
7
3 2 2
2 12
1
8
3 3 0
1 0
1
11 src/chelper
8 -Xmx256M
4 Main
13 chelper.TaskD
39 net.egork.chelper.checkers.TokenChecker
0
0
10 2018.09.20
50 Educational Codeforces Round 51 (Rated for Div. 2)
1
14 io.InputReader
15 io.OutputWriter
0
0

View File

@@ -0,0 +1,111 @@
package chelper;
import io.InputReader;
import io.OutputWriter;
import misc.SimpleSavingChelperSolution;
public class TaskA extends SimpleSavingChelperSolution {
public void solve(int testNumber, InputReader in, OutputWriter out) {
wrapSolve(testNumber, in, out);
}
int getType(char c) {
if ('A' <= c && c <= 'Z') {
return 0;
}
if ('a' <= c && c <= 'z') {
return 1;
}
if ('0' <= c && c <= '9') {
return 2;
}
throw new RuntimeException();
}
char getChar(int type) {
if (type == 0) {
return 'A';
}
if (type == 1) {
return 'a';
}
if (type == 2) {
return '0';
}
throw new RuntimeException();
}
boolean isOk(int[] a) {
int[] counts = new int[3];
for (int i : a) {
counts[i]++;
}
return counts[0] > 0 && counts[1] > 0 && counts[2] > 0;
}
@Override
public void solve(int testNumber) {
String s = in.nextString();
int n = s.length();
char[] chars = s.toCharArray();
int[] types = new int[n];
int[] counts = new int[3];
for (int i = 0; i < n; i++) {
types[i] = getType(chars[i]);
counts[types[i]]++;
}
if (isOk(types)) {
out.println(s);
return;
}
int[] t = new int[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < n; k++) {
t[k] = types[k];
}
t[i] = j;
if (isOk(t)) {
chars[i] = getChar(j);
out.println(new String(chars));
return;
}
}
}
for (int i = 0; i < n - 1; i++) {
for (int j1 = 0; j1 < 3; j1++) {
for (int j2 = j1 + 1; j2 < 3; j2++) {
for (int k = 0; k < n; k++) {
t[k] = types[k];
}
t[i] = j1;
t[i + 1] = j2;
if (isOk(t)) {
chars[i] = getChar(j1);
chars[i + 1] = getChar(j2);
out.println(new String(chars));
return;
}
}
}
}
}
}

View File

@@ -0,0 +1,25 @@
package chelper;
import io.InputReader;
import io.OutputWriter;
import misc.SimpleSavingChelperSolution;
public class TaskB extends SimpleSavingChelperSolution {
public void solve(int testNumber, InputReader in, OutputWriter out) {
wrapSolve(testNumber, in, out);
}
@Override
public void solve(int testNumber) {
long l = in.nextLong();
long r = in.nextLong();
out.println("YES");
for (long i = l; i <= r; i += 2) {
out.println(i + " " + (i + 1));
}
}
}

View File

@@ -0,0 +1,82 @@
package chelper;
import io.InputReader;
import io.OutputWriter;
import misc.SimpleSavingChelperSolution;
public class TaskC extends SimpleSavingChelperSolution {
public void solve(int testNumber, InputReader in, OutputWriter out) {
wrapSolve(testNumber, in, out);
}
@Override
public void solve(int testNumber) {
int n = in.nextInt();
int[] a = in.nextIntArray(n);
int[] counts = new int[200];
for (int i : a) {
counts[i]++;
}
int size1 = 0;
int size2 = 0;
int size3Plus = 0;
for (int count : counts) {
if (count == 1) {
size1++;
}
if (count == 2) {
size2++;
}
if (count >= 3) {
size3Plus++;
}
}
if (size1 % 2 == 1 && size3Plus == 0) {
out.println("NO");
return;
}
boolean[] mask = new boolean[n];
boolean parity = true;
boolean shouldUse3Plus = size1 % 2 == 1;
for (int i = 0; i < 200; i++) {
if (counts[i] == 1) {
for (int j = 0; j < n; j++) {
if (a[j] == i) {
mask[j] = parity;
}
}
parity = !parity;
}
if (counts[i] >= 3 && shouldUse3Plus) {
boolean first = true;
for (int j = 0; j < n; j++) {
if (a[j] == i) {
mask[j] = parity == first;
first = false;
}
}
parity = !parity;
shouldUse3Plus = false;
}
}
out.println("YES");
for (boolean b : mask) {
out.print(b ? 'A' : 'B');
}
}
}

View File

@@ -0,0 +1,58 @@
package chelper;
import io.InputReader;
import io.OutputWriter;
import misc.SimpleSavingChelperSolution;
public class TaskD extends SimpleSavingChelperSolution {
public void solve(int testNumber, InputReader in, OutputWriter out) {
wrapSolve(testNumber, in, out);
}
int MOD = 998244353;
int[][] componentChanges = {
{0, 1, 1, 1}, //00
{0, 0, 2, 0}, //01
{0, 2, 0, 0}, //10
{1, 1, 1, 0}, //11
};
@Override
public void solve(int testNumber) {
int n = in.nextInt();
int colors = in.nextInt();
int[][][] dp = new int[n][colors + 10][4];
dp[0][1][0]++;
dp[0][2][1]++;
dp[0][2][2]++;
dp[0][1][3]++;
for (int i = 0; i < n - 1; i++) {
for (int k = 0; k <= colors; k++) {
for (int curMask = 0; curMask < 4; curMask++) {
for (int nextMask = 0; nextMask < 4; nextMask++) {
int newK = k + componentChanges[curMask][nextMask];
if (newK > colors) {
continue;
}
dp[i + 1][newK][nextMask] += dp[i][k][curMask];
dp[i + 1][newK][nextMask] %= MOD;
}
}
}
}
int result = 0;
for (int i = 0; i < 4; i++) {
result += dp[n - 1][colors][i];
result %= MOD;
}
out.println(result);
}
}

View File

@@ -0,0 +1,303 @@
package chelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;
import io.InputReader;
import io.OutputWriter;
import misc.Pair;
import misc.SimpleSavingChelperSolution;
public class TaskF extends SimpleSavingChelperSolution {
public static final long INF = Long.MAX_VALUE / 100;
private Map<Integer, Map<Integer, Long>> edges;
private int n;
private int m;
private int treeCount;
private int[] vertexTreeId;
private Set<Integer> treeEgressPointsSet;
private int[] vertexTreeHeight;
private long[] vertexTreeLength;
private boolean[] tainted;
private int[] dfsIn;
private int[] dfsOut;
private int timer;
private int[][] upside;
private List<List<Integer>> egressPointsByTree;
private List<int[]> edges2Dest;
private List<long[]> edges2Dist;
public void solve(int testNumber, InputReader in, OutputWriter out) {
TaskF task = this;
Thread thread = new Thread(null, new Runnable() {
@Override
public void run() {
task.wrapSolve(testNumber, in, out);
}
}, "Test", 1 << 26);
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// wrapSolve(testNumber, in, out);
}
static final int UPSIDE_L = 20;
@Override
public void solve(int testNumber) {
long startTime = System.nanoTime();
n = in.nextInt();
m = in.nextInt();
edges = new HashMap<>();
for (int i = 0; i < n; i++) {
edges.put(i, new HashMap<>());
}
for (int i = 0; i < m; i++) {
int a = in.nextInt() - 1;
int b = in.nextInt() - 1;
long c = in.nextLong();
edges.get(a).put(b, c);
edges.get(b).put(a, c);
}
treeCount = 0;
vertexTreeId = new int[n];
vertexTreeHeight = new int[n];
vertexTreeLength = new long[n];
Arrays.fill(vertexTreeId, -1);
treeEgressPointsSet = new HashSet<>();
dfsIn = new int[n];
dfsOut = new int[n];
timer = 1;
upside = new int[n][UPSIDE_L + 1];
for (int i = 0; i < n; i++) {
Arrays.fill(upside[i], -1);
}
tainted = new boolean[n];
treefy();
// treefy2();
debug.println("Treefy finish " + (System.nanoTime() - startTime) / 1e9);
debug.println("Trees: " + treeCount);
debug.println("TEP: " + treeEgressPointsSet.size());
egressPointsByTree = new ArrayList<>();
for (int i = 0; i < treeCount; i++) {
egressPointsByTree.add(new ArrayList<>());
}
for (int v1 : treeEgressPointsSet) {
egressPointsByTree.get(vertexTreeId[v1]).add(v1);
}
edges2Dest = new ArrayList<>();
edges2Dist = new ArrayList<>();
for (int v = 0; v < n; v++) {
int m = edges.get(v).size();
int[] dest = new int[m];
long[] dist = new long[m];
int k = 0;
for (Map.Entry<Integer, Long> entry : edges.get(v).entrySet()) {
int vv = entry.getKey();
long c = entry.getValue();
dest[k] = vv;
dist[k] = c;
k++;
}
edges2Dest.add(dest);
edges2Dist.add(dist);
}
Map<Integer, long[]> egressDistances = new HashMap<>();
for (int origin : treeEgressPointsSet) {
long[] distances = new long[n];
Arrays.fill(distances, INF);
distances[origin] = 0;
egressDistances.put(origin, distances);
egressDijkstra(origin, distances);
}
debug.println("Dijkstra finish " + (System.nanoTime() - startTime) / 1e9);
debug.println("preprocess finish " + (System.nanoTime() - startTime) / 1e9);
int requestCount = in.nextInt();
for (int i = 0; i < requestCount; i++) {
int a = in.nextInt() - 1;
int b = in.nextInt() - 1;
long res = INF;
if (vertexTreeId[a] == vertexTreeId[b]) {
res = Math.min(res, insideTreeDistance(a, b));
}
for (int v1 : egressPointsByTree.get(vertexTreeId[a])) {
long dist = egressDistances.get(v1)[a] + egressDistances.get(v1)[b];
res = Math.min(res, dist);
}
out.println(res);
}
}
boolean isUpsideInTree(int a, int b) {
return dfsIn[a] <= dfsIn[b] && dfsOut[a] >= dfsOut[b];
}
int lca(int a, int b) {
if (isUpsideInTree(a, b)) {
return a;
}
if (isUpsideInTree(b, a)) {
return b;
}
for (int l = UPSIDE_L; l >= 0; l--) {
if (upside[a][l] == -1) {
continue;
}
if (!isUpsideInTree(upside[a][l], b)) {
a = upside[a][l];
}
}
return upside[a][0];
}
long insideTreeDistance(int v1, int v2) {
int l = lca(v1, v2);
return vertexTreeLength[v1] + vertexTreeLength[v2] - vertexTreeLength[l] * 2;
}
void treefyDfs(int v, List<Integer> stack) {
dfsIn[v] = timer++;
for (Map.Entry<Integer, Long> edge : edges.get(v).entrySet()) {
int vv = edge.getKey();
long c = edge.getValue();
if (vertexTreeId[vv] == -1 && !tainted[vv]) {
for (Map.Entry<Integer, Long> edge2 : edges.get(vv).entrySet()) {
int vvv = edge2.getKey();
if (vertexTreeId[vvv] == vertexTreeId[v] && vvv != v) {
tainted[vv] = true;
}
}
if (tainted[vv]) {
continue;
}
vertexTreeId[vv] = vertexTreeId[v];
vertexTreeHeight[vv] = vertexTreeHeight[v] + 1;
vertexTreeLength[vv] = vertexTreeLength[v] + c;
stack.add(vv);
for (int l = 0; l <= UPSIDE_L; l++) {
int j = stack.size() - 1 - (1 << l);
if (j < 0) {
break;
}
upside[vv][l] = stack.get(j);
}
treefyDfs(vv, stack);
stack.remove(stack.size() - 1);
}
if (vertexTreeId[v] != vertexTreeId[vv] && vertexTreeId[vv] != -1) {
treeEgressPointsSet.add(v);
treeEgressPointsSet.add(vv);
}
}
dfsOut[v] = timer++;
}
void egressDijkstra(int origin, long[] distances) {
PriorityQueue<long[]> queue = new PriorityQueue<>(new Comparator<long[]>() {
@Override
public int compare(long[] o1, long[] o2) {
return Long.compare(o1[0], o2[0]);
}
});
Arrays.fill(tainted, false);
int treeId = vertexTreeId[origin];
queue.add(new long[]{0L, origin});
tainted[origin] = true;
while (!queue.isEmpty()) {
int v = (int) queue.poll()[1];
int[] dest = edges2Dest.get(v);
long[] dist = edges2Dist.get(v);
for (int i = 0; i < dest.length; i++) {
int vv = dest[i];
long c = dist[i];
distances[vv] = Math.min(distances[vv], distances[v] + c);
if (tainted[vv]) {
continue;
}
tainted[vv] = true;
queue.add(new long[]{distances[vv], vv});
}
}
}
void treefy() {
for (int v = 0; v < n; v++) {
if (vertexTreeId[v] == -1) {
Arrays.fill(tainted, false);
int treeId = treeCount;
treeCount++;
vertexTreeId[v] = treeId;
vertexTreeHeight[v] = 0;
vertexTreeLength[v] = 0;
List<Integer> stack = new ArrayList<>();
stack.add(v);
treefyDfs(v, stack);
}
}
}
}