Skip to main content

Posts

Showing posts from May, 2017

Chef and Sub Array

                      Chef and Sub Array Problem Link #include <iostream> #include <stdio.h> #define sf(i) scanf("%d", &i) #define pf(i) printf("%d\n", i) using namespace std; int n, k, p; int a[100005], b[300005]; int sum[300005], tree[700005]; string s; void buildTree(int index, int s, int e) {     if(s == e)     {         tree[index] = sum[s];     }     else     {         int mid = (s + e) / 2;         buildTree(2 * index + 1, s, mid);         buildTree(2 * index + 2, mid + 1, e);         tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);     } } int query(int index, int s, int e, int qs, int qe) {     if(qs > e || qe < s)         return 0;     if(qs <= s && qe >= e)         return tree[index];     int mid = (s + e) / 2;     int left = query(2 * index + 1, s, mid, qs, qe);     int right = query(2 * index + 2, mid + 1, e, qs , qe);

Book of Evil

                                        Book of Evil Problem Link #include <iostream> #include <vector> #include <cstring> #include <stdio.h> #define sf(i) scanf("%d", &i) #define pf(i) printf("%d\n", i) #define pb push_back using namespace std; const int N = 1e5 + 1; int h[N]; bool mark[N],ans[N]; vector<int> g[N]; int n, m, d, D, R; void dfs(int s, int p) {     h[s] = h[p] + 1;     ans[s] &= (h[s] <= d);     if(mark[s] && h[s] > D)     {         D = h[s], R = s;     }     for(int i = 0; i < g[s].size(); i++)     {         int v = g[s][i];         if(v == p)             continue;         dfs(v,s);     } } int main() {     sf(n), sf(m), sf(d);     int a, b;     D = 0;     h[0] = -1;     for(int i = 1; i <= m; i++)     {         sf(R);         mark[R] = true;     }     for(int i = 1; i <= n - 1; i++)     {

Chloe and pleasant prizes

                            Chloe and pleasant prizes Problem Link #include <iostream> #include <vector> #define pb push_back using namespace std; typedef long long int li; const li N = 2 * 1e5 + 5; const li inf = 1LL<<60; vector<li> g[N];  li p[N]; li sum[N]; li dp[N]; li n, u, v; li ans = -inf; void dfs(int s, int t) {          dp[s] = -inf;     sum[s] = p[s];     for(int i = 0; i < g[s].size(); i++)     {         int v = g[s][i];         if(v == t)            continue;         dfs(v, s);         sum[s] += sum[v];         if(dp[s] > -inf)ans=max(ans,dp[s]+dp[v]);         dp[s]=max(dp[s],dp[v]);     }     dp[s] = max(dp[s], sum[s]); } int main() {     cin >> n;     for(li i = 1; i <= n; i++)     {         cin >> p[i];             }     for(li i = 0; i < n - 1; i++)     {         cin >> u >> v;         g[u].pb(v);         g[v

Civilization

                                           Civilization Problem Link #include <iostream> #include <vector> #include <stdio.h> #define sf(i) scanf("%d", &i) #define pf(i) printf("%d\n", i) #define pb push_back using namespace std; const int N = 3e5 + 1; vector<int> g[N]; int parent[N]; int diameter[N]; bool isUsed[N]; int n, m, q, maxi, maxiv; int rad(int a) {     return (diameter[a] + 1) / 2; } int find(int a) {     if(parent[a] == a)     {         return a;     }     return parent[a] = find(parent[a]); } void unite1(int a, int b) {     a = find(a);     b = find(b);     if(a > b)         swap(a, b);     parent[b] = a; } void unite(int a, int b) {     a = find(a);     b = find(b);     if(a > b)     {         swap(a, b);     }     parent[b] = a;     diameter[a] = max(rad(a) + rad(b) + 1, max(diameter[a], diameter[b])); } vo