Skip to content

Commit 47a6972

Browse files
committed
TOKI Open Contest Feb 2017 + Topcoder Practice
1 parent 5a50fd6 commit 47a6972

14 files changed

+1843
-0
lines changed

Diff for: tlx/open-feb-2017/a.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
int main() {
6+
string s;
7+
int n;
8+
cin >> n >> s;
9+
int ans = 0;
10+
for (int i = 0; i < n; i++)
11+
if (s[i] > '1')
12+
ans++;
13+
int zero = 0, one = 0;
14+
for (int i = 0; i < n; i++) {
15+
if (s[i] == '1') {
16+
one = 1;
17+
break;
18+
}
19+
if (s[i] == '0')
20+
ans++, zero = 1;
21+
}
22+
if (!one && !zero) {
23+
puts("-1");
24+
return 0;
25+
}
26+
if (zero)
27+
ans = min(ans, n-1);
28+
printf("%d\n", ans);
29+
return 0;
30+
}

Diff for: tlx/open-feb-2017/b.cpp

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 155;
6+
7+
long long s[N], a[N], b[N];
8+
int ul[N], ur[N], id[N];
9+
int n, m, pos[N];
10+
11+
bool cek(long long x) {
12+
memset(ul, 0, sizeof ul);
13+
memset(ur, 0, sizeof ur);
14+
for (int z = 0; z < n; z++) {
15+
int le = -1, ri = -1;
16+
int i = id[z];
17+
for (int j = 0; j < n; j++) {
18+
if (j == i) continue;
19+
if (abs(s[i] - s[j]) > x) continue;
20+
if (b[j] <= a[i] && !ur[j]) {
21+
if (le == -1 || pos[j] < pos[le])
22+
le = j;
23+
}
24+
if (a[j] >= b[i] && !ul[j]) {
25+
if (ri == -1 || pos[j] < pos[ri])
26+
ri = j;
27+
}
28+
}
29+
if (le != -1) {
30+
ul[i] = 1;
31+
ur[le] = 1;
32+
}
33+
if (ri != -1) {
34+
ur[i] = 1;
35+
ul[ri] = 1;
36+
}
37+
}
38+
int cnt = 0;
39+
for (int i = 0; i < n; i++)
40+
cnt += ul[i] == 0;
41+
return cnt <= m;
42+
}
43+
bool cmp(int le, int ri) {
44+
return s[le] > s[ri];
45+
}
46+
47+
int main() {
48+
scanf("%d %d", &n, &m);
49+
long long l = 0, r = 0;
50+
for (int i = 0;i < n; i++) {
51+
scanf("%lld %lld %lld", s+i, a+i, b+i);
52+
r = max(r, s[i]);
53+
id[i] = i;
54+
}
55+
sort(id, id+n, cmp);
56+
for (int i = 0; i < n; i++)
57+
pos[id[i]] = i;
58+
while (l < r) {
59+
long long mid = (l + r) / 2;
60+
if (cek(mid))
61+
r = mid;
62+
else
63+
l = mid+1;
64+
}
65+
if (!cek(l)) {
66+
puts("-1");
67+
}
68+
else
69+
printf("%lld\n", l);
70+
return 0;
71+
}

Diff for: tlx/open-feb-2017/c.cpp

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 1e5 + 6, mod = 1e9 + 7;
6+
7+
long long bit[N];
8+
int m;
9+
void upd(int x, long long val) {
10+
for (; x <= m; x += x&(-x))
11+
bit[x] = (bit[x] + mod + val) % mod;
12+
}
13+
long long get(int x) {
14+
long long ret = 0;
15+
for (; x; x -= x&(-x))
16+
ret = (ret + mod + bit[x]) % mod;
17+
return ret;
18+
}
19+
long long powmod(long long b, long long p) {
20+
long long ret = 1;
21+
for (; p; p >>= 1, b = (b * b) % mod)
22+
if (p &1) ret =(ret * b) % mod;
23+
return ret;
24+
}
25+
int a[N];
26+
int cnt[N];
27+
28+
int main() {
29+
int n;
30+
scanf("%d", &n);
31+
m = n;
32+
vector< int > v;
33+
for (int i = 0;i < n; i++) {
34+
scanf("%d", a+i);
35+
v.push_back(a[i]);
36+
}
37+
sort(v.begin(), v.end());
38+
v.erase(unique(v.begin(), v.end()), v.end());
39+
for (int i = 0; i < n; i++)
40+
a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
41+
for (int i = 0; i <= n; i++)
42+
bit[i] = 0;
43+
for (int i = 0; i < n; i++) {
44+
upd(a[i], get(a[i]) + 1);
45+
}
46+
long long ans = n + powmod(2, n) - 1 - get(n);
47+
for (int i = 0; i <= n; i++) {
48+
bit[i] = 0;
49+
}
50+
for (int i = n-1; i >= 0; i--) {
51+
upd(a[i], get(a[i]) + 1);
52+
}
53+
ans -= get(n);
54+
ans %= mod;
55+
if (ans < 0)
56+
ans += mod;
57+
for (int i = 0; i < n; i++)
58+
cnt[a[i]]++;
59+
for (int i = 0; i <= n; i++)
60+
ans = (ans + powmod(2, cnt[i]) - cnt[i] - 1) % mod;
61+
printf("%lld\n", ans);
62+
return 0;
63+
}

Diff for: topcoder/Arrfix.cpp

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
class Arrfix {
6+
public:
7+
int mindiff(vector <int> A, vector <int> B, vector <int> F) {
8+
int n = A.size();
9+
vector < pair< int, int > > diff;
10+
vector< int > same;
11+
for (int i = 0; i < n; i++) {
12+
if (A[i] != B[i])
13+
diff.emplace_back(A[i], B[i]);
14+
else
15+
same.push_back(A[i]);
16+
}
17+
vector< int > f2;
18+
int cnt = diff.size(), cnt2 = 0;
19+
for (int j = 0; j < F.size(); j++) {
20+
bool ok = 0;
21+
for (int i = 0; i < diff.size(); i++) {
22+
if (F[j] == diff[i].second) {
23+
diff[i] = {-1, -1};
24+
cnt--;
25+
ok = 1;
26+
break;
27+
}
28+
}
29+
for (int i = 0; !ok && i < same.size(); i++) {
30+
if (F[j] == same[i]) {
31+
same[i] = -1;
32+
ok = 1;
33+
break;
34+
}
35+
}
36+
if (!ok) {
37+
cnt2++;
38+
}
39+
}
40+
cnt2 -= min(cnt2, cnt);
41+
int ans = cnt + cnt2;
42+
return ans;
43+
}
44+
};
45+
46+
// BEGIN CUT HERE
47+
#include <ctime>
48+
#include <cmath>
49+
#include <string>
50+
#include <vector>
51+
#include <sstream>
52+
#include <iostream>
53+
#include <algorithm>
54+
using namespace std;
55+
56+
int main(int argc, char* argv[])
57+
{
58+
if (argc == 1)
59+
{
60+
cout << "Testing Arrfix (500.0 points)" << endl << endl;
61+
for (int i = 0; i < 20; i++)
62+
{
63+
ostringstream s; s << argv[0] << " " << i;
64+
int exitCode = system(s.str().c_str());
65+
if (exitCode)
66+
cout << "#" << i << ": Runtime Error" << endl;
67+
}
68+
int T = time(NULL)-1487339559;
69+
double PT = T/60.0, TT = 75.0;
70+
cout.setf(ios::fixed,ios::floatfield);
71+
cout.precision(2);
72+
cout << endl;
73+
cout << "Time : " << T/60 << " minutes " << T%60 << " secs" << endl;
74+
cout << "Score : " << 500.0*(.3+(.7*TT*TT)/(10.0*PT*PT+TT*TT)) << " points" << endl;
75+
}
76+
else
77+
{
78+
int _tc; istringstream(argv[1]) >> _tc;
79+
Arrfix _obj;
80+
int _expected, _received;
81+
time_t _start = clock();
82+
switch (_tc)
83+
{
84+
case 0:
85+
{
86+
int A[] = {1,1,1};
87+
int B[] = {2,2,2};
88+
int F[] = {2};
89+
_expected = 2;
90+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
91+
}
92+
case 1:
93+
{
94+
int A[] = {1,1,1};
95+
int B[] = {2,2,1};
96+
int F[] = {2,2};
97+
_expected = 0;
98+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
99+
}
100+
case 2:
101+
{
102+
int A[] = {1,2,3};
103+
int B[] = {3,2,1};
104+
int F[] = {};
105+
_expected = 2;
106+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
107+
}
108+
case 3:
109+
{
110+
int A[] = {2,2,2};
111+
int B[] = {2,2,2};
112+
int F[] = {1,2,3};
113+
_expected = 2;
114+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
115+
}
116+
case 4:
117+
{
118+
int A[] = {1,3,3,3};
119+
int B[] = {2,3,3,3};
120+
int F[] = {2,2};
121+
_expected = 1;
122+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
123+
}
124+
/*case 5:
125+
{
126+
int A[] = ;
127+
int B[] = ;
128+
int F[] = ;
129+
_expected = ;
130+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
131+
}*/
132+
/*case 6:
133+
{
134+
int A[] = ;
135+
int B[] = ;
136+
int F[] = ;
137+
_expected = ;
138+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
139+
}*/
140+
/*case 7:
141+
{
142+
int A[] = ;
143+
int B[] = ;
144+
int F[] = ;
145+
_expected = ;
146+
_received = _obj.mindiff(vector <int>(A, A+sizeof(A)/sizeof(int)), vector <int>(B, B+sizeof(B)/sizeof(int)), vector <int>(F, F+sizeof(F)/sizeof(int))); break;
147+
}*/
148+
default: return 0;
149+
}
150+
cout.setf(ios::fixed,ios::floatfield);
151+
cout.precision(2);
152+
double _elapsed = (double)(clock()-_start)/CLOCKS_PER_SEC;
153+
if (_received == _expected)
154+
cout << "#" << _tc << ": Passed (" << _elapsed << " secs)" << endl;
155+
else
156+
{
157+
cout << "#" << _tc << ": Failed (" << _elapsed << " secs)" << endl;
158+
cout << " Expected: " << _expected << endl;
159+
cout << " Received: " << _received << endl;
160+
}
161+
}
162+
}
163+
164+
// END CUT HERE

0 commit comments

Comments
 (0)