Skip to content

Commit 4900099

Browse files
authored
More DMOJ Solutions
1 parent 05aa990 commit 4900099

40 files changed

+2959
-0
lines changed

DMOJ/aplusb2.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
const int MAXN = 1e5 + 10;
4+
typedef vector<int> vi;
5+
char entrada1[MAXN],entrada2[MAXN];
6+
vi soma(vi A,vi B){
7+
while(A.size() < B.size()) A.push_back(0);
8+
while(B.size() < A.size()) B.push_back(0);
9+
vi C;
10+
C.assign(A.size() + 5,0);
11+
for(int i = 0;i<A.size();i++){
12+
C[i] += A[i] + B[i];
13+
}
14+
for(int i = 0;i<C.size();i++){
15+
int t_val = C[i] % 10;
16+
int passa = (C[i] - t_val)/10;
17+
if(i + 1 < C.size()){
18+
C[i] = t_val;
19+
C[i+1] += passa;
20+
}
21+
}
22+
while(!C.empty() && C.back() == 0) C.pop_back();
23+
if(C.empty()) C.push_back(0);
24+
return C;
25+
}
26+
vi subtrai(vi A,vi B){
27+
while(A.size() < B.size()) A.push_back(0);
28+
while(B.size() < A.size()) B.push_back(0);
29+
vi C;
30+
C.assign(A.size() + 5,0);
31+
for(int i = 0;i<A.size();i++){
32+
C[i] += A[i] - B[i];
33+
if(C[i] < 0){
34+
C[i] += 10;
35+
C[i+1] -= 1;
36+
}
37+
}
38+
for(int i = 0;i<C.size();i++){
39+
int t_val = C[i] % 10;
40+
int passa = (C[i] - t_val)/10;
41+
if(i + 1 < C.size()){
42+
C[i] = t_val;
43+
C[i+1] += passa;
44+
}
45+
}
46+
while(!C.empty() && C.back() == 0) C.pop_back();
47+
if(C.empty()) C.push_back(0);
48+
return C;
49+
}
50+
int main(){
51+
int TC;
52+
scanf("%d",&TC);
53+
while(TC--){
54+
scanf("%s %s",entrada1,entrada2);
55+
string s1 = entrada1, s2 = entrada2;
56+
int flag1 = (s1[0] == '-'), flag2 = (s2[0] == '-');
57+
vi A,B;
58+
for(int i =0;i<s1.size();i++){
59+
if(s1[i] == '-') continue;
60+
A.push_back(s1[i] - '0');
61+
}
62+
for(int i =0;i<s2.size();i++){
63+
if(s2[i] == '-') continue;
64+
B.push_back(s2[i] - '0');
65+
}
66+
reverse(A.begin(),A.end());
67+
while(!A.empty() && A.back() == 0) A.pop_back();
68+
if(A.empty()) A.push_back(0);
69+
reverse(B.begin(),B.end());
70+
while(!B.empty() && B.back() == 0) B.pop_back();
71+
if(B.empty()) B.push_back(0);
72+
reverse(A.begin(),A.end());
73+
reverse(B.begin(),B.end());
74+
if(B.size() > A.size() || (B.size() == A.size() && B > A)){
75+
swap(A,B);
76+
swap(flag1,flag2);
77+
}
78+
reverse(A.begin(),A.end());
79+
reverse(B.begin(),B.end());
80+
if(flag1 == 0 && flag2 == 0){
81+
vi C = soma(A,B);
82+
reverse(C.begin(),C.end());
83+
for(int i = 0;i<C.size();i++) printf("%d",C[i]);
84+
printf("\n");
85+
}
86+
else if(flag1 == 0 && flag2 == 1){
87+
vi C = subtrai(A,B);
88+
reverse(C.begin(),C.end());
89+
for(int i = 0;i<C.size();i++) printf("%d",C[i]);
90+
printf("\n");
91+
}
92+
else if(flag1 == 1 && flag2 == 0){
93+
vi C = subtrai(A,B);
94+
reverse(C.begin(),C.end());
95+
if(C[0] != 0) printf("-");
96+
for(int i = 0;i<C.size();i++) printf("%d",C[i]);
97+
printf("\n");
98+
}
99+
else{
100+
vi C = soma(A,B);
101+
reverse(C.begin(),C.end());
102+
if(C[0] != 0) printf("-");
103+
for(int i = 0;i<C.size();i++) printf("%d",C[i]);
104+
printf("\n");
105+
}
106+
}
107+
return 0;
108+
}

DMOJ/ccc14s5.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <bits/stdc++.h>
2+
#define LSOne(S) (S & (-S))
3+
using namespace std;
4+
const int MAXN = 2010;
5+
typedef pair<short,short> ii;
6+
typedef tuple<int,short,short> trinca;
7+
struct node{
8+
int tamanho;
9+
vector<short> bit;
10+
void update(int idx,short val){
11+
while(idx <= tamanho){
12+
bit[idx] = max(bit[idx],val);
13+
idx += LSOne(idx);
14+
}
15+
}
16+
int query(int idx){
17+
short ans = 0;
18+
while(idx > 0){
19+
ans = max(ans,bit[idx]);
20+
idx -= LSOne(idx);
21+
}
22+
return ans;
23+
}
24+
};
25+
vector<trinca> ordenado;
26+
vector<int> comp[MAXN];
27+
ii pontos[MAXN];
28+
node raiz[MAXN];
29+
int modulo[MAXN],n;
30+
inline int abs(ii davez){
31+
return int(davez.first)*int(davez.first) + int(davez.second)*int(davez.second);
32+
}
33+
inline int hypot(ii A,ii B){
34+
return abs(ii(A.first - B.first,A.second - B.second));
35+
}
36+
inline int get_v(int i,int val){
37+
return prev(upper_bound(comp[i].begin(),comp[i].end(),val)) - comp[i].begin() + 1;
38+
}
39+
int main(){
40+
scanf("%d",&n);
41+
for(int i = 1;i<=n;i++){
42+
scanf("%hd %hd",&pontos[i].first,&pontos[i].second);
43+
modulo[i] = abs(pontos[i]);
44+
comp[i].push_back(0);
45+
comp[i].push_back(modulo[i]);
46+
for(int j = 1;j<i;j++){
47+
int dist = hypot(pontos[i],pontos[j]);
48+
ordenado.push_back(make_tuple(dist,i,j));
49+
comp[i].push_back(dist);
50+
comp[j].push_back(dist);
51+
}
52+
}
53+
sort(ordenado.begin(),ordenado.end());
54+
for(int i = 1;i<=n;i++){
55+
sort(comp[i].begin(),comp[i].end());
56+
comp[i].erase(unique(comp[i].begin(),comp[i].end()),comp[i].end());
57+
raiz[i].tamanho = (int)comp[i].size();
58+
raiz[i].bit.assign(raiz[i].tamanho+3,0);
59+
raiz[i].update(1,1);
60+
}
61+
for(int idx = 0;idx<ordenado.size();idx++){
62+
int dist = get<0>(ordenado[idx]),u = get<1>(ordenado[idx]),v = get<2>(ordenado[idx]);
63+
raiz[u].update(get_v(u,dist), raiz[v].query(get_v(v,dist-1)) + 1);
64+
raiz[v].update(get_v(v,dist), raiz[u].query(get_v(u,dist-1)) + 1);
65+
}
66+
int resp = raiz[1].query(get_v(1,modulo[1]-1));
67+
for(int i = 2;i<=n;i++) resp = max(resp, raiz[i].query(get_v(i,modulo[i]-1)));
68+
printf("%d\n",resp);
69+
return 0;
70+
}

DMOJ/ccc18s4.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
typedef long long ll;
5+
const int MAXN = 1e6 + 10;
6+
7+
ll dp[MAXN];
8+
unordered_map<int,ll> tab;
9+
10+
ll solve(int n){
11+
if(n < MAXN && dp[n] != -1) return dp[n];
12+
else if(n >= MAXN && tab.count(n)) return tab[n];
13+
ll tot = 0;
14+
ll i = 2;
15+
while(i <= n){
16+
ll q = n/i;
17+
ll j = n/q;
18+
tot += (j - i + 1)*solve(q);
19+
i = j + 1;
20+
}
21+
if(n < MAXN) return dp[n] = tot;
22+
else return tab[n] = tot;
23+
}
24+
25+
int main(){
26+
memset(dp,-1,sizeof(dp));
27+
dp[1] = 1;dp[0] = 0;
28+
int N;
29+
cin >> N;
30+
cout << solve(N) << endl;
31+
return 0;
32+
}

DMOJ/cco05p5.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
const int MAXN = 20100;
5+
6+
7+
int dp[MAXN][2],P[MAXN][2],N;
8+
9+
int dist(int A,int B){
10+
return max(A-B,B-A);
11+
}
12+
13+
int solve(int atual,int lado){
14+
if(atual == N + 2) return 0;
15+
if(dp[atual][lado] != -1) return dp[atual][lado];
16+
int pos = P[atual-1][lado];
17+
int v1 = solve(atual+1,1) + dist(pos,P[atual][0]) + dist(P[atual][0],P[atual][1]);
18+
int v2 = solve(atual+1,0) + dist(pos,P[atual][1]) + dist(P[atual][1],P[atual][0]);
19+
return dp[atual][lado] = min(v1,v2);
20+
}
21+
22+
int main(){
23+
while(scanf("%d",&N) != EOF){
24+
if(N == 0) break;
25+
memset(dp,-1,sizeof(dp));
26+
for(int i = 1;i<=N;i++) scanf("%d %d",&P[i][0],&P[i][1]);
27+
P[0][0] = P[0][1] = 1;
28+
P[N+1][0] = P[N+1][1] = N;
29+
printf("%d\n",solve(1,0) + N-1);
30+
}
31+
return 0;
32+
}

0 commit comments

Comments
 (0)