برای استفاده از تمام امکانات سایت از جمله مرکز دانلود باید در سایت عضو شوید. برای ثبت نام تنها 1 دقیقه زمان نیاز دارید ، برای ثبت نام اینجا کلیک کنید

صفحه اول انجمنها
ثبت نامجستجوراهنماي انجمنليست اعضااتاق چت (0)گروه هاي كاربرانمرکز دانلودورود

پاسخ به يك موضوع صفحه 6 از 7
برو به صفحه قبلي  1, 2, 3, 4, 5, 6, 7  بعدي
بررسی سوالات ACM_ICPC ( فعلا شریف 2001)
نويسنده پيغام

پاسخ بصورت نقل قول
ارسال Problem c :Crossed Matchings 
این رو هم نوشتم واین هم time limit exeeded می خوره   Crying or Very sad

خیلی عجیبه اگه یه test case رو حذف کنیم در کمتر از 0.2 ثانیه همه رو جواب میده ولی سر همون یکی گیر می کنه !!

نباید اینجوری باشه ! کسی می تونه بگه مشکل کجاست ؟

ورودی رو هم آخر گذاشتم.

code:
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
using namespace std;
int up[200],down[200];
int n1,n2,sum;
void go_2(int,int,int,int,int);
void go_1(int next_up,int next_down,int ans){
   sum = ans > sum ? ans : sum;   
   for (int i=next_up;i<n1;++i)
      for (int j=next_down;j<n2;++j)
         if (up[i]==down[j] && sum < ((n2-j)/2+ans+1)){
            go_2(i+1,next_down-1,j,ans,up[i]);
            break;
         }
}   
void go_2(int next_up,int next_down,int before_down,int ans,int k){
   for (int i=next_up;i<n1;++i)
      if ((n1-i)/2+ans+1>sum){
         for (int j=next_down;j<before_down;++j)
            if (up[i]==down[j] && up[i]!=k ){
               go_1(i+1,before_down+2,ans+1);
               return ;
            }
      }
      else
         return ;
}            
int main(){
   ifstream in("sharif_99_C.in");
   int m;
   clock_t cl=clock();
   for (in>>m;m>0;--m){
      in >> n1 >> n2;
      sum=0;
      for (int i=0;i<n1;++i)
         in >> up[i];
      for (int i=0;i<n2;++i)
         in >> down[i];

      go_1(0,1,0);
      cout << sum*2 << endl;
   }
   cout << "Time : " << (clock()-cl) * 0.001 << endl;
   return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
اینم ورودی این سوال


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
اینم سوال های سال 2000  :

اگر کسی test case های ورودی و خروجی اش رو داره لطفا همین جا بزاره چون من فعلا ندارم.


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
اينم از test case ها :


پاسخ بصورت نقل قول
ارسال Promblem A:Number Step 
code:
#include"iostream"
#include"fstream"
using namespace std;
int main()
{
    ifstream fin("a.in");
    ofstream fout("a.out");
    __int64 n,x,y,ans;
    bool flag;
    for(fin>>n;n>0;--n)
    { 
        flag=true;
        fin>>x>>y;
        if((x!=y&&x-2!=y)||x<0||y<0)
            flag=false;
        else
        {   
            if(x==y)
            {
                if(x%2==0)
                    ans=x*2;
                else
                    ans=x*2-1;
            }
            else
            {
                if(x%2==0)
                    ans=2*y+2;
                else
                    ans=2*y+1;
            }
        }
        if(flag==true)
            fout<<ans<<endl;
        else
            fout<<"No Number"<<endl;
    }
    return 0;
}



پاسخ بصورت نقل قول
ارسال Lazy math instructor 
اینم سوالیه که چند تا لط بچه ها حل کردن.

جای حروف عدد گذاشتن , جالبه !
code:

//Name=Lazy Math instructor
//Author:Corona team
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<conio.h>
#include<stack>
using namespace std;
int cal(string);
class node
{
public:
    int num;
    char ch2;
};
int main()
{
    int temp1,temp2,n,i;
    char ch;
    string a,b;
    ifstream in("c.in");
    in>>n;
    in.get(ch);
    for(i=0;i<n;i++)
    {
        getline(in,a);
        getline(in,b);
        a.insert(0,"(");
        a.insert(a.size(),")");
        b.insert(0,"(");
        b.insert(b.size(),")");
        temp1=cal(a);
        temp2=cal(b);
        if (temp1==temp2)
            cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}
int cal(string a)
{
    vector<int> v;
    stack<char> st;
    char ch=0,ch1='a';
    int temp=0,temp1=0,temp2=0,i=0,j=0;
    vector<node> vn;
    node tempvn;
    for(i=1;ch1<='z';i++,ch1++)
    {
        tempvn.num=i%10;
        tempvn.ch2=ch1;
        vn.push_back(tempvn);
    }
    for(i=0;i<a.size();i++)
        if (a[i]==' ' || a[i]=='\t')
            a.erase(a.begin()+i);


    for(i=0;i<a.size();i++)
        for(j=0;j<vn.size();j++)
            if(a[i] == vn[j].ch2)
                a[i]=vn[j].num+48;

       

    for (i=0;i<a.size();i++)
    {
        ch=0;
        if (a[i]=='(')
            st.push(a[i]);//////////////
        else if (a[i]>='0' && a[i]<='9')
            v.push_back(a[i]-48);
        else if (a[i] =='+' || a[i]=='-')
        {
            if(st.top()=='*')
            {
                st.pop();
                temp=v[v.size()-1] * v[v.size()-2];
                v.erase(v.begin()+v.size()-1);   
                v.erase(v.begin()+v.size()-1);
                v.push_back(temp);
            }
            else if(st.top()=='+' || st.top()=='-')
            {
                ch=st.top();
                st.pop();
            }
            st.push(a[i]);
            if (ch == '+')
            {
                temp=v[v.size()-1] + v[v.size()-2];
                v.erase(v.begin()+v.size()-1);   
                v.erase(v.begin()+v.size()-1);
                v.push_back(temp);
            }
            else if (ch == '-')
            {
                temp=v[v.size()-2] - v[v.size()-1];
                v.erase(v.begin()+v.size()-1);   
                v.erase(v.begin()+v.size()-1);
                v.push_back(temp);
            }
        }
        else if (a[i]=='*')
            st.push(a[i]);
        else if (a[i]==')')
        {
            while(st.top() != '(')
            {
                ch=st.top();
                st.pop();
                temp1=v[v.size()-1];
                temp2=v[v.size()-2];
                switch(ch)
                {
                case '+':temp1+=temp2;
                    v.erase(v.begin()+v.size()-1);
                    v.erase(v.begin()+v.size()-1);
                    v.push_back(temp1);
                    break;
                case '-':temp1=temp2-temp1;
                    v.erase(v.begin()+v.size()-1);
                    v.erase(v.begin()+v.size()-1);
                    v.push_back(temp1);
                    break;
                case '*':temp1*=temp2;
                    v.erase(v.begin()+v.size()-1);
                    v.erase(v.begin()+v.size()-1);
                    v.push_back(temp1);
                    break;
                }
            }
            st.pop();
        }
    }
    return v[0];
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال B: puzzlestan 
نو حل این سوال هم از goto استفاده  کردم , هم از random !!

کی میگه بده ؟ خیلی هم خوبه اگه بتونی درست ازشون استفاده کنی.

راستی اجراش کنین . زمان اجرا رو میده 0  !!!  آره صفر . و این غیر ممکنه ! نمی دونم شاید زمان کمتر از 0.0005 رو به پایین گرد می کنه ؟

کسی می دونه دلیلش چیه ؟


code:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include <ctime>
using namespace std;
vector <string> first,ans;
int sure[7][7];
int n,m;
struct rely {
    int a,b,c,d;
    char ch;
};
void wher (char x,char y,int row1,int row2,int &i,int &j){
    i=ans[row1].find(x);
    j=ans[row2].find(y);
}
int main(){
   srand( (unsigned)time( NULL ) );
   clock_t cl=clock();
    first.assign(7,"");
    ans.assign(7,"");
    int T;
    ifstream in("sharif_00_b.in");
    in >> T;
    while (T--){
     in >> n>> m;
     for (int i=0;i<n;++i){
          in >> first[i];
          ans[i]=first[i];
          for (int j=0;j<m;++j)
           if (i==0)
            sure[i][j]=1;
           else
            sure[i][j]=0;
     }
     vector <rely> r;
     rely t;
     in >> t.a >> t.b >> t.ch >> t.c >> t.d;
     while ( t.a!=0 ){
      --t.a , --t.b , --t.c ,--t.d ;
      r.push_back(t);
        in >> t.a >> t.b >> t.ch >> t.c >> t.d;
     }
     bool flag=true;
     int h1; // random mishe !! :D
     while (flag) {
      flag = false;
      for ( int l=0;l<r.size();++l) {
          int q,w;
          wher (first[r[l].a][r[l].b],first[r[l].c][r[l].d],r[l].a,r[l].c,q,w);
          // A= r[l].a , q  &     J=r[l].c,w  in ans
          if (r[l].ch == 'R' ){
           if (sure[r[l].a][q]==0  && sure[r[l].c][w]==1 && sure[r[l].a][w]==0){
            if (q!=w) flag=true;
            sure[r[l].a][w]=1;
            swap ( ans[r[l].a][q] , ans[r[l].a][w] );
           }
           else if (sure[r[l].a][q]==1  && sure[r[l].c][w]==0 && sure[r[l].c][q]==0){
            if (q!=w) flag=true;
            sure[r[l].c][q]=1;
            swap ( ans[r[l].c][w] , ans[r[l].c][q] );
           }
           else if (! sure[r[l].a][q] &&  !sure[r[l].c][w] ){ // bayad uni ke behtare entekhab beshe !! che juri ?
            if (sure[r[l].a][w]==0 && sure[r[l].a][q]==0 && sure[r[l].c][q]==0 && sure[r[l].c][w]==0 )// har dohalat mojaz bashan
                if (rand()%2==1)
                 goto L1;
                else
                 goto L2;
            if (sure[r[l].a][w]==0 && sure[r[l].a][q]==0){
L1:                swap ( ans[r[l].a][q] , ans[r[l].a][w] );
                if (q!=w) flag=true;
            }
            else if (sure[r[l].c][q]==0 && sure[r[l].c][w]==0){
L2:                swap ( ans[r[l].c][w] , ans[r[l].c][q] );
                if (q!=w) flag=true;
            }
           }
          }
          else if (q==w){ // age tu yek sotun an , bayad uni ke behtare avaz beshe beshe? aslan fargh mikone?
           if (sure[r[l].a][q]==0){
            for (h1=rand()%m;;h1=rand()%m)
                if (sure[r[l].a][h1]==0 && h1!=q){
                 swap (ans[r[l].a][q],ans[r[l].a][h1]);
                 flag=true;
                 break;
                }
           }
           else  if (sure [r[l].c][w]==0)
            for (h1=rand()%m;;h1=rand()%m)
                if (sure[r[l].c][h1]==0 && h1!=w){
                 swap (ans[r[l].c][w],ans[r[l].c][h1]);
                 flag=true;
                 break;
                }
          }
      }
     }
     for (int i=0;i<m;++i){
      for (int j=0;j<n;++j)
          cout << ans[j][i];
      cout << endl;
     }
     cout << endl;
    }
    cout << "Time: " << (clock()-cl) *0.001 << endl;
    return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال C: Dynamic Declaration Language 
خب این سوال کلی قاعده قانون گذاشته بود . باید همون ها رو درست پیاده سازی مس کردی و چیزه خاصی نداشت , غیر از توضیحی که تو سطر اول نوشتم
code:

// switch ( string ) nemifhme !!
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
    int T;
    ifstream in("sharif_00_c.in");
    in >> T;
    for (int t=1;t<=T;++t){
     map <string,pair<int,bool> > m; // int vase meghdaresh , bool vase in ke bebinim bad az akharin Dcl taghir karde ya na !
     //m["x"].first=0;
     int n;
     in >> n;
     cout << t << endl;
     vector <string> s(n+1);
     string st;
     for (int j=0;j<n+1;++j){
      getline(in,st,'\n');
      s[j]=st;
     }
     stringstream ss;
     ss << s[1];
     int i=1;
     bool flag=true;
     while (flag){
      ss >> st;
      if (st == "DCL" ){
             ss >> st;
             if ( m.find(st)!=m.end() )
                if (m[st].second==0) cout << i << " 1" << endl;
             m[st].first=0;
             m[st].second=0;
             ++i;
      }
      else if (st == "INC" ) {
              ss >> st;
           if ( m.find(st)==m.end() )
            cout << i << " 2" << endl;
           else
            m[st].first++ , m[st].second=1;
           ++i;
      }
      else if (st == "DEC" ) {
              ss >> st;
           if ( m.find(st)==m.end() )
            cout << i << " 2" << endl;
           else
            m[st].first-- , m[st].second=1;
           ++i;
      }
      else if (st == "END" )
           flag=false;
      else if (st ==  "GOTO" ){
              ss >> st;
           if (m.find(st)==m.end() ){
            if (isdigit(st[0]) || st[0]=='-'){
                stringstream temp;
                temp << st;
                temp >> i;
            }
            else{
                ss >> st;
                cout << i << " 2" << endl;
                ++i;
            }
           }
           else {
            int temp;
            ss >> temp;
            if (m[st].first > 0)
                i=temp;
            else
                ++i;
           }            
      }
      else {
           int temp1; char temp2;
            ss >> temp2;
            ss >> temp1;
           if (m.find(st)==m.end())
            cout << i << " 2" << endl;
           else {
            m[st].first=temp1 ;
            m[st].second =1;
           }
           ++i;
      }
      ss.clear();
      ss << s[i];
     }
    }
    return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال F:Buggy Sat 
اومدم مساحت رو به کمک ضرب خارجی حساب کردم , خودش هم که نقطه ها رو به ترتیب داده.

region ای که بیشترین مساحت رو داشته باشه میشه جواب . همین !  Cool  
code:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct point {
   double x,y;
   point(){}
   point (double a,double b){
      x=a,y=b;
   }
};
double ex_mult(point &a,point &b){
   return ((a.x*b.y)-(a.y*b.x));
}
int main(){
   ifstream in("sharif_00_f.in");
   int t,n,region;
   vector <int> temp;
   for (in >> t;t>0;--t){
      in >> n;
      vector <point> p;
      point te;
      for (int i=0;i<n;++i){
         in >> te.x >> te.y;
         p.push_back(te);
      }
      in >> n;
      vector < vector <int> > v;
      int num;
      for (int i=0;i<n;++i){
         in >> num;
         temp.resize(num);
         for (int j=0;j<num;++j)
            in >> temp[j];
         v.push_back (temp);
      }
      double max_area=0,sum;
      int ans=0;
      for (int i=0;i<n;++i){
         sum=0;
         for (int j=0;j<v[i].size();++j)
            sum += ex_mult(p[v[i][j]-1],p[v[i][(j+1)%v[i].size()]-1]);
         if (sum>max_area){
            max_area=sum;
            ans=i+1;
         }
      }
      cout << ans << endl;
   }
   return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال Problem D: color tunnels 
به صورت پویا حل میشه و تمرکز می خواد !  Cool  

توضیحات بیشتر تو کد به صورت comment گذاشتم :

code:
#include <iostream>
#include <ctime>
#include <vector>
#include <fstream>
#include <cmath>
#include <iomanip>
#define pow2(x) ((x)*(x))
using namespace std;
struct point{
    double x,y;
    bool operator ==(point &p) const {
     return (p.x == x && p.y == y );
    }
};
struct line {
    point sar,tah;
    double length;
};
struct cross {
    point now; // neshun mide alan in masir be kodum noghte reside
    int tunnel;
    double sum;
    cross(){
     sum=0;
    }
};
inline double dist(point &p,point &q){
    return sqrt(pow2(p.x-q.x)+pow2(p.y-q.y));
}
int way[30];
int main(){
    clock_t cl=clock();
    ifstream in("sharif_00_d.in");
    int T;
    in >> T;
    while (T--){
     vector <vector <line> > v (101);// tunnel haye hamrang ro ye ja mizarim
     point s,t;
     in >> s.x >> s.y >> t.x >> t.y;
     int step; in >> step;
     for (int i=0;i<step;++i)
      in >> way[i];
     int n;
     in>>n;
     line temp;
     int color;
     for (int i=0;i<n;++i){
      in >> temp.sar.x >> temp.sar.y >> temp.tah.x >> temp.tah.y >> color;
      temp.length = dist (temp.sar,temp.tah);
      v[color].push_back(temp);
     }
     vector <vector<cross> > c(step);
     cross temp1;
     for (int i=0;i<step;++i){
      for (int j=0;j<v[way[i]].size();++j){
          if (i==0){
           temp1.now = v[way[i]][j].tah;
           temp1.sum = dist(s,v[way[i]][j].sar) + v[way[i]][j].length;
           temp1.tunnel=i+1;
           c[i].push_back(temp1);
           temp1.now = v[way[i]][j].sar;
           temp1.sum = dist(s,v[way[i]][j].tah) + v[way[i]][j].length;
           c[i].push_back(temp1);
          }
          else
           for (int k=0;k<c[i-1].size();++k){
            temp1.now = v[way[i]][j].tah;
            temp1.sum = c[i-1][k].sum + dist(c[i-1][k].now,v[way[i]][j].sar) + v[way[i]][j].length;
            temp1.tunnel=i+1;
            c[i].push_back(temp1);
            temp1.now = v[way[i]][j].sar;
            temp1.sum = c[i-1][k].sum + dist(c[i-1][k].now,v[way[i]][j].tah) + v[way[i]][j].length;
            c[i].push_back(temp1);
           }
      }
      // hazf:
      if (i!=0){
          for (int l=0;l<c[i].size();++l)
           for (int o=l+1;o<c[i].size();++o)
            if (c[i][l].now == c[i][o].now)
                if ( c[i][l].sum < c[i][o].sum){
                 c[i].erase(c[i].begin()+o);
                 --o;
                 continue;
                }
                else if ( c[i][l].sum > c[i][o].sum){
                 c[i].erase(c[i].begin()+l);
                 --l;
                 break;
                }
      }//if
     }
     double ans=1000000000;
     for (int i=0;i<c[step-1].size();++i)
      ans = min (ans,c[step-1][i].sum + dist(c[step-1][i].now,t));
     cout << fixed << setprecision(14) << ans << endl;

     // khat hayi ke rangeshun ba way yekiye ro entekhab mikonim va ye bar az sar be tah mirim ye bar az tah be sar :D
     // bayad tahe khat ( age az sar berim tah :d ) , az beyne tamame masir haye ke ta hala be inja residan va way ashun yekiye
     // min entekhab beshe ( baghiye hazf beshan )
    }
    cout << "Time: " << ( clock()-cl ) * 0.001 << endl;
    return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال Problem I: 3002 Rubbery 
این سوال های G و H چه جوری حل میشن؟

مخصوصا اون dolphin pool , اصلا هیچ راهی به نظرم نمی رسه !

code:
#include <queue>
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#include <ctime>
struct point {
   int x,y;
   point (int x1,int y1) : x(x1) , y(y1) {}
};
struct dpoint {
   double x,y;
   dpoint (double x1,double y1) : x(x1) , y(y1) {}
};
struct region{
   int x1,y1,x2,y2; // up_left & down_right of each region
   int area;
   int banner ; // 0 means free,1 means availble,2 means obstacle
};
struct line {
   int x1,y1,x2,y2; // x2>x1 & y2>y1
   line (int x3,int y3,int x4,int y4) : x1(x3) , x2(x4) , y1(y3) , y2(y4) {}
};
double whichside (point a,point b,dpoint c){
   return ( ( a.x * b.y ) - ( b.x * a.y ) + ( b.x * c.y ) - ( c.x * b.y ) + ( c.x * a.y ) - ( a.x * c.y )  );
}
bool isfree (const region &r ,const vector <line> &v ,const vector <line> &h ){
   int up=0,right=0;
   double x=double (r.x1+r.x2)/2 , y = double (r.y1+r.y2) /2 ;
   for (int i=0;i<h.size();++i)
      if ( whichside ( point (h[i].x1,h[i].y1) , point (h[i].x2,h[i].y1) , dpoint ((double)x,(double)y) ) < 0 && x>h[i].x1 && x<h[i].x2)
         ++up ;
   for (int i=0;i<v.size();++i)
      if ( whichside ( point (v[i].x1,v[i].y1) , point (v[i].x1,v[i].y2) , dpoint ((double)x,(double)y) ) < 0 && y>v[i].y1 && y<v[i].y2)
         ++right;
   if ( right%2==0 && up%2==0 )
      return true;
   return false;
}
int main(){
   clock_t cl=clock();
   ifstream in ("sharif_00_i.in");
   int T; in >>T;
   while (T--){

      int length,width; in >> length >> width;
      vector <line> vertical , horizontal;
      vector <int> xs,ys; // we need this cordinates to create region matrix
      vector <int> ::iterator x_end,y_end;
      xs.push_back(0);xs.push_back(length);
      ys.push_back(0);ys.push_back(width);
      int n,m; in >> n;

      for (int b=0;b<n;++b){
         in >> m;
         point t(0,0), t2(0,0);
         in >> t.x >> t.y;  /*t.x-- , t.y-- ;*/
         xs.push_back(t.x) ; ys.push_back(t.y);
         int X,Y ; // for lines that not given
         X=t2.x=t.x ; Y=t2.y=t.y;
         for (int i=1;i<m;++i){
            in >> t.x >> t.y;  /*t.x-- , t.y-- ;*/
            xs.push_back(t.x) ; ys.push_back(t.y);
            if ( t.x != t2.x )
               horizontal.push_back ( line (min(t.x,t2.x),min(t.y,t2.y),max(t.x,t2.x),max(t.y,t2.y)));
            else
               vertical.push_back ( line (min(t.x,t2.x),min(t.y,t2.y),max(t.x,t2.x),max(t.y,t2.y)));
            t2.x=t.x , t2.y=t.y;
         }
         if ( X != t2.x )
            horizontal.push_back ( line (min(X,t2.x),min(Y,t2.y),max(X,t2.x),max(Y,t2.y)));
         else
            vertical.push_back ( line (min(X,t2.x),min(Y,t2.y),max(X,t2.x),max(Y,t2.y)));
      }
      // stupidly sort :
      sort (xs.begin(),xs.end());
      sort ( ys.begin(),ys.end());
      x_end = unique (xs.begin(),xs.end());
      y_end = unique(ys.begin(),ys.end());
      xs.erase( x_end , xs.end() );
      ys.erase(y_end , ys.end() );
      //create matrix :
      vector <vector < region > > r (xs.size()-1 , vector <region> (ys.size()-1) );
      for (int i=0;i<xs.size()-1;++i){
         for (int j=0;j<ys.size()-1;++j){
            r[i][j].x1=xs[i]; r[i][j].x2=xs[i+1];
            r[i][j].y1=ys[j]; r[i][j].y2=ys[j+1];
            r[i][j].area = ( (xs[i+1]-xs[i])*(ys[j+1]-ys[j]) );
         }
      }

      for (int i=0;i<r.size();++i)
         for (int j=0;j<r[i].size();++j)
            if (! isfree( r[i][j], vertical , horizontal ) )
               r[i][j].banner=2 ; // obstacle

      queue <point> q;
      q.push(point(r.size()-1,0));
      while (!q.empty() ){
         point p=q.front() ; q.pop();
         if (r[p.x][p.y].banner==2)
            continue;
         r[p.x][p.y].banner=1; //available
         if ( p.x > 0 && r[p.x-1][p.y].banner==0 )
            q.push(point(p.x-1,p.y));
         if ( p.y < r[p.x].size()-1 && r[p.x][p.y+1].banner==0 )
            q.push(point(p.x,p.y+1));
      }

      int ans=0;
      for (int i=0;i<r.size();++i)
         for (int j=0;j<r[i].size();++j)
            if (r[i][j].banner==0)
               ans+=r[i][j].area;

      cout << ans << endl;
   }
   cout << "Time: " << (clock() - cl ) * 0.001 << endl;
   return 0;
}
// mohammad reza :D



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی
نمايش نامه هاي ارسال شده قبلي:
پاسخ به يك موضوع صفحه 6 از 7
برو به صفحه قبلي  1, 2, 3, 4, 5, 6, 7  بعدي