Skip to content

Commit 0dc79e6

Browse files
authored
Repository has been unarchived
New solutions were added
1 parent 1dd79fe commit 0dc79e6

20 files changed

+1706
-0
lines changed

DMOJ/acc1p1.cpp

+198
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/acc1p1
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef struct node* pnode;
7+
8+
struct node{
9+
10+
pnode l,r;
11+
int best,pref,suf,total,comp;
12+
int prior,size,val;
13+
bool flag;
14+
15+
node(int _val = 0){
16+
l = r = NULL;
17+
best = pref = suf = total = comp = val = _val;
18+
prior = rand();
19+
size = 1;
20+
flag = false;
21+
}
22+
23+
};
24+
25+
void propagate(pnode t){
26+
27+
if(t == NULL || !t->flag) return;
28+
29+
t->flag = false;
30+
swap(t->suf,t->pref);
31+
swap(t->l,t->r);
32+
33+
if(t->l) t->l->flag ^= true;
34+
if(t->r) t->r->flag ^= true;
35+
36+
}
37+
38+
inline int sz(pnode t){return t ? t->size : 0;}
39+
40+
inline void upd_sz(pnode t){if(t) t->size = sz(t->l) + 1 + sz(t->r);}
41+
42+
void upd_cont(pnode t){
43+
44+
if(t == NULL) return;
45+
46+
propagate(t->l);
47+
propagate(t->r);
48+
49+
if(t->val == 0){
50+
t->best = max(t->l ? (t->l->best) : 0, t->r ? t->r->best
51+
: 0);
52+
t->pref = t->l ? t->l->pref : 0;
53+
t->suf = t->r ? t->r->suf : 0;
54+
t->comp = 0;
55+
t->total = (t->l ? t->l-> total : 0) + (t->r ?
56+
t->r->total : 0);
57+
return;
58+
}
59+
60+
if(t->l && t->r){
61+
t->comp = t->l->comp && t->r->comp;
62+
t->total = (t->l->total) + 1 + (t->r->total);
63+
t->pref = max(t->l->pref,(t->l->comp)*(t->l->total + 1 +
64+
t->r->pref));
65+
t->suf = max(t->r->suf, (t->r->comp)*(t->r->total +
66+
t->val + t->l->suf));
67+
t->best = max(max(t->l->best,t->r->best), t->l->suf + 1
68+
+ t->r->pref );
69+
}
70+
else if(t->l){
71+
t->comp = t->l->comp;
72+
t->total = t->l->total + 1;
73+
t->pref = max(t->l->pref, t->l->comp*(t->l->total + 1)
74+
);
75+
t->suf = 1 + t->l->suf;
76+
t->best = max(t->l->best, 1 + t->l->suf );
77+
}
78+
else if(t->r){
79+
t->comp = t->r->comp;
80+
t->total = 1 + t->r->total;
81+
t->pref = 1 + t->r->pref;
82+
t->suf = max(t->r->suf, t->r->comp*(t->r->total + 1));
83+
t->best = max(t->r->best, 1 + t->r->pref );
84+
}
85+
else{
86+
t->best = t->pref = t->suf = t->total = t->comp = 1;
87+
}
88+
89+
}
90+
91+
void split(pnode t,pnode &l, pnode &r, int key,int add){
92+
93+
propagate(t);
94+
95+
if(t == NULL){
96+
l = r = NULL;
97+
return;
98+
}
99+
100+
int cur_key = sz(t->l) + add + 1;
101+
102+
if(key < cur_key){
103+
split(t->l,l,t->l,key,add);
104+
r = t;
105+
}
106+
else{
107+
split(t->r,t->r,r,key,cur_key);
108+
l = t;
109+
}
110+
111+
upd_sz(t);
112+
upd_cont(t);
113+
114+
}
115+
116+
void merge(pnode &t, pnode l, pnode r){
117+
118+
propagate(l);
119+
propagate(r);
120+
121+
if(l == NULL){
122+
t = r;
123+
}
124+
else if(r == NULL){
125+
t = l;
126+
}
127+
else if(l->prior > r->prior){
128+
merge(l->r,l->r,r);
129+
t = l;
130+
}
131+
else{
132+
merge(r->l,l,r->l);
133+
t = r;
134+
}
135+
136+
upd_sz(t);
137+
upd_cont(t);
138+
139+
}
140+
141+
void reverse(pnode &t, int a,int b){
142+
143+
pnode L,mid,R;
144+
145+
split(t,L,R,a-1,0);
146+
split(R,mid,R,b,sz(L));
147+
148+
mid->flag = true;
149+
150+
merge(t,L,mid);
151+
merge(t,t,R);
152+
153+
}
154+
155+
int query(pnode &t,int a,int b){
156+
157+
pnode L,mid,R;
158+
159+
split(t,L,R,a-1,0);
160+
split(R,mid,R,b,sz(L));
161+
162+
int ans = mid->best;
163+
164+
merge(t,L,mid);
165+
merge(t,t,R);
166+
return ans;
167+
168+
}
169+
170+
int main(){
171+
172+
int N,Q;
173+
scanf("%d %d",&N,&Q);
174+
175+
pnode raiz = NULL;
176+
177+
for(int i = 1;i<=N;i++){
178+
char c;
179+
scanf(" %c",&c);
180+
pnode novo = new node(c == '1');
181+
merge(raiz,raiz,novo);
182+
}
183+
184+
while(Q--){
185+
int op,a,b;
186+
scanf("%d %d %d",&op,&a,&b);
187+
a++;
188+
if(op == 1){
189+
reverse(raiz,a,a+b-1);
190+
}
191+
else{
192+
printf("%d\n",query(raiz,a,a+b-1));
193+
}
194+
}
195+
196+
return 0;
197+
198+
}

DMOJ/acc3p2.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/acc3p2
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef long long ll;
7+
8+
ll check(ll a,ll b,vector<ll>& A, vector<ll>& B){
9+
ll tot = 0;
10+
for(int i = 0;i<A.size();i++){
11+
tot += max(abs(A[i] - a),abs(B[i]-b));
12+
}
13+
return tot;
14+
}
15+
16+
int main(){
17+
18+
ll ans = 1e18;
19+
int N;
20+
vector<ll> X,Y,oX,oY;
21+
22+
scanf("%d",&N);
23+
for(int i = 1;i<=N;i++){
24+
ll x,y;
25+
scanf("%lld %lld",&x,&y);
26+
oX.push_back(x);
27+
oY.push_back(y);
28+
X.push_back(x+y);
29+
Y.push_back(x-y);
30+
}
31+
32+
sort(X.begin(),X.end());
33+
sort(Y.begin(),Y.end());
34+
ll s1 = X[N/2],s2 = Y[N/2];
35+
ll x0 = (s1+s2)/2;
36+
ll y0 = s1 - x0;
37+
38+
for(int i = -2;i<=2;i++){
39+
for(int j = -2;j<=2;j++){
40+
ans = min(ans, check(x0+i,y0+j,oX,oY) );
41+
}
42+
}
43+
44+
printf("%lld\n",ans);
45+
46+
return 0;
47+
}

DMOJ/acc3p4.cpp

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/acc3p4
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef long long ll;
7+
8+
const int MAXN = 1e6 + 10;
9+
10+
ll seg[4*MAXN],lazy_a[4*MAXN],lazy_r[4*MAXN];
11+
int N,Q;
12+
13+
ll soma_pa(ll a,ll r,ll n){
14+
ll b = a + (n-1)*r;
15+
return ((a+b)*n)/2;
16+
}
17+
18+
void propagate(int pos,int left,int right){
19+
20+
if(lazy_a[pos] == 0 && lazy_r[pos] == 0) return;
21+
22+
seg[pos] += soma_pa(lazy_a[pos],lazy_r[pos],right - left + 1);
23+
24+
if(left != right){
25+
int mid = (left+right)/2;
26+
lazy_a[2*pos] += lazy_a[pos];
27+
lazy_a[2*pos+1] += lazy_a[pos] +
28+
(mid+1-left)*lazy_r[pos];
29+
lazy_r[2*pos] += lazy_r[pos];
30+
lazy_r[2*pos+1] += lazy_r[pos];
31+
}
32+
33+
lazy_a[pos] = 0;
34+
lazy_r[pos] = 0;
35+
36+
}
37+
38+
void update(int pos,int left,int right,int i,int j,ll a,ll r){
39+
40+
propagate(pos,left,right);
41+
if(left>right||left>j||right<i) return;
42+
43+
if(left >= i && right <= j){
44+
lazy_a[pos] += a + r*(left - i);
45+
lazy_r[pos] += r;
46+
propagate(pos,left,right);
47+
return;
48+
}
49+
50+
int mid = (left+right)/2;
51+
update(2*pos,left,mid,i,j,a,r);
52+
update(2*pos+1,mid+1,right,i,j,a,r);
53+
54+
seg[pos] = seg[2*pos] + seg[2*pos+1];
55+
56+
}
57+
58+
ll query(int pos,int left,int right,int i,int j){
59+
60+
propagate(pos,left,right);
61+
62+
if(left >= i && right <= j) return seg[pos];
63+
64+
int mid = (left+right)/2;
65+
if(j <= mid) return query(2*pos,left,mid,i,j);
66+
else if(i >= mid + 1) return query(2*pos+1,mid+1,right,i,j);
67+
else return query(2*pos,left,mid,i,j) +
68+
query(2*pos+1,mid+1,right,i,j);
69+
70+
}
71+
72+
int main(){
73+
74+
scanf("%d %d",&N,&Q);
75+
76+
for(int q = 1;q<=Q;q++){
77+
int op,i,j,k;
78+
scanf("%d",&op);
79+
if(op == 1){
80+
scanf("%d %d %d",&i,&j,&k);
81+
update(1,1,N,i,j,k,k);
82+
}
83+
else{
84+
scanf("%d %d",&i,&j);
85+
printf("%lld\n",query(1,1,N,i,j));
86+
}
87+
}
88+
89+
return 0;
90+
91+
}

0 commit comments

Comments
 (0)