Skip to content

Commit 4c11dea

Browse files
authored
Added Spoj submisions
1 parent 6807b18 commit 4c11dea

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+4864
-0
lines changed

SPOJ/ACQUIRE.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
using namespace std;
5+
int pointer;
6+
typedef pair<int,int> ii;
7+
vector<long long> M;
8+
vector<long long> B;
9+
bool bad(int l1,int l2,int l3){
10+
return (B[l3]-B[l1])*(M[l1]-M[l2])<(B[l1]-B[l2])*(M[l3]-M[l1]);
11+
}
12+
void add(long long m,long long b){
13+
M.push_back(m);
14+
B.push_back(b);
15+
while (M.size()>=3&&bad(M.size()-3,M.size()-2,M.size()-1))
16+
{
17+
M.erase(M.end()-2);
18+
B.erase(B.end()-2);
19+
}
20+
}
21+
long long query(long long x){
22+
if (pointer>=M.size())
23+
pointer=M.size()-1;
24+
while (pointer<M.size()-1&&
25+
M[pointer+1]*x+B[pointer+1]<M[pointer]*x+B[pointer])
26+
pointer++;
27+
return M[pointer]*x+B[pointer];
28+
}
29+
int main(){
30+
int M,N,i;
31+
vector<ii> rect,a;
32+
scanf("%d",&M);
33+
for (i=0; i<M; i++){
34+
int aa,bb;
35+
scanf("%d %d",&aa,&bb);
36+
a.push_back(make_pair(aa,bb));
37+
}
38+
sort(a.begin(),a.end());
39+
for (i=0; i<M; i++){
40+
while (rect.size()>0&&rect[rect.size()-1].second<=a[i].second) rect.pop_back();
41+
rect.push_back(a[i]);
42+
}
43+
N = rect.size();
44+
long long best;
45+
add(rect[0].second,0);
46+
pointer=0;
47+
for (i=0; i<N; i++){
48+
best=query(rect[i].first);
49+
add(rect[i+1].second,best);
50+
}
51+
printf("%lld\n",best);
52+
return 0;
53+
}

SPOJ/ADAAPHID.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <cstdio>
2+
#include <vector>
3+
using namespace std;
4+
typedef long long ll;
5+
const ll ini = 0;
6+
const ll fim = (1LL << 60);
7+
vector<ll> esq,dir,val;
8+
ll it,n,last;
9+
void update(ll pos,ll left,ll right,ll x,ll delta){
10+
val[pos] += delta;
11+
if(left == right) return;
12+
ll mid = (left+right)/2;
13+
if(x <= mid){
14+
if(esq[pos] == -1){
15+
esq[pos] = ++it;
16+
esq.push_back(-1);
17+
dir.push_back(-1);
18+
val.push_back(0);
19+
}
20+
update(esq[pos],left,mid,x,delta);
21+
}
22+
else{
23+
if(dir[pos] == -1){
24+
dir[pos] = ++it;
25+
esq.push_back(-1);
26+
dir.push_back(-1);
27+
val.push_back(0);
28+
}
29+
update(dir[pos],mid+1,right,x,delta);
30+
}
31+
}
32+
ll query(ll pos,ll left,ll right,ll i,ll j){
33+
if(left > right || left > j || right < i) return 0;
34+
if(left >= i && right <= j){
35+
return val[pos];
36+
}
37+
ll mid = (left+right)/2;
38+
ll sinistra = (esq[pos] == -1) ? 0 : query(esq[pos],left,mid,i,j);
39+
ll destra = (dir[pos] == -1) ? 0 : query(dir[pos],mid+1,right,i,j);
40+
return sinistra + destra;
41+
}
42+
int main(){
43+
esq.push_back(-1);
44+
dir.push_back(-1);
45+
val.push_back(0);
46+
scanf("%lld",&n);
47+
while(n--){
48+
ll x,y;
49+
scanf("%lld %lld",&x,&y);
50+
x ^= last;
51+
y ^= last;
52+
update(0,ini,fim,x,y);
53+
last = query(0,0,fim,0,x);
54+
printf("%lld %lld\n",x,last);
55+
}
56+
return 0;
57+
}

SPOJ/ADAAPPLE.cpp

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#include <cstdio>
2+
#include <vector>
3+
#include <algorithm>
4+
#define MP make_pair
5+
#define LSOne(S) (S & (-S))
6+
using namespace std;
7+
typedef pair<int,int> ii;
8+
const int MAXN = 3*1e5 + 10;
9+
const ii NULO = MP(MAXN,MAXN);
10+
vector<int> grafo[MAXN];
11+
char entrada[MAXN];
12+
int dfsNum,chainNum,chainPtr,vetor[MAXN],nivel[MAXN],chainId[MAXN],chainHead[MAXN],chainPos[MAXN],bit[MAXN],pai[MAXN],tamanho[MAXN],cor[MAXN],n,q;
13+
ii arvore[8*MAXN],vetorzao[2*MAXN];
14+
void update_bit(int pos,int val){
15+
while(pos < MAXN){
16+
bit[pos] += val;
17+
pos += LSOne(pos);
18+
}
19+
}
20+
int read_bit(int pos){
21+
int ans = 0;
22+
while(pos > 0){
23+
ans += bit[pos];
24+
pos -= LSOne(pos);
25+
}
26+
return ans;
27+
}
28+
int query_bit(int a,int b){
29+
return read_bit(b) - read_bit(a-1);
30+
}
31+
void dfs(int x,int p){
32+
vetor[x] = ++dfsNum;
33+
vetorzao[dfsNum] = MP(nivel[x],x);
34+
tamanho[x]++;
35+
for(int v : grafo[x]){
36+
if(v == p) continue;
37+
nivel[v] = nivel[x] + 1;
38+
pai[v] = x;
39+
dfs(v,x);
40+
tamanho[x] += tamanho[v];
41+
vetorzao[++dfsNum] = MP(nivel[x],x);
42+
}
43+
}
44+
void HLD(int x,int p){
45+
if(!chainHead[chainNum]){
46+
chainHead[chainNum] = x;
47+
}
48+
chainId[x] = chainNum;
49+
chainPos[x] = ++chainPtr;
50+
update_bit(chainPtr,cor[x]);
51+
if(tamanho[x] == 1) return;
52+
int sc = -1,maximo = 0;
53+
for(int v : grafo[x]){
54+
if(v == p) continue;
55+
if(tamanho[v] > maximo){
56+
maximo = tamanho[v];
57+
sc = v;
58+
}
59+
}
60+
HLD(sc,x);
61+
for(int v : grafo[x]){
62+
if(v == p || v == sc) continue;
63+
chainNum++;
64+
HLD(v,x);
65+
}
66+
}
67+
void build_seg(int pos,int left,int right){
68+
if(left == right){
69+
arvore[pos] = vetorzao[left];
70+
return;
71+
}
72+
int mid = (left + right)/2;
73+
build_seg(2*pos,left,mid);
74+
build_seg(2*pos+1,mid+1,right);
75+
arvore[pos] = min(arvore[2*pos],arvore[2*pos+1]);
76+
}
77+
ii query_seg(int pos,int left,int right,int i,int j){
78+
if(left > right || left > j || right < i) return NULO;
79+
if(left >= i && right <= j){
80+
return arvore[pos];
81+
}
82+
int mid = (left+right)/2;
83+
return min(query_seg(2*pos,left,mid,i,j),query_seg(2*pos+1,mid+1,right,i,j));
84+
}
85+
int LCA(int u,int v){
86+
return query_seg(1,1,dfsNum,min(vetor[u],vetor[v]),max(vetor[u],vetor[v])).second;
87+
}
88+
int query_up(int u,int v){
89+
int uchain,vchain;
90+
vchain = chainId[v];
91+
int ans = 0;
92+
while(true){
93+
uchain = chainId[u];
94+
if(uchain == vchain){
95+
ans += query_bit(chainPos[v],chainPos[u]);
96+
break;
97+
}
98+
ans += query_bit(chainPos[chainHead[uchain]],chainPos[u]);
99+
u = chainHead[uchain];
100+
u = pai[u];
101+
}
102+
return ans;
103+
}
104+
int doQuery(int u,int v){
105+
int ancestral = LCA(u,v);
106+
int vertices = nivel[u] + nivel[v] + 1 - 2*nivel[ancestral];
107+
int qtd = query_up(u,ancestral) + query_up(v,ancestral) - cor[ancestral];
108+
if(qtd == vertices || qtd == 0) return 1;
109+
return 0;
110+
}
111+
int main(){
112+
scanf("%d %d",&n,&q);
113+
scanf("%s",entrada);
114+
for(int i=0;i<n;i++){
115+
cor[i+1] = (entrada[i] == '1');
116+
}
117+
for(int i=1;i<n;i++){
118+
int u,v;
119+
scanf("%d %d",&u,&v);
120+
u++;
121+
v++;
122+
grafo[u].push_back(v);
123+
grafo[v].push_back(u);
124+
}
125+
pai[1] = 1;
126+
dfs(1,-1);
127+
build_seg(1,1,dfsNum);
128+
HLD(1,-1);
129+
while(q--){
130+
int op;
131+
scanf("%d",&op);
132+
if(op == 0){
133+
int i;
134+
scanf("%d",&i);
135+
i++;
136+
if(cor[i] == 0){
137+
update_bit(chainPos[i],1);
138+
cor[i] = 1;
139+
}
140+
else{
141+
update_bit(chainPos[i],-1);
142+
cor[i] = 0;
143+
}
144+
}
145+
else{
146+
int a,b;
147+
scanf("%d %d",&a,&b);
148+
a++;
149+
b++;
150+
if(doQuery(a,b)) printf("YES\n");
151+
else printf("NO\n");
152+
}
153+
}
154+
return 0;
155+
}

SPOJ/ADABERRY.cpp

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#include <cstdio>
2+
#include <algorithm>
3+
#include <vector>
4+
#define LSOne(S) (S & (-S))
5+
using namespace std;
6+
const int MAXN = 2*1e5 + 10;
7+
const int MAX2N = 4*1e5 + 20;
8+
const int lo = 0;
9+
const int hi = 1e6;
10+
vector<int> grafo[MAXN],esq[MAX2N],dir[MAX2N],val[MAX2N];
11+
int vetor[MAX2N],numero[MAXN],ini[MAXN],fim[MAXN],dfsNum,segIt[MAX2N],n,m;
12+
void dfs(int x,int p){
13+
ini[x] = ++dfsNum;
14+
vetor[dfsNum] = numero[x];
15+
for(int i = 0;i < grafo[x].size();i++){
16+
int v = grafo[x][i];
17+
if(v == p) continue;
18+
dfs(v,x);
19+
}
20+
fim[x] = ++dfsNum;
21+
vetor[dfsNum] = numero[x];
22+
}
23+
void update_sparse(int id,int pos,int left,int right,int x){
24+
val[id][pos]++;
25+
if(left == right) return;
26+
int mid = (left+right)/2;
27+
if(x <= mid){
28+
if(esq[id][pos] == -1){
29+
segIt[id]++;
30+
esq[id].push_back(-1);
31+
dir[id].push_back(-1);
32+
val[id].push_back(0);
33+
esq[id][pos] = segIt[id];
34+
}
35+
update_sparse(id,esq[id][pos],left,mid,x);
36+
}
37+
else{
38+
if(dir[id][pos] == -1){
39+
segIt[id]++;
40+
esq[id].push_back(-1);
41+
dir[id].push_back(-1);
42+
val[id].push_back(0);
43+
dir[id][pos] = segIt[id];
44+
}
45+
update_sparse(id,dir[id][pos],mid+1,right,x);
46+
}
47+
}
48+
int query_sparse(int id,int pos,int left,int right,int i,int j){
49+
if(left > right || left > j || right < i) return 0;
50+
if(left >= i && right <= j){
51+
return val[id][pos];
52+
}
53+
int mid = (left + right)/2;
54+
int sinistra = (esq[id][pos] == -1) ? 0 : query_sparse(id,esq[id][pos],left,mid,i,j);
55+
int destra = (dir[id][pos] == -1) ? 0 : query_sparse(id,dir[id][pos],mid+1,right,i,j);
56+
return sinistra + destra;
57+
}
58+
void update_bit(int posx,int posy){
59+
while(posx <= dfsNum){
60+
update_sparse(posx,0,lo,hi,posy);
61+
posx += LSOne(posx);
62+
}
63+
}
64+
int read_bit(int posx,int posy){
65+
int ans = 0;
66+
while(posx > 0){
67+
ans += query_sparse(posx,0,lo,hi,lo,posy);
68+
posx -= LSOne(posx);
69+
}
70+
return ans;
71+
}
72+
int query_bit(int a,int b,int c){
73+
return read_bit(b,c) - read_bit(a-1,c);
74+
}
75+
int main(){
76+
scanf("%d %d",&n,&m);
77+
for(int i=0;i<n;i++) scanf("%d",&numero[i]);
78+
for(int i=1;i<n;i++){
79+
int u,v;
80+
scanf("%d %d",&u,&v);
81+
grafo[u].push_back(v);
82+
grafo[v].push_back(u);
83+
}
84+
dfs(0,0);
85+
//printf("DFS\n");
86+
for(int i=0;i<=dfsNum+1;i++){
87+
val[i].push_back(0);
88+
dir[i].push_back(-1);
89+
esq[i].push_back(-1);
90+
}
91+
//printf("Foi\n");
92+
for(int i=1;i<=dfsNum;i++){
93+
update_bit(i,vetor[i]);
94+
}
95+
while(m--){
96+
int a,b;
97+
scanf("%d %d",&a,&b);
98+
printf("%d\n",query_bit(ini[a],fim[a],b)/2);
99+
update_bit(ini[a],b);
100+
update_bit(fim[a],b);
101+
}
102+
return 0;
103+
}

0 commit comments

Comments
 (0)