Esempio n. 1
0
int main() {
	int TC, x, y;
	scanf("%d",&TC);
	for(int tc=1; tc<=TC; ++tc) {
		scanf("%d%d",&N,&R);
		P.clear();
		edges.clear();
		for(int i = 0; i < N; ++i) {
			scanf("%d%d",&x,&y);
			P.push_back(ii(x,y));
		}
		for(int i = 0; i < N; ++i) {
			for(int j = i+1; j < N; ++j) {
				edges.push_back(Edge(i,j,dist(P[i].first,P[i].second,
					P[j].first,P[j].second)));
			}
		}
		sort(edges.begin(),edges.end(),cmp());
		DisjointSet dset(N);
		double cost_road=0.0, cost_railroad=0.0;
		int n_state = 1;
		for(int i = 0; i < edges.size() && dset.size() > 1; ++i) {
			if(dset.union_rep(edges[i].u,edges[i].v)) {
				if(edges[i].cost > R) {
					cost_railroad+=edges[i].cost;
					n_state++;
				} else {
					cost_road+=edges[i].cost;
				}
			}
		}
		printf("Case #%d: %d %d %d\n",tc,n_state,int(round(cost_road)),int(round(cost_railroad)));
	}
	return 0;
}
Esempio n. 2
0
	inline void Updata(int t) {
		int N = L[t].size();
		VII tmp;
		for (SII::iterator it = L[t].begin(); it != L[t].end() && it->F < N;) {
			tmp.push_back(*it);
			L[t].erase(it++);
		}
		for (VII::iterator it = tmp.begin(); it != tmp.end(); it++) {
			Ans[it->index] = it->F = N;
			L[t].insert(*it);
		}
	}
Esempio n. 3
0
	inline VII BabyStep(int a, int b, int c) {
		VII ret;
		int m = (int)sqrt(c) + 1, tmp = 1; a %= c; if (a == 0) return ret;
		insert(1, 0);
		for (int i = 1; i <= m; i++)
			tmp = (Int65) tmp * a % c, insert(tmp, i);
		int gss = b, opp = Pow(tmp, c - 2, c);
		for (int i = 0, d; i <= m; i++) {
			int index = gss % MOD;
			for (Edge *p = e[index]; p; p = p->next) if (p->index == gss)
				ret.push_back(i * m + p->value);
			gss = (Int65) gss * opp % c;
		}
		return ret;
	}
Esempio n. 4
0
	inline void solve(void) {
		scanf("%d%d%d", &p, &a, &k);
		Divid(p - 1);
		if (p == 2) {
			if (k == 0) printf("%d\n%d\n", 1, 0);
			else printf("%d\n%d\n",1, 1);
			return;
		}
		int g = GetRoot(p);
		int tmp = Pow(g, a, p);
		VII ret = BabyStep(tmp, k, p);
		SII Ans;
		for (VII::iterator it = ret.begin(); it != ret.end(); it++) {
			Ans.insert(Pow(g, *it, p));
		}
		printf("%d\n", Ans.size());
		for (SII::iterator it = Ans.begin(); it != Ans.end(); it++)
			printf("%d\n", *it);
	}
Esempio n. 5
0
VII ConvexHull( VII points){
    int fwd=0; VII CH;
    for(int i=0; i<points.size(); i++){
        while(fwd>1 and CP( CH[fwd-2], CH[fwd-1], points[i] ) <= 0) CH.pop_back(),fwd--;
        CH.push_back(points[i]),fwd++;
    }
    int bwd=fwd;
    
    for(int i=points.size()-2; i>=0; i--){
        while(bwd > fwd and CP(CH[bwd-2], CH[bwd-1], points[i]) <=0 ) CH.pop_back(),bwd--;
        CH.push_back(points[i]),bwd++;
    }
    CH.erase(CH.begin());
    //printf("\nsize : %d\n", CH.size());
    return CH;
}
Esempio n. 6
0
int main(){
    int n;si(n);
    for(int i=0;i<n;i++){
        int x,y;si(x);si(y);
        a.PB(MP(x,y));
    }
    int cnt = 0;
    for(int i=1;i<n-1;i++){
        if(a[i-1].S==a[i].S and a[i-1].F<a[i].F and a[i+1].S>a[i].S and a[i+1].F==a[i].F) cnt++;
        if(a[i-1].S>a[i].S and a[i-1].F==a[i].F and a[i+1].S==a[i].S and a[i+1].F>a[i].F) cnt++;
        if(a[i-1].S==a[i].S and a[i-1].F>a[i].F and a[i+1].S<a[i].S and a[i+1].F==a[i].F) cnt++;
        if(a[i-1].S<a[i].S and a[i-1].F==a[i].F and a[i+1].S==a[i].S and a[i+1].F<a[i].F) cnt++;
    }
    dout(cnt);
	return 0;
}
Esempio n. 7
0
int main(){
  int n,k;
  si(n);si(k);
  int lmx = 0;
  for(int i=1;i<=n;i++){
    int a;si(a);
    lmx = max(lmx,a);
    s.insert(a);
    v[a].PB(i);
  }
  if(SZ(v[0])!=1 or SZ(s)!=lmx+1){
    cout<<-1<<endl;
    return 0;
  }
  else{
    int curr = 1;
    for(int i=1;i<=lmx;i++){
      if(SZ(v[i])<=0){
        cout<<-1<<endl;
        return 0;
      }
      int idx = 0,cnt = 0;
      SET(vs,0);
      for(int j=0;j<SZ(v[i]);j++){
        if(d[v[i-1][idx]] >= k){
          cout<<-1<<endl;
          return 0;
        }
        if(!vs[idx]){
          cnt++;
          vs[idx] = 1;
        }
        e.PB(MP(v[i-1][idx],v[i][j]));
        //trace(v[i-1][idx],v[i][j]);
        d[v[i-1][idx]]++;
        d[v[i][j]]++;
        idx++;
        idx %= curr;
      }
      curr = SZ(v[i]);
    }
    cout<<SZ(e)<<endl;
    for(int i=0;i<SZ(e);i++) printf("%d %d\n",e[i].F,e[i].S);
  }   
	return 0;
}
Esempio n. 8
0
int main(){
  int n,m,k;
  si(n);si(m);si(k);
  for(int i=0;i<m;i++){
    int a,b,c;
    si(a);si(b);si(c);
    g[a].PB(MP(b,c));
    g[b].PB(MP(a,c));
  }
  for(int i=0;i<k;i++){
    int a,c;
    si(a);si(c);
    e.PB(MP(a,c));
  }
  for(int i=1;i<=n;i++) d[i] = INF;
  d[1] = 0;
  s.insert(MP(d[1],1));
  while(!s.empty()){
    int u = s.begin()->S;
    s.erase(s.begin());
    vs[u] = 1;
    for(int i=0;i<SZ(g[u]);i++){
      int w = g[u][i].F;
      LL edge = g[u][i].S;
      if(vs[w]) continue;
      if(d[u] + edge < d[w]){
        if(s.find(MP(d[w],w))!=s.end()) s.erase(s.find(MP(d[w],w)));
        d[w] = d[u] + edge;
        s.insert(MP(d[w],w));
      }
    }
  }
  int ans = 0;
  for(int i=0;i<SZ(e);i++){
    if(d[e[i].F]<=e[i].S) ans++;
  }
  dout(ans);
	return 0;
}
Esempio n. 9
0
int main(){
    hexa=0;
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        scanf("%d%d", &sampah.x, &sampah.y);
        awal.push_back(sampah);
    }
    sort(ALL(awal));
    for(int i1=0; i1<n; i1++)
     for(int i2=i1+1; i2<n; i2++)
      for(int i3=i2+1; i3<n; i3++)
       for(int i4=i3+1; i4<n; i4++)
        for(int i5=i4+1; i5<n; i5++)
         for(int i6=i5+1; i6<n; i6++){
             pilihan.clear();
             pilihan.push_back(awal[i1]);
             pilihan.push_back(awal[i2]);
             pilihan.push_back(awal[i3]);
             pilihan.push_back(awal[i4]);
             pilihan.push_back(awal[i5]);
             pilihan.push_back(awal[i6]);
             sort(ALL(pilihan));
             
             /*for(int i=0; i<pilihan.size(); i++){
                 printf("** %d %d\n", pilihan[i].x, pilihan[i].y);
             }*/
             hasil=ConvexHull(pilihan);
             sort(hasil.begin(), hasil.end());
             /*for(int i=0; i<hasil.size(); i++){
                 printf("-- %d %d\n", hasil[i].x, hasil[i].y);
             }
             puts("\n");*/
             if(pilihan==hasil) hexa++;
         }
    printf("%d\n", hexa);
    return 0;
}
Esempio n. 10
0
 REP(i,n) {
     //cout<<ans[i]<< ' '<<i<<endl;
     if(ans[i] != m) vec.PB(MP(ans[i], i));
 }
Esempio n. 11
0
        scanf("%d%d%d", &n, &m, &H);
        REP(i,m) {
            scanf("%d%d%d",&l[i],&r[i],&x[i]);
            l[i]--; r[i]--;
        }
        //l[m] = 0;
        //r[m] = n-1;
        //x[m] = INF;
        REP(i,n) {
            id[i] = i;
            tmp[i] = 0;
            ans[i] = -1;
        }
        solve(0, n-1, 0, m);
        
        VII vec;
        REP(i,n) {
            //cout<<ans[i]<< ' '<<i<<endl;
            if(ans[i] != m) vec.PB(MP(ans[i], i));
        }
        sort(ALL(vec));
        assert(vec.size() > 0);
        printf("%d\n", vec.size());
        REP(i,vec.size()) {
            if(i) printf(" ");
            printf("%d", vec[i].Y+1);
        }
        puts("");
    }
    return 0;
}
int main()
{
    ///FIN("data.in");
    ///FOUT("data.out");

    read( T );

    while ( T-- )
    {
        read( N ); read( M );

        for ( int i = 1; i <= N; ++i )
            scanf("%s\n", A[i] + 1);

        VII laser;

        for ( int i = 1; i <= N; ++i )
            for ( int j = 1; j <= M; ++j )
                if ( A[i][j] == 'L' )
                    laser.pb( pp( i, j ) );

        const int nrLaser = laser.size();

        int solution = 0;

        for ( int i = 0; i < ( 1 << nrLaser ); ++i )
        {
            ms( rows, 0 );
            ms( column, 0 );
            ms( indice, 0 );

            for ( int j = 0; j < nrLaser; ++j )
            {
                if ( bit( i, j ) )
                {
                    column[ laser[j].se ] = max( column[ laser[j].se ], laser[j].fi );
                }
                else
                {
                    rows[ laser[j].fi ]++;
                    indice[ laser[j].fi ] = j;
                }
            }

            int valid = 1;

            for ( int j = 1; j <= N && valid; ++j )
            {
                if ( rows[j] == 0 )
                {
                    for ( int k = 1; k <= M; ++k )
                    {
                        if ( A[j][k] == 'E' && column[k] < j )
                            valid = 0;
                    }
                }

                if ( rows[j] == 1 )
                {
                    int stanga = 0;
                    int dreapta = 0;

                    int ind = indice[j];

                    int x = laser[ind].fi;
                    int y = laser[ind].se;

                    for ( int k = y - 1; k >= 1; k-- )
                        if ( A[j][k] == 'E' && column[k] < j )
                            stanga++;

                    for ( int k = y + 1; k <= M; ++k )
                        if ( A[j][k] == 'E' && column[k] < j )
                            dreapta++;

                    if ( stanga && dreapta )
                        valid = 0;
                }
            }

            if ( valid )
            {
                solution = 1;
                break;
            }
        }

        if ( solution )
            puts("Possible");
        else
            puts("Impossible");
    }

    return 0;
}