Skip to content

Commit ec3317e

Browse files
committed
Solve alot of problems :3
1 parent 1f1d72a commit ec3317e

30 files changed

+1781
-1
lines changed

CodeForces/218C. Ice Skating.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
int n, a[101], b[101];
6+
bool vis[101];
7+
vector<vector<int> > g;
8+
9+
void dfs(int v) {
10+
vis[v] = true;
11+
12+
for(int i = 0, u; i < g[v].size(); ++i) {
13+
u = g[v][i];
14+
if(!vis[u])
15+
dfs(u);
16+
}
17+
}
18+
19+
int main() {
20+
scanf("%d", &n);
21+
for(int i = 0; i < n; ++i)
22+
scanf("%d %d", a + i, b + i);
23+
24+
g.resize(n);
25+
for(int i = 0; i < n; ++i)
26+
for(int j = 0; j < n; ++j)
27+
if(a[i] == a[j] || b[i] == b[j]) {
28+
g[i].push_back(j);
29+
g[j].push_back(i);
30+
}
31+
32+
int res = 0;
33+
for(int i = 0; i < n; ++i)
34+
if(!vis[i]) {
35+
++res;
36+
dfs(i);
37+
}
38+
39+
printf("%d\n", res - 1);
40+
41+
return 0;
42+
}

CodeForces/427C. Checkposts.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
int const N = 1e5 + 1, MOD = 1e9 + 7;
6+
int n, m, a[N], dfs, comp, idx[N], low[N];
7+
bool in[N];
8+
vector<int> st;
9+
vector<vector<int> > g, comps;
10+
11+
void DFS(int v) {
12+
low[v] = idx[v] = dfs++;
13+
in[v] = true;
14+
st.push_back(v);
15+
16+
for(int i = 0; i < g[v].size(); i++)
17+
if(idx[g[v][i]] == -1) {
18+
DFS(g[v][i]);
19+
low[v] = min(low[v], low[g[v][i]]);
20+
} else if(in[g[v][i]])
21+
low[v] = min(low[v], low[g[v][i]]);
22+
23+
if(low[v] == idx[v]) {
24+
int node;
25+
do {
26+
node = st.back();
27+
in[node] = false;
28+
st.pop_back();
29+
comps[comp].push_back(node);
30+
} while(node != v);
31+
32+
comp++;
33+
}
34+
}
35+
36+
int main() {
37+
scanf("%d", &n);
38+
g.resize(n);
39+
comps.resize(n);
40+
for(int i = 0; i < n; ++i)
41+
scanf("%d", a + i);
42+
scanf("%d", &m);
43+
for(int i = 0, a, b; i < m; ++i) {
44+
scanf("%d %d", &a, &b);
45+
--a, --b;
46+
g[a].push_back(b);
47+
}
48+
49+
memset(idx, -1, sizeof idx);
50+
memset(in, false, sizeof in);
51+
dfs = comp = 0;
52+
for(int i = 0; i < n; i++)
53+
if(idx[i] == -1)
54+
DFS(i);
55+
56+
long long res = 0, ways = 1;
57+
for(int i = 0; i < comps.size(); ++i, puts("")) {
58+
if(comps[i].empty())
59+
break;
60+
61+
int mnv = 2e9, mni;
62+
for(int j = 0; j < comps[i].size(); ++j)
63+
if(a[comps[i][j]] < mnv)
64+
mnv = a[comps[i][j]], mni = comps[i][j];
65+
res += a[mni];
66+
67+
int rep = 0;
68+
for(int j = 0; j < comps[i].size(); ++j)
69+
if(a[comps[i][j]] == a[mni])
70+
++rep;
71+
ways = ways * rep % MOD;
72+
}
73+
74+
printf("%lld %lld\n", res, ways);
75+
76+
return 0;
77+
}

CodeForces/467D. Fedor and Essay.cpp

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
struct node {
6+
int rRep, len, v;
7+
8+
node() {}
9+
node(int rRep, int len, int v) :
10+
rRep(rRep), len(len), v(v) {}
11+
12+
bool operator<(const node &n) const {
13+
if(rRep != n.rRep)
14+
return rRep > n.rRep;
15+
if(len != n.len)
16+
return len > n.len;
17+
return false;
18+
}
19+
};
20+
21+
int const N = 5e5 + 1;
22+
int m, n, id, lst, rRep[N], len[N], wRep[N];
23+
char s[N];
24+
bool vis[N];
25+
string tmp;
26+
node cur;
27+
map<string, int> mp;
28+
priority_queue<node> q;
29+
vector<vector<int> > g;
30+
31+
void Dijkstra() {
32+
while(!q.empty()) {
33+
cur = q.top();
34+
q.pop();
35+
36+
if(cur.v < lst && (cur.rRep < rRep[cur.v] ||
37+
(cur.rRep == rRep[cur.v]) && cur.len < len[cur.v]))
38+
rRep[cur.v] = cur.rRep, len[cur.v] = cur.len;
39+
40+
if(vis[cur.v])
41+
continue;
42+
vis[cur.v] = true;
43+
44+
for(int i = 0; i < g[cur.v].size(); ++i) {
45+
if(rRep[g[cur.v][i]] < cur.rRep ||
46+
(rRep[g[cur.v][i]] == cur.rRep && len[g[cur.v][i]] < cur.len))
47+
q.push(node(rRep[g[cur.v][i]], len[g[cur.v][i]], g[cur.v][i]));
48+
else
49+
q.push(node(cur.rRep, cur.len, g[cur.v][i]));
50+
}
51+
}
52+
}
53+
54+
int main() {
55+
scanf("%d", &m);
56+
for(int i = 0; i < m; ++i) {
57+
scanf("%s", s);
58+
tmp = s;
59+
transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
60+
if(mp.count(tmp) == 0) {
61+
mp[tmp] = id;
62+
for(int j = 0; j < tmp.length(); ++j)
63+
rRep[id] += (tmp[j] == 'r');
64+
len[id] = tmp.length();
65+
66+
++id;
67+
}
68+
++wRep[mp[tmp]];
69+
}
70+
lst = id;
71+
72+
g.resize(N);
73+
74+
scanf("%d", &n);
75+
for(int i = 0, a, b; i < n; ++i) {
76+
scanf("%s", s);
77+
tmp = s;
78+
transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
79+
if(mp.count(tmp) == 0) {
80+
mp[tmp] = id;
81+
for(int j = 0; j < tmp.length(); ++j)
82+
rRep[id] += (tmp[j] == 'r');
83+
len[id] = tmp.length();
84+
85+
++id;
86+
}
87+
a = mp[tmp];
88+
q.push(node(rRep[a], len[a], a));
89+
90+
scanf("%s", s);
91+
tmp = s;
92+
transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
93+
if(mp.count(tmp) == 0) {
94+
mp[tmp] = id;
95+
for(int j = 0; j < tmp.length(); ++j)
96+
rRep[id] += (tmp[j] == 'r');
97+
len[id] = tmp.length();
98+
99+
++id;
100+
}
101+
b = mp[tmp];
102+
q.push(node(rRep[b], len[b], b));
103+
104+
g[b].push_back(a);
105+
}
106+
107+
Dijkstra();
108+
109+
long long r1 = 0, r2 = 0;
110+
for(int i = 0; i < lst; ++i) {
111+
r1 += 1ll * rRep[i] * wRep[i];
112+
r2 += 1ll * len[i] * wRep[i];
113+
}
114+
115+
printf("%lld %lld\n", r1, r2);
116+
117+
return 0;
118+
}

CodeForces/557C. Arthur and Table.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
int const N = 1e5 + 1;
6+
int n, cs[N][201];
7+
pair<int, int> all[N];
8+
set<int> st;
9+
map<int, pair<int, int> > mp;
10+
11+
int work(int val) {
12+
int ret = 0;
13+
14+
int s = mp[val].first, e = mp[val].second;
15+
16+
for(int i = 0; i < 201; ++i)
17+
ret += i * (cs[n - 1][i] - cs[e][i]);
18+
19+
int mxr = e - s + 1;
20+
int otr = s;
21+
22+
if(mxr == otr) {
23+
for(int i = 0; i < 201; ++i)
24+
if(cs[s - 1][i] != 0) {
25+
ret += i;
26+
break;
27+
}
28+
} else if(mxr < otr) {
29+
int need = otr - mxr + 1;
30+
for(int i = 0; need > 0 && i < 201; ++i) {
31+
if(cs[s - 1][i] >= need) {
32+
ret += i * need;
33+
break;
34+
}
35+
else {
36+
need -= cs[s - 1][i];
37+
ret += i * cs[s - 1][i];
38+
}
39+
}
40+
}
41+
42+
return ret;
43+
}
44+
45+
int main() {
46+
scanf("%d", &n);
47+
for(int i = 0; i < n; ++i) {
48+
scanf("%d", &all[i].first);
49+
st.insert(all[i].first);
50+
}
51+
for(int i = 0; i < n; ++i)
52+
scanf("%d", &all[i].second);
53+
sort(all, all + n);
54+
55+
if(n == 1) {
56+
puts("0");
57+
return 0;
58+
}
59+
60+
for(int i = 0; i < n; ++i) {
61+
if(mp.count(all[i].first))
62+
mp[all[i].first].second = i;
63+
else {
64+
mp[all[i].first].first = i;
65+
mp[all[i].first].second = i;
66+
}
67+
}
68+
69+
++cs[0][all[0].second];
70+
for(int i = 1; i < n; ++i) {
71+
for(int j = 0; j < 201; ++j)
72+
cs[i][j] = cs[i - 1][j];
73+
++cs[i][all[i].second];
74+
}
75+
76+
int res = 2e9;
77+
for(set<int>::iterator it = st.begin(); it != st.end(); ++it)
78+
res = min(res, work(*it));
79+
80+
printf("%d\n", res);
81+
82+
return 0;
83+
}

0 commit comments

Comments
 (0)