diff --git a/answering.md b/answering.md new file mode 100644 index 0000000..68f2995 --- /dev/null +++ b/answering.md @@ -0,0 +1,7 @@ +answer code goes as follows + +EASY PROBLEM 7 + +ANSWER CODE : E07.cpp OR E07.py etc + +similarly M for medium and H for hard \ No newline at end of file diff --git a/answers/E01.cpp b/answers/E01.cpp new file mode 100644 index 0000000..5650c8a --- /dev/null +++ b/answers/E01.cpp @@ -0,0 +1,17 @@ + +#include +//dont forget the case of a=0; +using namespace std; +long long int sol(long long int a){ + if (a==0)return 0; + if(a%2==1)return 1; + else return 2*sol(a/2); +} +int main(){ + long long int a; + while(!feof(stdin)){ + cin>>a; + cout< +#include +using namespace std; +int i; +#define geti(x) int x;cin>>x; +#define getl(x) long long int x;in>>x; +#define FOR(i,a,b) for(i=a;i>h>>m; + a[h][m]++; + maximum=max(maximum,a[h][m]); + } + cout< +using namespace std; +typedef long long int ll; +class tree{ + public: + ll sum; + ll maxSum; + ll maxPrefixSum; + ll maxSuffixSum; +}segTree[200005]; +int a[50004],n; +tree zero; +tree join(tree left,tree right){ + tree sol; + sol.sum=left.sum+right.sum; + sol.maxSum=max(left.maxSum,right.maxSum); + if(left.maxSum>=0&&right.maxSum>=0) + sol.maxSum=max(sol.maxSum,left.maxSuffixSum+right.maxPrefixSum); + sol.maxPrefixSum=max(left.maxPrefixSum,left.sum+right.maxPrefixSum); + sol.maxSuffixSum=max(right.maxSuffixSum,right.sum+left.maxSuffixSum); + return sol; +} +void buildSegTree(int i,int l,int r){ + if(l>r)return ; + if(l==r){ + segTree[i].sum=a[l]; + segTree[i].maxSum=a[l]; + segTree[i].maxPrefixSum=a[l]; + segTree[i].maxSuffixSum=a[l]; + } + else{ + int mid=(l+r)/2; + buildSegTree(2*i,l,mid); + buildSegTree(2*i+1,mid+1,r); + segTree[i]=join(segTree[2*i],segTree[2*i+1]); + } +} +tree query_old(int treeIndex,int treeLeft,int treeRight,int l,int r){ + if(treeLeft>treeRight)return zero; + if(treeLeft==treeRight)return segTree[treeIndex]; + int treeMid=(treeLeft+treeRight)/2; + if(treeMid=r)return query_old(2*treeIndex,treeLeft,treeMid,l,r); + return join(query_old(2*treeIndex,treeLeft,treeMid,l,r),query_old(2*treeIndex+1,treeMid+1,treeRight,l,r)); +} + +tree query_new(int node,int start,int end,int l,int r) +{ + if(rend) + { + tree zero; + zero.sum=-20000; +zero.maxSum=-20000; +zero.maxPrefixSum=-20000; +zero.maxSuffixSum=-20000; + return zero; + } + if(start>=l && end<=r) + { + return segTree[node]; + } + int mid=(start+end)/2; + tree p1=query_new(2*node,start,mid,l,r); + tree p2=query_new(2*node+1,mid+1,end,l,r); + tree temp=join(p1,p2); + return temp; +} +int main(){ + + ios_base::sync_with_stdio(false); + cin.tie(NULL); + zero.maxPrefixSum=zero.maxSuffixSum=zero.sum=-20000; + zero.maxSum=-20000; + cin>>n; + for(int i=0;i>a[i]; + } + buildSegTree(1,0,n-1); + int q; + cin>>q; + int l,r; + while(q--){ + cin>>l>>r; + cout< +#include +using namespace std; +#define geti(x) int x;cin>>x; +#define getl(x) long long int x;in>>x; +#define FOR(i,a,b) for(i=a;i>N; + double sol2=(sqrt(1+8*N)-1)/2; + long long int sol=sol2; + if(sol+0.0!=sol2)sol+=1; + cout< + +using namespace std; + +vector split_string(string); + +// Complete the twoArrays function below. +string twoArrays(int k, vector A, vector B) { + sort(A.begin(),A.end()); + sort(B.begin(),B.end(),greater()); + int l=A.size(); + while(l--){ + if(A[l]+B[l]> q; + cin.ignore(numeric_limits::max(), '\n'); + + for (int q_itr = 0; q_itr < q; q_itr++) { + string nk_temp; + getline(cin, nk_temp); + + vector nk = split_string(nk_temp); + + int n = stoi(nk[0]); + + int k = stoi(nk[1]); + + string A_temp_temp; + getline(cin, A_temp_temp); + + vector A_temp = split_string(A_temp_temp); + + vector A(n); + + for (int i = 0; i < n; i++) { + int A_item = stoi(A_temp[i]); + + A[i] = A_item; + } + + string B_temp_temp; + getline(cin, B_temp_temp); + + vector B_temp = split_string(B_temp_temp); + + vector B(n); + + for (int i = 0; i < n; i++) { + int B_item = stoi(B_temp[i]); + + B[i] = B_item; + } + + string result = twoArrays(k, A, B); + + fout << result << "\n"; + } + + fout.close(); + + return 0; +} + +vector split_string(string input_string) { + string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) { + return x == y and x == ' '; + }); + + input_string.erase(new_end, input_string.end()); + + while (input_string[input_string.length() - 1] == ' ') { + input_string.pop_back(); + } + + vector splits; + char delimiter = ' '; + + size_t i = 0; + size_t pos = input_string.find(delimiter); + + while (pos != string::npos) { + splits.push_back(input_string.substr(i, pos - i)); + + i = pos + 1; + pos = input_string.find(delimiter, i); + } + + splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1)); + + return splits; +} diff --git a/answers/E08_FREQUENT.cpp b/answers/E08_FREQUENT.cpp new file mode 100644 index 0000000..3c371fe --- /dev/null +++ b/answers/E08_FREQUENT.cpp @@ -0,0 +1,93 @@ +#include +using namespace std; +typedef int ll; +class tree{ + public: + ll maxFrequency; + ll leftFrequency; + ll rightFrequency; + ll rightElement; + ll leftElement; +}; +tree *segTree; +int a[100004],n; +tree zero; +tree join(tree left,tree right){ + tree sol; + sol.maxFrequency=max(left.maxFrequency,right.maxFrequency); + if(left.rightElement==right.leftElement) + sol.maxFrequency=max(sol.maxFrequency,left.rightFrequency+right.leftFrequency); + sol.leftFrequency=left.leftElement==right.leftElement?left.leftFrequency+right.leftFrequency:left.leftFrequency; + sol.rightFrequency=left.rightElement==right.rightElement?left.rightFrequency+right.rightFrequency:right.rightFrequency; + sol.leftElement=left.leftElement; + sol.rightElement=right.rightElement; + return sol; +} +void buildSegTree(int i,int l,int r){ + if(l>r)return ; + if(l==r){ + segTree[i].rightElement=a[l]; + segTree[i].leftElement=a[l]; + segTree[i].maxFrequency=1; + segTree[i].leftFrequency=segTree[i].rightFrequency=1; + } + else{ + int mid=(l+r)/2; + buildSegTree(2*i,l,mid); + buildSegTree(2*i+1,mid+1,r); + segTree[i]=join(segTree[2*i],segTree[2*i+1]); + } +} +tree query_old(int treeIndex,int treeLeft,int treeRight,int l,int r){ + if(treeLeft>treeRight)return zero; + if(treeLeft==treeRight)return segTree[treeIndex]; + int treeMid=(treeLeft+treeRight)/2; + if(treeMid=r)return query_old(2*treeIndex,treeLeft,treeMid,l,r); + return join(query_old(2*treeIndex,treeLeft,treeMid,l,r),query_old(2*treeIndex+1,treeMid+1,treeRight,l,r)); +} + +tree query_new(int node,int start,int end,int l,int r) +{ + if(rend) + { + tree zero; + zero.rightElement=0; + zero.leftElement=0; + zero.maxFrequency=0; + zero.leftFrequency=zero.rightFrequency=0; + return zero; + } + if(start>=l && end<=r) + { + return segTree[node]; + } + int mid=(start+end)/2; + tree p1=query_new(2*node,start,mid,l,r); + tree p2=query_new(2*node+1,mid+1,end,l,r); + tree temp=join(p1,p2); + return temp; +} +int main(){ + + ios_base::sync_with_stdio(false); + cin.tie(NULL); + int q; + cin>>n; + while(n){ + tree myTree[4*n]; + segTree=myTree; + cin>>q; + for(int i=0;i>a[i]; + } + buildSegTree(1,0,n-1); + int l,r; + while(q--){ + cin>>l>>r; + cout<>n; + } + return 0; +} \ No newline at end of file diff --git a/answers/E09_BUGLIFE.cpp b/answers/E09_BUGLIFE.cpp new file mode 100644 index 0000000..29b2ae9 --- /dev/null +++ b/answers/E09_BUGLIFE.cpp @@ -0,0 +1,51 @@ +#include +using namespace std; +#define geti(x) int x;cin>>x; +#define getl(x) long long int x;in>>x; +#define FOR(i,a,b) for(i=a;i *v,int *color,int i){ + for(int k:v[i]){ + if(color[k]==0){ + color[k]=-color[i]; + if(dfs(v,color,k))return true; + } + if(color[k]==color[i]){ + return true; + } + } + return false; +} +bool run(){ + int i,t1,t2,n,q; + cin>>n>>q; + vector v[n+1]; + while(q--){ + cin>>t1>>t2; + v[t1].pb(t2); + v[t2].pb(t1); + } + int color[n+1]={0}; + for(i=1;i<=n;i++){ + if(color[i]==0&&v[i].size()!=0){ + color[i]=1; + if(dfs(v,color,i))return true; + } + } + return false; +} +int main(){ + ios_base::sync_with_stdio(false); + cin.tie(NULL); + geti(t) + int i; + FOR(i,1,t+1){ + cout<<"Scenario #"< +#include +using namespace std; +class solution{ + private: + map m; + public: + long long int byteland_doller_conversion(int n){ + if(n==0)return 0; + if (m[n]!=0)return m[n]; + long long int answer=byteland_doller_conversion(n/2)+byteland_doller_conversion(n/3)+byteland_doller_conversion(n/4); + if(answer>n){ + cout< +using namespace std; +typedef long long ll; +class node{ +public: + long long int sum; + long long int extra; + node *left=NULL; + node *right=NULL; + node(ll sum=0,ll extra=0){ + this->sum=sum; + this->extra=extra; + } + void destroy(){ + if(left!=NULL){ + left->destroy(); + free(left); + } + if(right!=NULL){ + right->destroy(); + free(right); + } + } + ~node(){ + destroy(); + } + void createChildren(){ + if(left==NULL)left=(node *)malloc(sizeof(node)); + if(right==NULL)right=(node *)malloc(sizeof(node)); + } + void propagateExtra(ll start,ll end){ + if(start==end)return; + ll mid=(start+end)/2; + left->extra+=extra; + left->sum+=extra*(mid-start+1); + right->extra+=extra; + right->sum+=extra*(end-mid-1+1); + extra=0; + } + void update(ll start,ll end,ll l,ll r,ll value){ + if(l>end||rupdate(start,mid,l,r,value); + right->update(mid+1,end,l,r,value); + sum=right->sum+left->sum; + } + long long int query(ll start,ll end,ll l,ll r){ + if(l>end||rquery(start,mid,l,r)+right->query(mid+1,end,l,r); + } +}; +void run(node &head){ + int n,c; + cin>>n>>c; + ll type,l,r,value; + while(c--){ + cin>>type>>l>>r; + if(!type){ + cin>>value; + head.update(1,n,l,r,value); + } + else{ + cout<>t; + node head[t]; + while(t--){ + run(head[t]); + } +} \ No newline at end of file diff --git a/answers/M52_GSS3.cpp b/answers/M52_GSS3.cpp new file mode 100644 index 0000000..1a18f04 --- /dev/null +++ b/answers/M52_GSS3.cpp @@ -0,0 +1,97 @@ +#include +using namespace std; +typedef long long int ll; +class tree{ + public: + ll sum; + ll maxSum; + ll maxPrefixSum; + ll maxSuffixSum; +}segTree[200005]; +int a[50004],n; +tree zero; +tree join(tree left,tree right){ + tree sol; + sol.sum=left.sum+right.sum; + sol.maxSum=max(left.maxSum,right.maxSum); + if(left.maxSum>=0&&right.maxSum>=0) + sol.maxSum=max(sol.maxSum,left.maxSuffixSum+right.maxPrefixSum); + sol.maxPrefixSum=max(left.maxPrefixSum,left.sum+right.maxPrefixSum); + sol.maxSuffixSum=max(right.maxSuffixSum,right.sum+left.maxSuffixSum); + return sol; +} +void buildSegTree(int i,int l,int r){ + if(l>r)return ; + if(l==r){ + segTree[i].sum=a[l]; + segTree[i].maxSum=a[l]; + segTree[i].maxPrefixSum=a[l]; + segTree[i].maxSuffixSum=a[l]; + } + else{ + int mid=(l+r)/2; + buildSegTree(2*i,l,mid); + buildSegTree(2*i+1,mid+1,r); + segTree[i]=join(segTree[2*i],segTree[2*i+1]); + } +} + +tree query(int node,int start,int end,int l,int r) +{ + if(rend) + { + tree zero; + zero.sum=-20000; +zero.maxSum=-20000; +zero.maxPrefixSum=-20000; +zero.maxSuffixSum=-20000; + return zero; + } + if(start>=l && end<=r) + { + return segTree[node]; + } + int mid=(start+end)/2; + tree p1=query(2*node,start,mid,l,r); + tree p2=query(2*node+1,mid+1,end,l,r); + tree temp=join(p1,p2); + return temp; +} +void update(int node,int start,int end,int leaf,int value){ + if(start==end){ + segTree[node].sum=segTree[node].maxSum=segTree[node].maxPrefixSum=segTree[node].maxSuffixSum=value; + return; + } + int mid=(start+end)/2; + if(leaf<=mid){ + update(node*2,start,mid,leaf,value); + } + else{ + update(2*node+1,mid+1,end,leaf,value); + } + segTree[node]=join(segTree[2*node],segTree[2*node+1]); +} +int main(){ + + ios_base::sync_with_stdio(false); + cin.tie(NULL); + zero.maxPrefixSum=zero.maxSuffixSum=zero.sum=-20000; + zero.maxSum=-20000; + cin>>n; + for(int i=0;i>a[i]; + } + buildSegTree(1,0,n-1); + int q; + cin>>q; + int l,r; + int type; + while(q--){ + cin>>type>>l>>r; + if(type) + cout<