Submission #538238

# Submission time Handle Problem Language Result Execution time Memory
538238 2022-03-16T11:33:52 Z MrTEK Mutating DNA (IOI21_dna) C++17
100 / 100
132 ms 12296 KB
#include "dna.h"
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <climits>
#include <ctime>
 
 
using namespace std;
 
const int N = 1e5 + 5;

char s1[N],s2[N];
int n;


int f(int x,int y) {
	if (s1[x] == 'A' && s2[y] == 'T')
		return 0;
	if (s1[x] == 'T' && s2[y] == 'A')
		return 1;
	if (s1[x] == 'A' && s2[y] == 'C')
		return 2;
	if (s1[x] == 'C' && s2[y] == 'A')
		return 3;
	if (s1[x] == 'C' && s2[y] == 'T')
		return 4;
	if (s1[x] == 'T' && s2[y] == 'C')
		return 5;
	return 6;
}

struct node {
	int cnt[7];
	int swp;

    node operator+(node oth) {
    	node res;

    	res.swp = swp + oth.swp;

    	for (int i = 0 ; i < 7 ; i++)
    		res.cnt[i] = cnt[i] + oth.cnt[i];

    	int simplify01 = min(res.cnt[0],res.cnt[1]);
    	int simplify23 = min(res.cnt[2],res.cnt[3]);
    	int simplify45 = min(res.cnt[4],res.cnt[5]);

    	res.swp += simplify01 + simplify23 + simplify45;

    	res.cnt[0] -= simplify01;
    	res.cnt[1] -= simplify01;
    	res.cnt[2] -= simplify23;
    	res.cnt[3] -= simplify23;
    	res.cnt[4] -= simplify45;
    	res.cnt[5] -= simplify45;

    	return res;
    }

}tree[N<<2],zero;


void init_tree(int ind,int l,int r) {

	if (l == r) {
		tree[ind].cnt[f(l,r)] = 1;
		return;
	}

	int mid = (l + r) / 2;

	init_tree(ind + ind,l,mid);
	init_tree(ind + ind + 1,mid + 1,r);

	tree[ind] = tree[ind + ind] + tree[ind + ind + 1];

}

void init(std::string a, std::string b) {
	n = a.size();
	for (int i = 0 ; i < a.size() ; i++)
		s1[i + 1] = a[i];

	for (int i = 0 ; i < b.size() ; i++)
		s2[i + 1] = b[i];

	init_tree(1,1,n);
	// cout << "init : " << tree[1].swp << endl;
}

node query(int ind,int l,int r,int lw,int rw) {
	if (l > rw || r < lw)
		return zero;

	if (l >= lw && r <= rw)
		return tree[ind];

	int mid = (l + r) / 2;
	return query(ind + ind,l,mid,lw,rw) + query(ind + ind + 1,mid + 1,r,lw,rw);
}

int get_distance(int x, int y) {

	x++;
	y++;
	node res = query(1,1,n,x,y);

	// cerr << "new:\n------\n";

	// for (int i = 0 ; i < 6 ; i++)
	// 	cout << i << " -> " << res.cnt[i] << endl;


	// cout << "swap : " << res.swp << endl;


	int ans1 = -1;
	if (res.cnt[1] || res.cnt[4] || res.cnt[2])
		ans1 = -1;
	else if (res.cnt[0] == res.cnt[5] && res.cnt[5] == res.cnt[3])
		ans1 = res.cnt[0] * 2 + res.swp;
	else ans1 = -1;

	
	int ans2 = -1;
	if (res.cnt[0] || res.cnt[5] || res.cnt[3])
		ans2 = -1;		
	else if (res.cnt[1] == res.cnt[4] && res.cnt[4] == res.cnt[2])
		ans2 = res.cnt[1] * 2 + res.swp;
	else ans2 = -1;


	// cerr << ans1 << " " << ans2 << endl;

	return max(ans1,ans2);
}


Compilation message

dna.cpp: In function 'void init(std::string, std::string)':
dna.cpp:93:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  for (int i = 0 ; i < a.size() ; i++)
      |                   ~~^~~~~~~~~~
dna.cpp:96:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |  for (int i = 0 ; i < b.size() ; i++)
      |                   ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 87 ms 10512 KB Output is correct
2 Correct 82 ms 10528 KB Output is correct
3 Correct 77 ms 10480 KB Output is correct
4 Correct 91 ms 11888 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 304 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 9 ms 9172 KB Output is correct
5 Correct 9 ms 9228 KB Output is correct
6 Correct 11 ms 9232 KB Output is correct
7 Correct 9 ms 9172 KB Output is correct
8 Correct 10 ms 9232 KB Output is correct
9 Correct 9 ms 9196 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 9 ms 9172 KB Output is correct
5 Correct 9 ms 9228 KB Output is correct
6 Correct 11 ms 9232 KB Output is correct
7 Correct 9 ms 9172 KB Output is correct
8 Correct 10 ms 9232 KB Output is correct
9 Correct 9 ms 9196 KB Output is correct
10 Correct 81 ms 10532 KB Output is correct
11 Correct 86 ms 10528 KB Output is correct
12 Correct 112 ms 10872 KB Output is correct
13 Correct 108 ms 10972 KB Output is correct
14 Correct 109 ms 10916 KB Output is correct
15 Correct 115 ms 10784 KB Output is correct
16 Correct 109 ms 10868 KB Output is correct
17 Correct 106 ms 10920 KB Output is correct
18 Correct 108 ms 10904 KB Output is correct
19 Correct 92 ms 10900 KB Output is correct
20 Correct 94 ms 10892 KB Output is correct
21 Correct 108 ms 10904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 9 ms 9172 KB Output is correct
5 Correct 9 ms 9228 KB Output is correct
6 Correct 11 ms 9232 KB Output is correct
7 Correct 9 ms 9172 KB Output is correct
8 Correct 10 ms 9232 KB Output is correct
9 Correct 9 ms 9196 KB Output is correct
10 Correct 9 ms 9172 KB Output is correct
11 Correct 10 ms 9428 KB Output is correct
12 Correct 8 ms 9428 KB Output is correct
13 Correct 9 ms 9408 KB Output is correct
14 Correct 9 ms 9428 KB Output is correct
15 Correct 10 ms 9428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 87 ms 10512 KB Output is correct
2 Correct 82 ms 10528 KB Output is correct
3 Correct 77 ms 10480 KB Output is correct
4 Correct 91 ms 11888 KB Output is correct
5 Correct 1 ms 300 KB Output is correct
6 Correct 1 ms 304 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 9 ms 9172 KB Output is correct
12 Correct 9 ms 9228 KB Output is correct
13 Correct 11 ms 9232 KB Output is correct
14 Correct 9 ms 9172 KB Output is correct
15 Correct 10 ms 9232 KB Output is correct
16 Correct 9 ms 9196 KB Output is correct
17 Correct 81 ms 10532 KB Output is correct
18 Correct 86 ms 10528 KB Output is correct
19 Correct 112 ms 10872 KB Output is correct
20 Correct 108 ms 10972 KB Output is correct
21 Correct 109 ms 10916 KB Output is correct
22 Correct 115 ms 10784 KB Output is correct
23 Correct 109 ms 10868 KB Output is correct
24 Correct 106 ms 10920 KB Output is correct
25 Correct 108 ms 10904 KB Output is correct
26 Correct 92 ms 10900 KB Output is correct
27 Correct 94 ms 10892 KB Output is correct
28 Correct 108 ms 10904 KB Output is correct
29 Correct 9 ms 9172 KB Output is correct
30 Correct 10 ms 9428 KB Output is correct
31 Correct 8 ms 9428 KB Output is correct
32 Correct 9 ms 9408 KB Output is correct
33 Correct 9 ms 9428 KB Output is correct
34 Correct 10 ms 9428 KB Output is correct
35 Correct 1 ms 308 KB Output is correct
36 Correct 81 ms 11788 KB Output is correct
37 Correct 105 ms 11872 KB Output is correct
38 Correct 106 ms 12204 KB Output is correct
39 Correct 109 ms 12260 KB Output is correct
40 Correct 132 ms 12296 KB Output is correct
41 Correct 9 ms 9428 KB Output is correct
42 Correct 111 ms 12168 KB Output is correct
43 Correct 103 ms 12164 KB Output is correct
44 Correct 111 ms 12124 KB Output is correct
45 Correct 107 ms 12104 KB Output is correct
46 Correct 91 ms 12140 KB Output is correct
47 Correct 100 ms 12148 KB Output is correct