Saturday, December 1, 2018

"বিবাহ ইসলামের অর্ধেক" হাদিসটি দ্বারা আসলে কি বুঝানো হয়েছে?

আরিফ আজাদ ভাইয়ের ফেসবুক প্রোফাইল থেকে নেয়া। 

অনেকেই মনে করে বিয়ে করে ‘দ্বীনের অর্ধেক’ পূরণ করার অর্থ হলো- একে-অন্যকে খাইয়ে দেওয়া, স্ত্রী গ্লাসের যে জায়গায় মুখ লাগিয়ে পানি পান করেছে, স্বামীরও সে জায়গায় মুখ লাগিয়ে পানি পান করা, স্বামী মাংসের যে টুকরোতে কামড় দিয়েছে, সে টুকরোতে স্ত্রীরও কামড় দেওয়া। এক বালিশে ঘুমোনো, বেলকনিতে দাঁড়িয়ে বৃষ্টিবিলাস উপভোগ করা ইত্যাদি। হ্যাঁ, এই কাজগুলো অবশ্যই খারাপ কিছু নয়; উপরন্তু এগুলো ভালো কাজ। কিন্তু, এগুলোকে ‘দ্বীনের অর্ধেক’ মনে করাটা বোকামি। এগুলো হলো এক্সট্রা কারিকুলামের মতো।

আপনার স্বামী আপনার জন্য অর্ধেক দ্বীন তখনই, যখন তিনি বলেন, ‘ওগো, আজ তো জুমু’আ। চলো, দু’জনে মিলে সূরা কাহাফ তিলাওয়াত করি’।
আপনার স্ত্রী আপনার জন্য অর্ধেক দ্বীন তখনই, যখন তিনি আপনাকে মধ্যরাতে তাহাজ্জুদ আদায়ের জন্য জাগিয়ে দেন। বলেন, ‘ওগো! শেষ রাতে আমাদের রব নিকটতম আসমানে চলে আসেন। ক্ষমা লাভ করার এতো সুন্দর মূহুর্ত কিভাবে আমরা ঘুমিয়ে কাটাই? উঠো... চলো আমরা একসাথে সালাত পড়ি’।
রাসূল সাল্লাললাহু আলাইহি ওয়াসাল্লাম সেই নারীর প্রশংসা করেছেন, যে নারী রাতে ঘুম থেকে উঠে তাহাজ্জুদ পড়ে এবং তার স্বামীকে তাহাজ্জুদ আদায়ের জন্য জাগিয়ে দেয়। স্বামী যদি জাগতে না চায়, তাহলে তার মুখে পানি ছিটিয়ে দিয়ে হলেও তাকে জাগিয়ে দেয়। তিনি (সাল্লাললাহু আলাইহি ওয়াসাল্লাম) সেই পুরুষেরও প্রশংসা করেছেন যে রাতে উঠে তাহাজ্জুদ পড়ে এবং তার স্ত্রীকেও তাহাজ্জুদ পড়ার জন্য জাগিয়ে দেয়। যদি তার স্ত্রী জাগতে না চায়, তাহলে স্ত্রীর মুখে পানি ছিটিয়ে দিয়ে হলেও তাকে জাগিয়ে দেয়।

বিশেষ বিশেষ সময়ে যখন আপনার উপর ফরজ ইবাদাত শীথিল হয়ে যায়, তখন যদি আপনার স্বামী আপনাকে বলে, ‘তোমাকে তো সালাত পড়তে হচ্ছেনা আজ। কিন্তু, সন্ধ্যার যিকিরটুকু কি করা যাবে? চলো, একসাথে করি’।
রাতে ঘুমানোর আগে একে-অন্যকে সূরা মুলক পড়তে স্মরণ করিয়ে দেওয়া, সকালবেলা সূর্যোদয়ের পরে চাশতের সালাত পড়ার তাগিদ দেওয়াই হলো একজন অর্ধেক দ্বীনের পরিপূর্ণ প্রতিফলন।
স্ত্রী যদি বলে, ‘আগামীকাল সোমবার। বলতো সেহরিতে কি খাবে? কি খেয়ে সিয়াম রাখতে চাও? তুমি যা পছন্দ করবে আমি তাই রান্না করবো’। এরকম স্ত্রীই হলো আপনার অর্ধেক দ্বীন।
যে স্বামী আপনাকে আইয়্যামে বীজের সিয়াম (প্রতি চন্দ্রমাসের ১৩,১৪,১৫ তারিখ) রাখতে উদ্বুদ্ধ করে, তিনিই আপনার অর্ধেক দ্বীন।

‘অর্ধেক দ্বীন’ ব্যাপারটা মোটাদাগে ইবাদাতের সাথে সম্পর্কিত। রাতে আসার সময় স্ত্রীর জন্য ফুল নিয়ে আসা, স্বামীর পছন্দের পারফিউম গায়ে মেখে এবং ভেজা চুল নিয়ে তার জন্য অপেক্ষা করা, কিংবা তার পছন্দের রঙের শাড়ী পরে থাকাটা অপশনাল ব্যাপার, ম্যান্ডাটরি নয়। এগুলো অবশ্যই ভালো, কিন্তু এগুলোর জন্য যদি ইবাদাতে পিছিয়ে যাওয়া হয়, তাহলে এগুলোর আর মূল্য কি?
কারো জন্যে তার ‘অর্ধেক দ্বীন’ হওয়াটা সহজ নয়। আবারও কঠিনও নয়। এটার জন্যে চেষ্টা থাকা চাই। আপনি যদি মনে করেন যে রাতারাতি আপনি তাহাজ্জুদগুজার বান্দা বনে যাবেন, সেটা অসম্ভব। এই প্রক্রিয়াটা ধীরতার সাথে গড়ে উঠে। ইবাদাতের ব্যাপারে সে ছাত্রের মতো হওয়া উচিত যে সারাবছর নিয়ম করে পড়াশুনা করে। সেই ছাত্রের মতো নয়, যে সারাবছর বইয়ের পাতাও উল্টায় না এই ভেবে যে, পরীক্ষার আগের রাতেই সে সিলেবাস শেষ করে ফেলবে।
কারো অর্ধেক দ্বীন হয়ে উঠার জন্য দো’আ করতে হয়। চোখের পানি ফেলতে হয়। নিশুতি রাতগুলো জায়নামাজে দাঁড়িয়ে জাগতে হয়।

Thursday, February 8, 2018

UVa 10334 - Ray Through Glasses in C++


Category: Basic combinatorics.

N: B Try to find out the logic in pen and paper.

#Tag: You need Java BigInteger Class or C++ user built-in BigInteger class or structure(struct).

Problem LinkClick Here

Implementation in c++:

Solution Link: Click Here 

Sunday, December 10, 2017

Lightoj 1294 - Positive Negative Sign

Problem Link: Click Here

Source Code in C++:

#include<bits/stdc++.h>
#define lli long long int
#define scf(n) scanf("%lld",&n)
#define nl prllif("\n")
#define spc prllif(" ")
#define file freopen("in.txt","rt",stdin)
#define pii pair<lli,lli>
#define love printf("Nahar")
using namespace std;

int main()
{
    //file;
    lli test,n,m,d;
    lli ans;
    scanf("%lld",&test);
    for(lli i=1;i<=test;i++)
    {
         scanf("%lld%lld",&n,&m);

         ans = m*m;
         d = n/(2*m);
         ans = d*ans;
         for(lli j=d*2*m+1,k=1;j<=n;j++,k++)
         {
             love;
             if(k<=m)
             {
                 ans-=j;
             }
             else
             {
                 ans+=j;
             }
         }
         printf("Case %lld: %lld\n",i,ans);
    }
    return 0;
}

Thursday, November 2, 2017

UVa 11503 Virtual Friends

Problem Link: Click Here

Required Algorithm: Disjoint Set Union (Bangla)

Source Code in C++:

#include<bits/stdc++.h>
#define lli long long int
#define scf(n) scanf("%lld",&n)
#define prf(n) printf("%lld",n)
#define nl printf("\n")
#define spc printf(" ")
#define file freopen("in.txt","rt",stdin)
#define pii pair<int,int>
using namespace std;
map<string , lli > cnt_par;
map<string , string > par;
map<string,lli>check;


string find_func(string n)
{
    if(par[n]==n)
        return n;

    par[n] = find_func(par[n]);

    return par[n];

}

string union_func(string a,string b)/** a er parent b **/
{
    string u = find_func(a);
    string v = find_func(b);
    if(u!=v)
    {
        par[u] = v;
        cnt_par[v]+=cnt_par[u];
    }
    return v;
}


int main()
{

    //file;
    string str,str1;
    lli n,m,test,a,b;
    scf(test);
    while(test--)
    {
        scf(n);

        map<string,lli>check;
        lli mx = -1;
        for(int i=1; i<=n; i++)
        {
            cin>>str>>str1;

            if(check[str]==0)
            {
                check[str] = 1;
                par[str] = str;
                cnt_par[str] = 1;
            }
            if(check[str1]==0)
            {
                check[str1] = 1;
                par[str1]  = str1;
                cnt_par[str1] = 1;

            }
            string ans = union_func(str,str1);
            prf(cnt_par[ans]);
            nl;

        }
    }
    return 0;

}

Thursday, August 17, 2017

অয়লার প্রাইম থেওরেম প্রবলেম

গোলবাচের ধারনা বা কঞ্জেকচার এবং অয়লারের থেওরেম।

গোলবাচের ধারনা বা গোলবাচের কঞ্জেকচার অনুযায়ী "২ এর চেয়ে বড় যে কোন সংখ্যাকে ৩ টা প্রাইম নাম্বারের যোগফল আকারে প্রকাশ করা যায় " তিনি ১ কে প্রাইম বা মৌলিক সংখ্যা হিসেবে চিন্তা করেছেন ।বিশ্বাস না হলে কাগজ কলম নিয়া একটু গুতা-গুতি করলেই বুঝতে পারবেন। আর আপনি চাইলে এই কঞ্জেকচারটাকে প্রমান করার চেষ্টাও করতে পারেন। যদি সফল হন তবে আপনাকে আর পায় কে? বিখ্যাত গনিতবিদ অয়লার এই কঞ্জেকচারকে আরও একটু বৃদ্ধি করে নতুন থেওরেম প্রমান করেন যা হল "৪ এর চেয়ে বড় বা সমান যে কোন জোড় সংখ্যাকে দুটি প্রাইম নাম্বারের যোগফল আকারে প্রকাশ করা যায়"। পরবর্তিতে তিনি নতুন থেওরেম প্রমান করেন যা হল "৭ এর চেয়ে বড় যে কোন সংখ্যা (জোড় বা বিজোড়) কে ৪ টা প্রাইম বা মৌলিক সংখ্যার যোগফল আকারে প্রকাশ করা যায়"।

উপরোক্ত তত্ত্বের ভিত্তিতে UVa 10168 প্রবলেমটা সেট করা হয়েছে। একবার ঠুস মেরে দেখতে পারেন। প্রবলেমটিতে ইনপুট সংখ্যাটি সর্বচ্চ্য 10^7 হতে পারে। সুতরাং সাধারণ ভাবে প্রাইম বের করার এখানে টেকনিক কাজ করবে না। এ জন্য আপনাকে সিভ মেথড শিখতে হবে। বাকি কাজটা একটু মাথা ঘামালেই পারবেন বলে আশা করি।


N:B: Please don't copy the source code because it damages your brain.Try yourself first.Try to figure out the bug and critical test case.

Source Code in C++.

#include<bits/stdc++.h>
#define file freopen("in.txt","rt",stdin)
using namespace std;
int mark[10000009],prime[1000000],nprime =1;
int limit,n;
void PrimeNumber() /** Seive Method **/
{
    mark[1]=1;
    mark[0] =1;
    prime[nprime++]=2;

    for(int i=4; i<=n; i+=2)
        mark[i]=1;

    for(int i=3; i<=n; i+=2)
    {
        if(!mark[i])
        {
            prime[nprime++]=i;

            if(i<=limit)
            {
                for(int j=i*i; j<=n; j=j+i*2)
                {
                    mark[j]=1;
                }
            }
        }
    }

}
int main()
{
    //file;
    n = 10000009;
    limit = sqrt(n+1);
    PrimeNumber();
    int n,d1,d2,x,y,z,w;
    while(scanf("%d",&n)==1)
    {
        if(n<=7)
        {
            printf("Impossible.\n");
            continue;
        }
        if(n%2==1)
        {
            d2 = n - 5;
            x = 2;
            y = 3;
            for(int i=1; prime[i]<=d2; i++)
            {
                int diff = d2 - prime[i];
                if(mark[diff]==0)
                {
                    z = prime[i];
                    w = diff;
                    break;
                }
            }
            printf("%d %d %d %d\n",x,y,z,w);
        }
        else
        {

            d1 = n/2;
            if(d1%2==1)
            {
                int k = n-4;
                x = 2;
                y =2;
                for(int i=1; prime[i]<=k; i++)
                {
                    int diff = k - prime[i];
                    if(mark[diff]==0)
                    {
                        z = prime[i];
                        w = diff;
                        break;
                    }
                }
                printf("%d %d %d %d\n",x,y,z,w);
            }
            else
            {
                for(int i=1; prime[i]<=d1; i++)
                {
                    int diff = d1 - prime[i];
                    if(mark[diff]==0)
                    {
                        printf("%d %d %d %d\n",prime[i],diff,prime[i],diff);
                        break;
                    }
                }
            }
        }
    }
    return 0;
}


Saturday, April 8, 2017

Lightoj-1109 - False Ordering C++ Solution

Problem Link:1109 - False Ordering 

 NB: To solve this problem,You must have to know how to code NOD(number of divisor) in efficient way.

Implementation in C++:

#include<bits/stdc++.h>
using namespace std;

vector<int>vt;
int divs[1009];
int NOD(int n)
{
    int cnt = 1;
    for(int i=2; i<=n; i++)
    {
        int c=0;
        while(n%i==0)
        {
            n/=i;
            c++;
        }
        if(c)
        {
            cnt=cnt*(c+1);
        }
    }
    return cnt;
}
int main()
{
    int test,num;
    scanf("%d",&test);
    for(int i=1; i<=1001; i++)
    {
        divs[i] = NOD(i);
    }
    for(int i=1; i<=35; i++)
    {
        for(int j=1000; j>=1; j--)
        {
            if(divs[j]==i)
                vt.push_back(j);
        }
    }
    for(int i=1; i<=test; i++)
    {
        scanf("%d",&num);
        printf("Case %d: ",i);
        cout<<vt[num-1]<<endl;
    }

    return 0;
}
 

Saturday, January 14, 2017

UVa-579-Clock Hands

Problem link: Clock Hands

For detail information click hare 

Source code in C++:

#include<bits/stdc++.h>
#define file freopen("in.txt","rt",stdin)
int main()
{
   // file;
    int c=0,a;
    float h,m,H,d1,d2,ans;
    char str[10];
    while(gets(str))
    {
        a = strcmp(str,"0:00");
        if(a==0)
            break;
        if(strlen(str)==4)
        {
            h = str[0]-48;
            m = (str[2]-48)*10+(str[3]-48);

            H = h*60+m;
            d1 = H*0.5;
            d2 = m*6;
            ans= fabs(d1-d2);
            if(ans>180)
                ans-=360;
            printf("%.3f\n",fabs(ans));

        }
        else
        {
            h = (str[0]-48)*10+(str[1]-48);
            m = (str[3]-48)*10+(str[4]-48);

             H = h*60+m;
            d1 = H*0.5;
            d2 = m*6;
            ans= fabs(d1-d2);
            if(ans>180)
                ans-=360;
            printf("%.3f\n",fabs(ans));
        }
    }
    return 0;
}
 

Sunday, January 8, 2017

Lightoj-1354 IP-Checking

Problem Link: IP Checking

NB: To understand the following code first learn about strtok() library function in C.Click Here

Source code in C:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int test,i,sum=0,j=0,sum1,k,l;
    char str[50],str1[50];
    int a[5],b[5];
    char *temp, *temp1;
    int x,y;
    scanf("%d",&test);
    getchar();

    for(i=1; i<=test; i++)
    {
        gets(str);
        gets(str1);
        sum=0;
        k =0 ;
        temp = strtok(str, ".");
        while(temp!=NULL)
        {
            sum=0;
            for(j=0; j<strlen(temp); j++)
            {
                sum = sum*10 + (temp[j]-48);
            }
            a[k] = sum;
           // printf("%d ",a[k]);
            k++;
            temp = strtok(NULL, ".");
        }
        /*******************/
        k = 0;
        temp1 = strtok(str1, ".");
        while(temp1!=NULL)
        {
            sum=0;
            for(j=strlen(temp1)-1,l=0;j>=0;j--,l++)
            {
               sum = sum+(temp1[j]-48)* pow(2.00,(double)l);
            }

            b[k] = sum;
           // printf("%d ",a[k]);
            k++;
            temp1 = strtok(NULL, ".");
        }
        if(a[0]==b[0] && a[1]==b[1] && a[2]==b[2] && a[3]==b[3])
            printf("Case %d: Yes\n",i);
        else
           printf("Case %d: No\n",i);

    }
    return 0;
}

Friday, January 6, 2017

UVa-10189-Minesweeper Solution

Problem link: Minesweeper

Source Code in C++:

#include<bits/stdc++.h>
#define file freopen("in.txt","rt",stdin)
using namespace std;
char arr[110][110];
int ans[110][110];
int main()
{
    int n,m,c=0;
    char ch;
    // file;
    while(scanf("%d%d",&n,&m)==2)
    {
        if(n==0 && m==0)
            break;
        if(c!=0)
            cout<<endl;
        c++;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                cin>>ch;
                arr[i][j]=ch;
            }
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                int cnt=0;
                if(arr[i][j]=='.')
                {
                    if(arr[i][j+1]=='*' && i>=1 && i<=n && j+1>=1 && j+1<=m)
                        cnt++;
                    if(arr[i-1][j+1]=='*'&& i-1>=1 && i-1<=n && j+1>=1 && j+1<=m)
                        cnt++;
                    if(arr[i-1][j]=='*'&& i-1>=1 && i-1<=n && j>=1 && j<=m)
                        cnt++;
                    if(arr[i-1][j-1]=='*'&& i-1>=1 && i-1<=n && j-1>=1 && j-1<=m)
                        cnt++;
                    if(arr[i][j-1]=='*'&& i>=1 && i<=n && j-1>=1 && j-1<=m)
                        cnt++;
                    if(arr[i+1][j-1]=='*'&& i+1>=1 && i+1<=n && j-1>=1 && j-1<=m)
                        cnt++;
                    if(arr[i+1][j]=='*'&& i+1>=1 && i+1<=n && j>=1 && j<=m)
                        cnt++;
                    if(arr[i+1][j+1]=='*'&& i+1>=1 && i+1<=n && j+1>=1 && j+1<=m)
                        cnt++;

                    ans[i][j]=cnt;
                }
            }

        }
        printf("Field #%d:\n",c);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(arr[i][j]=='*')
                {
                    printf("*");
                }
                else
                    cout<<ans[i][j];
            }

            cout<<endl;
        }
    }
    return 0;
}

Thursday, January 5, 2017

UVa 10018: Reverse and Add

Problem Link:Reverse and Add

NB:There is trick to solve this problem thus read the problem carefully.You may get compile error in C for input format.So implement the program in .cpp extension.

Source code in C++:

#include<stdio.h>
#define lli long long int
#define file freopen("in.txt","rt",stdin)
int main()
{
    // file;
    lli num,revnum,sum1,sum2,d,r,cnt,num1;
    int test;
    while(scanf("%d",&test)!=EOF)
    {
        while(test--)
        {
            cnt=0;
            scanf("%lld",&num);
            do
            {
                num1 = num;
                sum1=0;
                while(num>0)
                {
                    r = num%10;
                    num = num/10;
                    sum1 = sum1*10+r;
                }
                num=num1+sum1;
                sum2=0;
                while(num>0)
                {
                    r = num%10;
                    num = num/10;
                    sum2 = sum2*10+r;
                }
                cnt++;
                num=sum1+num1;
            }
            while((num1+sum1)!=sum2);
            printf("%lld %lld\n",cnt,sum2);
        }
    }
    return 0;
}

 

Thursday, December 29, 2016

The easiest DFS (depth first search) Problem: UVa 459

N:B First understand the core dfs algorithm and implement it in your own way.There are a lot of resources in online like GeeksForGeeks and in Wiki.


Problem Link: Graph Connectivity
For more practice : Go to here

Source code in C++:

#include<bits/stdc++.h>
#define lli long long int
#define file freopen("in.txt","rt",stdin)
using namespace std;
vector<int> node[101];
int vis[101];
void dfs(int n)
{
    for(int i=0; i<node[n].size(); i++)
    {
        if(vis[node[n][i]]==0)
        {
            vis[node[n][i]] = 1;
            dfs(node[n][i]);
        }
    }
}


int main()
{
    char str[3];
    int test,temp,sum=0;
    char f,s;
    cin>>test;
    scanf("\n");
    while(test--)
    {
        gets(str);
        sum=0;
        temp = str[0];
        memset(vis,0,sizeof vis);
        while(gets(str) and str[0])
        {

            node[str[0]].push_back(str[1]);
            node[str[1]].push_back(str[0]);
        }

        for(int i=65; i<=temp; i++)
        {
            if(vis[i]==0)
            {
                sum++;
                dfs(i);
            }
        }
        cout<<sum;
       if(test)
       {
           cout<<"\n\n";
       }
       else
        cout<<"\n";
       for(int i=65;i<=90;i++)
        node[i].clear();
    }
    return 0;
}

Wednesday, December 28, 2016

How to represent an odd number sum of any three prime numbers.

Codeforces Number Theory Problem: D - Dima and Lisa 

Tutorial:

There is a fact that the distance between adjacent prime numbers isn't big. For n = 109 maximal distanse is 282. So let's find maximal prime p, such that p < n - 1 (we can just decrease n while it's not prime(we can check it in O(sqrt(n) complexity). We know that n - p < 300. Now we have even (because n and p are odd) number n - p and we should divide it into a sum of two primes. As n - p < 300, we can just iterate over small primes P and check if P is prime and n - p - P is prime. You can check that there is a solution for all even numbers less than 300 by bruteforce.

Source Code in C++:

#include<bits/stdc++.h>
using namespace std;
int mark[1000000],PrimeNumber[1000000];
int n = 1000,nprime,limit;
void PrimeNum()
{
    mark[1]=1;

    PrimeNumber[nprime++]=2;

    for(int i=4; i<=n; i+=2)
        mark[i]=1;

    for(int i=3; i<=n; i+=2)
    {
        if(!mark[i])
        {
            PrimeNumber[nprime++]=i;

            if(i<=limit)
            {
                for(int j=i*i; j<=n; j=j+i*2)
                {
                    mark[j]=1;
                }
            }
        }
    }
}
int main()
{
    limit = sqrt(n+1);
    PrimeNum();
    int a,b;
    bool ok=false;
    cin>>a;
    int prime;
    for(int i=a-1;; i--)
    {
        ok =true;
        for(int j=2; j*j<=i; j++)
        {
            if(i%j==0)
            {
                ok=false;
                break;
            }
        }
        if(ok)
        {
            prime=i;
            break;
        }
    }
    int need = a - prime,got;


    for(int i=0;; i++)
    {

        got = need - PrimeNumber[i];

        ok =true;
        for(int j=2; j*j<=got; j++)
        {
            if(got%j==0)
            {
                ok=false;
                break;
            }
        }
        if(ok)
        {
            b=PrimeNumber[i];
            break;
        }

    }
    if(a==3)
    {
        cout<<1<<"\n"<<3<<endl;
    }
    else if(got==0)
    {
        printf("2\n");
        cout<<prime<<" "<<b<<endl;
    }
    else
    {
        printf("3\n");
        cout<<prime<< " "<<got<< " "<<b<<endl;
    }

    return 0;
}

Monday, December 19, 2016

Easy topological sort problem in C++. UVa-10305

Please don't copy code.At first try to understand the topological sort algorithm.
Best explanation in Bangla Language টপোলজিকাল সর্ট.


Implementation in C++.

Source code:

#include<bits/stdc++.h>
using namespace std;
int result[101];
vector<int>ans;
int main()
{
    vector<int>G[101];

    int n,m;
    while(cin>>n>>m)
    {
        if(n==0 && m==0)
            break;
        ans.clear();
        memset(result,0,sizeof result);
        for(int i=0; i<m; i++)
        {
            int node1,node2;
            cin>>node1>>node2;
            G[node1].push_back(node2);
            result[node2]++;
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(result[j]==0)
                {
                    for(int k=0; k<G[j].size(); k++)
                    {
                        int t = G[j][k];
                        result[t]--;
                    }
                    result[j]=-1;
                    ans.push_back(j);
                    break;
                }
            }

        }
        for(int i=0; i<n; i++)
        {
            cout<<ans[i];
            if(i!=n-1)
                cout<<" ";
        }
        cout<<endl;

        for(int i=0;i<=n;i++)
        {
            G[i].clear();
        }

    }
    return 0;
}

Saturday, December 10, 2016

Most easy Disjoint Set Union Problem. UVa-793-Network Connections.

C++ Source Code.
#include<bits/stdc++.h>
using namespace std;

int par[11111];

int find(int a)
{
    if(par[a]==a)
        return a;
    par[a] = find(par[a]);
    return par[a];
}

int main()
{
    int test,i;
    int n,m,computer,u,v;
    int ans1=0,ans2=0;

    char c;
    scanf("%d",&test);

    while(test--)
    {

        scanf("%d",&computer);
        getchar();
        for(i=1; i<=computer; i++)
        {
            par[i] = i;
        }
        ans1=0,ans2=0;
        while((c = getchar())&&isalpha(c))
        {

            scanf("%d%d",&n,&m);
            getchar();
            if(c=='c')
            {
                u = find(n);
                v = find(m);
                par[u] = v;
            }
            else
            {
                u = find(n);
                v = find(m);

                if(u==v)
                {
                    ans1++;
                }
                else
                    ans2++;
            }
        }

        printf("%d,%d\n",ans1,ans2);
        if(test)
            printf("\n");
    }

    return 0;
}

Friday, November 11, 2016

The easiest segment tree problem. Lightoj-1082


1082 - Array Queries  

First read about Segment tree in English or In Bangla ডাটা স্ট্রাকচার: সেগমেন্ট ট্রি-১.

 Implemented in C:

#include<stdio.h>
#define mx 100009
int arr[mx];
int tree[mx*3];
void init(int NowNode,int L,int R) /** Building segment tree **/
{
    if(L==R)
    {
        tree[NowNode]=arr[L];
        return;
    }
    int left = NowNode*2;
    int right = NowNode*2+1;

    int mid = (L+R)/2;

    init(left,L,mid);
    init(right,mid+1,R);
    if(tree[left]<tree[right])
        tree[NowNode]=tree[left];
    else
        tree[NowNode]=tree[right];
}

int Query(int NowNode,int L,int R,int p,int q) /** Query **/
{
    if(p>R|| q<L)
    {
        return 9999999;
    }
    if(L>=p && R<=q)
        return tree[NowNode];

    int left = NowNode*2;
    int right = NowNode*2+1;
    int mid = (L+R)/2;
    int p1 = Query(left,L,mid,p,q);

    int p2 = Query(right,mid+1,R,p,q);
    if(p1<p2)
        return p1;
    else
        return p2;
}


int main()
{
    int n,j,m,k,p,q;
    int i,test;

    scanf("%d",&test);
    for(j=1;j<=test;j++)
    {
        getchar();
        scanf("%d%d",&n,&m);

        for(k=1;k<=n;k++)
        {
            scanf("%d",&arr[k]);
        }
        init(1,1,n);
        printf("Case %d:\n",j);
        for(k=1;k<=m;k++)
        {
            scanf("%d%d",&p,&q);
             printf("%d\n",Query(1,1,n,p,q));
        }
    }
    return 0;
}

Friday, November 4, 2016

Lightoj-1212 - Double Ended Queue


 
The simple deque implementation problem.

C++ Code (STL deque).

#include<bits/stdc++.h>
#define file freopen("lightoj.txt","rt",stdin)
using namespace std;

int main()
{
  //  file;
    deque<int>d;
    string str;
    int n,m,a,val,test;
    cin>>test;
    for(int j=1; j<=test; j++)
    {
        d.clear();

        printf("Case %d:\n",j);
        cin>>n>>m;

        for(int i=1; i<=m; i++)
        {
            cin>>str;
            if(str=="pushLeft")
            {
                cin>>a;
                if(d.size()<n)
                {
                    d.push_front(a);
                    cout<<"Pushed in left: "<<a<<endl;
                }
                else
                    cout<<"The queue is full"<<endl;
            }
            else if(str=="pushRight")
            {
                cin>>a;
                if(d.size()<n)
                {
                    d.push_back(a);
                    cout<<"Pushed in right: "<<a<<endl;
                }
                else
                    cout<<"The queue is full"<<endl;

            }
            else if(str=="popLeft")
            {

                if(!d.empty())
                {
                    val = d.front();
                    d.pop_front();
                    cout<<"Popped from left: "<<val<<endl;
                }
                else
                    cout<<"The queue is empty"<<endl;
            }
            else
            {
                if(!d.empty())
                {
                    val = d.back();
                    cout<<"Popped from right: "<<val<<endl;
                    d.pop_back();
                }
                else
                    cout<<"The queue is empty"<<endl;
            }
        }
    }
    return 0;
}

Thursday, November 3, 2016

Lightoj 1305 - Area of a Parallelogram.



N:B Please don't copy source code.Try to find out the geometrical logic and work hard.

There are 2 or more solution of this problem. I have mentioned one by commenting by uses matrix formula for finding area of quadrilateral.

Or read again the problem.

 C program:

#include<stdio.h>
int main()
{

    double Ax,Ay,Bx,By,Cx,Cy,x,y;
    double a,b,c,ans,s,d,h;
    int i,test;
    scanf("%d",&test);
    for(i=1; i<=test; i++)
    {
        scanf("%lf %lf %lf %lf %lf %lf",&Ax,&Ay,&Bx,&By,&Cx,&Cy);
        x=Ax+Cx-Bx;
        y=Ay+Cy-By;
        a=sqrt((Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By));
        b=sqrt((x-Ax)*(x-Ax)+(y-Ay)*(y-Ay));
        c=sqrt((x-Bx)*(x-Bx)+(y-By)*(y-By));
        s=(a+b+c)/2.0;
        d = sqrt(s*(s-a)*(s-b)*(s-c));
       // ans = .5*fabs((Ax*By+Bx*Cy+Cx*y+x*Ay)-(Ax*y+x*Cy+Cx*By+Bx*Ay));/** Matrix solution **/

        printf("Case %d: %.0lf %.0lf %.0lf\n",i,x,y,2*d);
    }
    return 0;
}

Saturday, September 10, 2016

Lightoj- 1338 - Hidden Secret!


Source code in C++.
-----------------------------
#include<bits/stdc++.h>
using namespace std;
int main()
{

    char str[109],str1[109];
    char arr[109],arr1[109];
    int n;
    scanf("%d ",&n);

    for(int k=1; k<=n; k++)
    {

        gets(str);
        gets(str1);
        int l=0;
        for(int i=0; i<strlen(str); i++)
        {
            if(str[i]>='A'&&str[i]<='Z')
            {
                str[i]=str[i]+' ';

            }
            if(str[i]!=' ')
            {
                arr[l]=str[i];
                l++;
            }
        }
        int m=0;
        for(int i=0; i<strlen(str1); i++)
        {
            if(str1[i]>='A'&&str1[i]<='Z')
                str1[i]=str1[i]+' ';
            if(str1[i]!=' ')
            {
                arr1[m]=str1[i];
                m++;
            }
        }
        sort(arr,arr+l);
        sort(arr1,arr1+m);
        bool ok= true;
        if(l==m)
        {

            if(ok)
                printf("Case %d: Yes\n",k);
            else
                printf("Case %d: No\n",k);
        }
        else
            printf("Case %d: No\n",k);
    }
    return 0;
}

Monday, August 1, 2016

lightoj-1020- A Childhood Game



Suggestion: Don's use or see any source code before you have tried enough.

It's a game theoretical basic problem.If you do not understand it please read first from Shafayater blog>game theory(1).
Source Code in C:

#include<stdio.h>
#include<string.h>
int main()
{
    long long int n,i,m,t;
    char str[10];
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lld ",&t);
        scanf("%s",str);

        m=strcmp(str,"Alice");
        if(m==0)
        {
            if(t==1||(t-1)%3==0)
            {
                printf("Case %lld: Bob\n",i);
            }
            else
                 printf("Case %lld: Alice\n",i);
        }else
        {
            if(t%3==0)
            {
                printf("Case %lld: Alice\n",i);
            }
            else
                 printf("Case %lld: Bob\n",i);
        }
    }
    return 0;
}