Skip to content

Commit 4f6cafe

Browse files
committed
solve more questions
1 parent ab6c925 commit 4f6cafe

File tree

26 files changed

+2725
-0
lines changed

26 files changed

+2725
-0
lines changed

CodeChef/GERALD007.cpp

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
4+
template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << "{"; for (typename vector<T>::const_iterator vi = v.begin(); vi != v.end(); ++vi) { if (vi != v.begin()) os << ", "; os << *vi; } os << "}"; return os; }
5+
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { os << '(' << p.first << ", " << p.second << ')'; return os; }
6+
7+
typedef long long ll;
8+
typedef long double ld;
9+
typedef pair<int,int> pii;
10+
11+
#define optimize ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
12+
#define endl "\n"
13+
14+
#define fi first
15+
#define se second
16+
#define pb push_back
17+
18+
#define sz(x) (ll)(x.size())
19+
#define all(x) x.begin(),x.end()
20+
#define FOR(x,a,n) for(int x= (int)(a);(x) < int(n);(x)++)
21+
#define ms(x,a) memset(x,a,sizeof(x))
22+
23+
#define INF 0x3f3f3f3f
24+
#define INFLL 0x3f3f3f3f3f3f3f3f
25+
26+
#define mod 1000000007LL
27+
#define MAXN 200100
28+
29+
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
30+
int T,N,M,K;
31+
const int t = 450;
32+
stack<tuple<int,int,int,int,int,int>> pilha;
33+
34+
class UnionFind{
35+
private:
36+
vector<int> parent;
37+
vector<int> rank;
38+
public:
39+
void init(int n){
40+
parent.assign(n+1,0);
41+
rank.assign(n+1,0);
42+
43+
for(int i=0;i<n;i++){
44+
parent[i] = i;
45+
}
46+
}
47+
void reset(int n){
48+
for(int i=0;i<n;i++){
49+
parent[i] = i;
50+
rank[i] = 0;
51+
}
52+
}
53+
54+
void resetParcial(){
55+
while(!pilha.empty()){
56+
auto i = pilha.top();
57+
pilha.pop();
58+
59+
int p = get<0>(i);
60+
int q = get<1>(i);
61+
62+
parent[p] = get<2>(i);
63+
parent[q] = get<3>(i);
64+
rank[p] = get<4>(i);
65+
rank[q] = get<5>(i);
66+
}
67+
}
68+
69+
int find(int i, int k){
70+
if(parent[i] == i) return i;
71+
72+
if(k) return find(parent[i], k);
73+
else return parent[i] = find(parent[i], k);
74+
}
75+
76+
bool sameSet(int i, int j, int k){
77+
return find(i,k)==find(j,k);
78+
}
79+
80+
void unir(int i, int j, int k){
81+
i = find(i,k);
82+
j = find(j,k);
83+
84+
if(i != j){
85+
if(k) pilha.push(make_tuple(i,j,parent[i],parent[j],rank[i],rank[j]));
86+
87+
if(rank[i] < rank[j]) swap(i,j);
88+
parent[j] = i;
89+
if(rank[i] == rank[j]) rank[i]++;
90+
}
91+
}
92+
};
93+
94+
struct Query{
95+
int l, r, id;
96+
97+
Query() {}
98+
Query(int _l, int _r, int _id) : l{_l}, r{_r}, id{_id} {}
99+
100+
bool operator<(const Query &a) const{
101+
if (l/t != a.l/t){
102+
return l < a.l;
103+
}
104+
return r < a.r;
105+
}
106+
};
107+
108+
pii edge[MAXN];
109+
int v[MAXN], ans[MAXN], cc, cc2;
110+
Query Q[MAXN];
111+
UnionFind UF;
112+
113+
//Para o UF 1
114+
void add(int p) {
115+
int u = edge[p].fi, v = edge[p].se;
116+
117+
bool r = UF.sameSet(u,v,0);
118+
119+
if(!r){
120+
UF.unir(u,v,0);
121+
cc--;
122+
}
123+
}
124+
125+
//Para o UF 2
126+
void add2(int p) {
127+
int u = edge[p].fi, v = edge[p].se;
128+
129+
bool r = UF.sameSet(u,v,1);
130+
131+
if(!r) {
132+
cc2--;
133+
UF.unir(u,v,1);
134+
}
135+
}
136+
137+
void MO(){
138+
sort(Q, Q+K);
139+
140+
UF.init(N);
141+
142+
int lMO=0, rMO=-1, l, r, id, last = -1;
143+
144+
for(int i=0; i<K; i++){
145+
146+
l = Q[i].l;
147+
r = Q[i].r;
148+
id = Q[i].id;
149+
150+
//Resetando quando o l troca de bloco
151+
if(l/t != last) {
152+
if(i) UF.reset(N);
153+
last = l/t;
154+
cc = N;
155+
156+
rMO = min(M , (l/t) * t + t -1);
157+
}
158+
159+
if(l/t == r/t){
160+
cc2 = N;
161+
162+
rMO = l-1;
163+
lMO = l;
164+
165+
while(rMO < r) add2(++rMO);
166+
167+
rMO = min(M , (l/t) * t + t -1);
168+
}
169+
else{
170+
lMO = min(M , (l/t) * t + t);
171+
172+
//To adicionando do r anterior até r o r atual
173+
while(rMO < r) add(++rMO);
174+
175+
cc2 = cc;
176+
177+
//To adicionando da l até SQRT
178+
while(lMO > l) add2(--lMO);
179+
}
180+
181+
//Reseto a todo momento o UF2 por causa do l
182+
UF.resetParcial();
183+
184+
ans[id] = cc2;
185+
}
186+
187+
for(int i=0;i<K;i++) cout << ans[i] << endl;
188+
}
189+
190+
int main(){
191+
192+
optimize;
193+
194+
cin >> T;
195+
196+
while(T--){
197+
cin >> N >> M >> K;
198+
199+
FOR(i,0,M) {
200+
int a,b;
201+
cin >> a >> b;
202+
203+
a--, b--;
204+
205+
edge[i].fi = a;
206+
edge[i].se = b;
207+
}
208+
209+
FOR(i,0,K){
210+
int a,b;
211+
cin >> a >> b;
212+
213+
a--, b--;
214+
215+
Q[i].l = a, Q[i].r = b;
216+
Q[i].id = i;
217+
}
218+
219+
MO();
220+
}
221+
222+
return 0;
223+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
4+
template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << "{"; for (typename vector<T>::const_iterator vi = v.begin(); vi != v.end(); ++vi) { if (vi != v.begin()) os << ", "; os << *vi; } os << "}"; return os; }
5+
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { os << '(' << p.first << ", " << p.second << ')'; return os; }
6+
7+
typedef long long ll;
8+
typedef long double ld;
9+
typedef pair<int,int> pii;
10+
11+
#define optimize ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
12+
#define endl "\n"
13+
14+
#define fi first
15+
#define se second
16+
#define pb push_back
17+
18+
#define sz(x) (ll)(x.size())
19+
#define all(x) x.begin(),x.end()
20+
#define FOR(x,a,n) for(int x= (int)(a);(x) < int(n);(x)++)
21+
#define ms(x,a) memset(x,a,sizeof(x))
22+
23+
#define PI 3.141592653589793238462643383279502884
24+
#define INF 0x3f3f3f3f
25+
#define INFLL 0x3f3f3f3f3f3f3f3f
26+
27+
#define mod 1000000007
28+
#define MAXN 200010
29+
30+
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
31+
ll T,N,M,K;
32+
ll A,B,C,D;
33+
34+
void solve(){
35+
36+
if(B >= A){
37+
cout << B << endl;
38+
return;
39+
}else if(D >= C){
40+
cout << -1 << endl;
41+
return;
42+
}
43+
44+
ll aux = A-B;
45+
ll dif = C-D;
46+
47+
cout << B + ((aux+dif-1LL)/dif)*C << endl;
48+
49+
}
50+
51+
int main(){
52+
53+
cin >> T;
54+
55+
while(T--){
56+
cin >> A >> B >> C >> D;
57+
58+
solve();
59+
}
60+
61+
return 0;
62+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include<bits/stdc++.h>
2+
using namespace std;
3+
4+
template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << "{"; for (typename vector<T>::const_iterator vi = v.begin(); vi != v.end(); ++vi) { if (vi != v.begin()) os << ", "; os << *vi; } os << "}"; return os; }
5+
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { os << '(' << p.first << ", " << p.second << ')'; return os; }
6+
7+
typedef long long ll;
8+
typedef long double ld;
9+
typedef pair<int,int> pii;
10+
11+
#define optimize ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
12+
#define endl "\n"
13+
14+
#define fi first
15+
#define se second
16+
#define pb push_back
17+
18+
#define sz(x) (ll)(x.size())
19+
#define all(x) x.begin(),x.end()
20+
#define FOR(x,a,n) for(int x= (int)(a);(x) < int(n);(x)++)
21+
#define ms(x,a) memset(x,a,sizeof(x))
22+
23+
#define PI 3.141592653589793238462643383279502884
24+
#define INF 0x3f3f3f3f
25+
#define INFLL 0x3f3f3f3f3f3f3f3f
26+
27+
#define mod 1000000007
28+
#define MAXN 200010
29+
30+
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
31+
ll T,N,M,K;
32+
string s;
33+
34+
bool certo(int v[]){
35+
if(v[0] > 0 && v[1] > 0 && v[2] > 0) return true;
36+
return false;
37+
}
38+
39+
void solve(){
40+
41+
int ans = INF;
42+
int v[3] = {0};
43+
int c = 0;
44+
45+
FOR(i,0,sz(s)){
46+
v[ s[i]-'1' ]++;
47+
48+
while(certo(v)){
49+
ans = min(ans, i-c);
50+
51+
v[ s[c]-'1' ]--;
52+
c++;
53+
}
54+
}
55+
56+
if(ans == INF) cout << 0 << endl;
57+
else cout << ans+1 << endl;
58+
}
59+
60+
int main(){
61+
62+
cin >> T;
63+
64+
while(T--){
65+
cin >> s;
66+
67+
solve();
68+
}
69+
70+
return 0;
71+
}

0 commit comments

Comments
 (0)