Example #1
0
int main()
{
	#ifdef fn
		freopen(fn ".in", "r", stdin);
		freopen(fn ".out", "w", stdout);
	#endif
	for (int i = 2; i <= 60; i++)
		if (isPrime(i))
			pr.pb(i);
	k = (int)pr.size();
	for (int i = 2; i <= 60; i++)
	{
		for (int j = 0; j < int(pr.size()) && pr[j] <= i; j++)
			if (i % pr[j] == 0)
				fact[i] |= (1 << j);
//		printf("%d %d %d\n", i, fact[i], (~fact[i]) & ((1 << (k + 0)) - 1));
//		out(fact[i]);
//		out((~fact[i]) & ((1 << (k + 0)) - 1));
	}
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", a + i);
	for (int i = 1; i <= n; i++)
		for (int mask = 0; mask < (1 << k); mask++)
			dp[i][mask] = inf;
	dp[0][0] = 0;
	for (int i = 1; i <= n; i++)
	 	for (int x = 1; x < 60; x++)
		{
			int mask = (~fact[x]) & ((1 << (k + 0)) - 1);
			for (int s = mask; ; s = (s - 1) & mask)
			{
				if (umin(dp[i][s | fact[x]], dp[i - 1][s] + abs(a[i] - x)))
					p[i][s | fact[x]] = x;
				if (!s)
					break;
			}
		}
	int ans = inf, msk = 0;
	for (int mask = 0; mask < (1 << k); mask++)
		if (umin(ans, dp[n][mask]))
			msk = mask;
	for (int i = n; i > 0; i--)
	{
		b[i] = p[i][msk];
		msk ^= fact[b[i]];
	}
	for (int i = 1; i <= n; i++)
		printf("%d ", b[i]);
}
Example #2
0
    string getContainerInfo(string str, vector <int> reports, int L)
    {
        sum[0] = 0;
        for(int i=0; i<size(str); i++) sum[i+1] = sum[i] + (str[i]=='X');

        rrs.clear();
        for(int i=0; i<size(str); i++) {
            if(i+L > size(str)) break;
            rrs.pb(sum[i+L] - sum[i]);
            cout << rrs.back() << " ";
        }
        cout << endl;

        map<int,int> target;
        for(int i=0; i<size(reports); i++) target[reports[i]]++;

        string ret(size(str), '?');
        for(int i=0; i<size(str); i++) {
            // skip list : [i-L+1 ~ i]
            int left = max(0, i-L+1);
            map<int,int> others;
            others.clear();
            for(int j=0; j<size(rrs); j++) {
                if(j >= left && j <= i) continue;
                others[rrs[j]]++;
            }

            cout << i << " " << left << " : ";
            bool chk = false;
            for(int j=left; j<min(i+1, size(rrs)); j++) {
                cout << rrs[j] << " ";
                if(target[rrs[j]]) { // can be here.
                    chk = true;
                }
            }
            cout << endl;
            if(!chk) {
                ret[i] = '-';
            }

            foreach(it, target) {
                if(others[it->first] < it->second) { // should be in.
                    ret[i] = '+';
                    break;
                }
            }
        }

        return ret;
    }
int main()
{
  sync;
  int t;
  cin >> t;
  while(t--)
  {
    int n,k,a;
    cin >> n >> k;
    for(int i=0;i<n;i++)
    {
      cin >> a;
      v.pb(a);
    }
    sort(v.begin(),v.end());
    int flag = 0;
    for(int i=0;i<v.size()-3;i++)
    {
      for(int j=i+1;j<v.size()-2;j++)
      {
        int l = j+1,r = v.size()-1;
        while(l<r)
        {
           if(v[i]+v[j]+v[l]+v[r]==k)
           {
             flag = 1;
             if(mp.find({{v[i],v[j]},{v[l],v[r]}})==mp.end())
             {
                cout << v[i] << " " << v[j] << " " << v[l] << " " << v[r] << "$";
                mp[{{v[i],v[j]},{v[l],v[r]}}] = 1;
             }
             r--; 
           }
           else if(v[i]+v[j]+v[l]+v[r] > k)
           {
             r--;
           }
           else
           {
             l++;
           }
        }
      }
    }
    if(flag == 0)
     cout << "-1";
    cout << endl;
    v.clear();
  }
}
Example #4
0
void dfs(int u) {
	if(seen[u]) return;
	seen[u] = 1;
	//if(!sof.empty()) {
	//	int v = sof.back();
	//	if(!seen[u][v]) {
	//		seen[u][v] = 1;
	//		s[u].le = mod(s[u].le + modn - mod(s[v].le * comb(s[u].r - s[v].r, s[u].r - s[v].r + s[u].c - s[v].c)));
	//	}
	//}
	for(int v : adj[u])
		dfs(v);
	sof.pb(u);
}
Example #5
0
int main(){
//	freopen("input","r",stdin);
	string temp;
	int ca = 1;
	while(scanf("%d%d",&n,&p) && n){
		cin.ignore();
		name.clear();
		price.clear();
		nreq.clear();
		FOR(i,n){
			getline(cin, temp);
		}
		double px;
		int _nreq;
		FOR(i,p){
			getline(cin, temp);
			name.pb(temp);
			cin >> px >> _nreq;
			price.pb(px);
			nreq.pb(_nreq);
			cin.ignore();
			FOR(j,_nreq) getline(cin,temp);
		}
Example #6
0
void dfs(int v)
{
	list.pb(v);
	start[v] = list.size();
	for (int j = 0; j < edges[v].size(); j++)
	{
		int u = edges[v][j];
		if (start[u] == 0)
		{
			dfs(u);
			list.push_back(v);
		}
	}
}
Example #7
0
int main() {
    #ifdef partho222
        //freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif

    int iput,kase=0;
    while(cin >> iput && iput != -1){
        if(kase){
            pf("\n");
        }
        miss.clear();
        miss.pb(iput);
        while(cin >> iput && iput != -1){
            miss.pb(iput);
        }

        int res = LIS();
        pf("Test #%d:\n  maximum possible interceptions: %d\n",++kase,res);
    }

    return 0;
}
void dfs(int u, int p)
{
    for(int i = 0; i < (int)edge[u].size(); i++)
    {
        int v = edge[u][i];
        if(v == p) continue;
        dfs(v, u);
        dp[u] += dp[v];
        if(!dp[v]) {
            dp[u]++;
            ans.pb(v);
        }
    }
}
Example #9
0
File: F.cpp Project: kvld/study
void dfs(int u) {
    used[u] = 1;
    for (int i = 0; i < sz(g[u]); i++) {
        int v = g[u][i];
        if (used[v] == 1) {
            cout << -1;
            exit(0);
        }
        if (used[v] == 0)
            dfs(v);
    }
    used[u] = 2;
    topsort.pb(u);
}
Example #10
0
void dfs(int now,int want)
{
	if (now==want)
	{
		can = 1;
		found.pb(v);
		return;
	}
	if (now>want)
		return;

	v.pb(2);
	dfs(2*now+1,want);
	v.resize(v.size()-1);
	
	if (2*now-1>1)
	{
		v.pb(1);
		dfs(2*now-1,want);
		v.resize(v.size()-1);
	}

}
int main()
{
	time1 = clock();
	//cin >> a >> b;
	in >> a >> b;
	get(0, a);
	get(1, b);
	d = gcd(a, b);
	k = a * b / (d * d);
	get(2, d);
	map <ll, ll> primes;
//	for (int j = 0; j < 3; j++, out << "\n")
//	for (int i = 0; i < p[j].size(); i++)
//		out << p[j][i].first << " " << p[j][i].second << "\n";
	for (int j = 0; j < 2; j++)
		for (int i = 0; i < p[j].size(); i++)
			primes[p[j][i].first] += p[j][i].second;
		for (int i = 0; i < p[2].size(); i++)
			primes[p[2][i].first] -= (2 * p[2][i].second);
	for (map <ll, ll> ::iterator i = primes.begin(); i != primes.end(); i++)
	{
		
		pair <ll, ll> x = *i;
		if (x.second)
			p[3].pb(mp(x.first, x.second));
	}

	for (int i = 0; i < p[3].size(); i++)
	{
	//	out << p[3][i].first << " " << p[3][i].second << "\n";
		f.pb(mult(p[3][i].first, p[3][i].second));
	}
	go(0);
	out << ansa * d << " " << ansb * d << '\n';


	/*d = gcd(a, b);
	k = a * b / (d * d);
	for (ll i = (ll)sqrt(1. * k) + 1; i > 0; i--){
		if (i * i > k) continue;
		if (k % i == 0){
			if (gcd(i, k / i) == 1){
				ans = i;
				cout << ans * d << " " << (k / ans) * d;
				return 0;
			}
		}
	}*/
	return 0;
}
Example #12
0
int winf()
{
    int cnt=0;
    for(int i=0;i<3;i++)
    {
        if(mat[i][0]==0)continue;
        if(mat[i][0]==mat[i][1]&&mat[i][1]==mat[i][2])
        {
            ret=mat[i][0];
            v.pb(ret);
            cnt++;
        }
    }
    for(int i=0;i<3;i++)
    {
        if(mat[0][i]==0)continue;
        if(mat[0][i]==mat[1][i]&&mat[1][i]==mat[2][i])
        {
            ret=mat[0][i];
            v.pb(ret);
            cnt++;
        }
    }
    if(mat[0][0]!=0&&mat[0][0]==mat[1][1]&&mat[1][1]==mat[2][2])
        {
            ret=mat[0][0];
             v.pb(ret);
            cnt++;
        }
    if(mat[0][2]!=0&&mat[0][2]==mat[1][1]&&mat[1][1]==mat[2][0])
        {
            ret=mat[0][2];
             v.pb(ret);
            cnt++;
        }
    return cnt;
}
void dfs(int q, string s, vector <int> m) {
    if (q == t) {
        ans.pb(s);
        return;
    }
    for (int i = 0; i < m.size(); ++i) {
        pair <int, int> cur = itp(i);
        if (cur.F + 1 >= 0 && s[pti(mp(cur.F + 1, cur.S))] == '.') {
            s[pti(mp(cur.F + 1, cur.S))] = '*';
            m.pb(pti(mp(cur.F + 1, cur.S)));
            dfs(q + 1, s, m);
            s[pti(mp(cur.F + 1, cur.S))] = '.';
            m.pop_back();
        }
        if (cur.F - 1 >= 0 && s[pti(mp(cur.F - 1, cur.S))] == '.') {
            s[pti(mp(cur.F - 1, cur.S))] = '*';
            m.pb(pti(mp(cur.F - 1, cur.S)));
            dfs(q + 1, s, m);
            s[pti(mp(cur.F - 1, cur.S))] = '.';
            m.pop_back();
        }
        if (cur.S + 1 < r && s[pti(mp(cur.F, cur.S + 1))] == '.') {
            s[pti(mp(cur.F, cur.S + 1))] = '*';
            m.pb(pti(mp(cur.F, cur.S + 1)));
            dfs(q + 1, s, m);
            s[pti(mp(cur.F, cur.S + 1))] = '.';
            m.pop_back();
        }
        if (cur.S - 1 >= 0 && s[pti(mp(cur.F, cur.S - 1))] == '.') {
            s[pti(mp(cur.F, cur.S - 1))] = '*';
            m.pb(pti(mp(cur.F, cur.S - 1)));
            dfs(q + 1, s, m);
            s[pti(mp(cur.F, cur.S - 1))] = '.';
            m.pop_back();
        }
    }
}
Example #14
0
int main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d%s",&cnt,str);
        int len=strlen(str);
        str[len]=',';str[len+1]='\0';
        v.clear();ans.clear();
        int m=0;
        for(int i=0;str[i];i++){
            if(str[i]==',')
                v.pb(m),m=0;
            else m=m*10+str[i]-'0';
        }
        sort(v.begin(),v.end());
        v.resize(unique(v.begin(),v.end())-v.begin());
        //for(int i=0;i<v.size();i++) cout<<v[i]<<endl;
        int l=v[0],r=v[0];
        for(int i=1;i<v.size();i++){
            if(v[i]==r+1) r=v[i];
            else{
                ans.pb(mp(l,r));
                l=v[i];r=v[i];
            }
        }
        ans.pb(mp(l,r));
        for(int i=0;i<ans.size();i++){
            if(ans[i].first==ans[i].second)
                printf("%d",ans[i].first);
            else
                printf("%d-%d",ans[i].first,ans[i].second);
            printf("%c",i==ans.size()-1?'\n':',');
        }
    }
    return 0;
}
Example #15
0
int main () {
    scanf(" %d %d", &n, &k);
    int neg = 0;
    for (int i = 0; i < n; i++) {
        int a;
        scanf(" %d", &v[i]);
        if (v[i] < 0) neg++;
    }
    if (neg > k) printf("-1\n");
    else {
        k -= neg;
        int l = -1;
        bool pos = false;
        for (int i = 0; i < n; i++) {
            if (v[i] < 0) {
                if (l == -1) l = i;
                else if (pos) {
                    gap.pb(pii(l, i));     
                    l = i;
                }
                pos = false;
            } else {
                pos = true;
            }
        }
        if (gap.size() > 0) {
            sort(gap.begin(), gap.end(), cmp);
            int len = gap[0].ss - gap[0].ff - 1;
            //printf("k %d len %d\n", k, len);
            for (int i = 0; i < gap.size() && len <= k; i++) {
                for (int j = gap[i].ff + 1; j < gap[i].ss; j++) 
                    v[j] = -1; 
                k -= len;
                if (i + 1 < gap.size()) len = gap[i + 1].ss - gap[i + 1].ff - 1;
            }
            if (l != -1 && n - l - 1 <= k) {
                for (int i = l + 1; i < n; i++) 
                    v[i] = -1;
            }
        }
        int cont = 0, temp = 1;
        for (int i = 0; i < n; i++) {
            //printf("%d ", v[i]);
            if (v[i] * temp < 0 || (v[i] * temp == 0 && (v[i] < 0 || temp < 0))) cont++;
            temp = v[i];
        }
        printf("%d\n", cont);
    }
}
Example #16
0
int main()
{
    int L,R,i,n,m,curL,curR;
    query Q;
    cin>>n>>m;
    for(i=0; i<n; i++) iin(arr[i]);
    for(i=0; i<m; i++)
    {
        iin(L);
        iin(R);
        Q.l=L-1;
        Q.r=R-1;
        Q.idx=i;
        vq.pb(Q);
    }
    block_size=sqrt(n)+1;
    sort(vq.begin(),vq.end());
    curL=0;
    curR=-1;
    cur_ans=0;
    for(i=0; i<m; i++)
    {
        L=vq[i].l;
        R=vq[i].r;
        while(curL<L)
        {
            remove(arr[curL]);
            curL++;
        }
        while(curL>L)
        {
            curL--;
            add(arr[curL]);
        }
        while(curR<R)
        {
            curR++;
            add(arr[curR]);
        }
        while(curR>R)
        {
            remove(arr[curR]);
            curR--;
        }
        ans[vq[i].idx]=cur_ans;
    }
    for(i=0; i<m; i++) printf("%lld\n",ans[i]);
    return 0;
}
void Dfs(int u) {
  for (int &j = h[u]; j != -1; j = ne[j]) {
    if (bad[j]) {
      continue;
    }

    int v = to[j];
    bad[j] = bad[j^1] = 1;
    Dfs(v);
    if (j == -1) {
      break;
    }
  }
  q.pb(u);
}
Example #18
0
void check(string s) {
    vector<string> tt;
    sort(ALL(s));
    // reverse(ALL(s));
    do {
        ll sum = 0;
        REP(i, sz(s)) sum += cal(s[i], i);
        // if(s=="GHOST")debug(sum)
        if (sum == n) tt.pb(s);
    } while (next_permutation(ALL(s)));
    if (sz(tt)) {
        sort(ALL(tt));
        ans.pb(tt[sz(tt) - 1]);
    }
}
Example #19
0
 int maxCities( int n, vector <int> a, vector <int> b, vector <int> len ) {
     for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) d[i][j]=(i==j?0:oo);
     for(int i=0; i<n-1; ++i) d[a[i]][b[i]]=d[b[i]][a[i]]=len[i];
     for(int k=1; k<=n; ++k)
         for(int i=1; i<=n; ++i)
             for(int j=1; j<=n; ++j)
                 d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
     int res = min(2,n);
     for(int i=1; i<=n; ++i) for(int j=i+1; j<=n; ++j){
         int dis = d[i][j];
         list.clear();
         list.pb(i); list.pb(j);
         for(int k=j+1; k<=n; ++k){
             bool ok=1;
             for(int x=0; x<sz(list); ++x) if(d[list[x]][k]!=dis){
                 ok=0;
                 break;
             }
             if(ok) list.pb(k);
         }
         res=max(res,sz(list));
     }
     return res;
 }
Example #20
0
void sieve(int n){
	int x=sqrt(n);
	int visited[x+10];
	memset(visited,0,sizeof visited);
	visited[1]=1;
	for(int i=2;i<=sqrt(x);i++){
		if(!visited[i]){
			for(int j=i*i;j<=x;j+=i)
				visited[j]=1;
		}
	}
	for(int i=2;i<=x;i++)
		if(!visited[i])
			primes.pb(i);
}
Example #21
0
int main() {
    int n, i, na, nb, nc;

    while( sc(n) && n ) { 
        va.clear();
        vb.clear();
        vc.clear();
        mapa.clear();

        for( i=0; i<n; i++ ) {
            sc3(na,nb,nc);
            if( na%3!=0 ) va.pb(na);
            if( nb%3!=0 ) vb.pb(nb);
            if( nc%3!=0 ) vc.pb(nc);
        }
        tamA = va.size();
        tamB = vb.size();
        tamC = vc.size();  

        pri(solve(0,0,0));
        
    }
    return 0;
}
Example #22
0
void sieve()
{
    for(int64 i = 0 ; i <= 10000 ; i++)
        check[i] = true;
    
    for(int64 i = 2 ; i <= 10000 ; i++)
    {
        if(check[i])
        {
            primes.pb(i);
            for(int64 j = i ; i*j <= 10000 ; j++)
                check[i*j] = false;
        }
    }
}
void init()
{
	arr.pb(-1);
	lld count=0,i,j;
	vector<lld> cop;
	cop.pb(-1);
	cop.pb(-1);
	for(i=2;i<=SIZE;i++)
		cop.pb(i);
	for(i=2;i<=SIZE;i++)
	{
		if(cop[i]!=-1)
		{
			if(i>=1000)
			{
				primes.insert(i);
				arr.pb(i);
			}
			for(j=2*i;j<=SIZE;j+=i)
				cop[j]=-1;
		}
	}
	adj=new vector<lld>[arr.size()];
}
Example #24
0
int main() {
	int i, j, k, x, h, t;
	scanf("%d%d%d", &n, &m, &p);
	for(i = 1; i <= n-1; i++) {
		scanf("%d", &x);
		d[i+1] = d[i] + x;
	}
	for(i = 1; i <= m; i++) {
		scanf("%d%d", &h, &t);
		a[i] = t - d[h];
	}
	sort(a+1, a+m+1);
	for(i = 1; i <= m; i++)
		sm[i] = sm[i-1] + a[i];
	for(i = 1; i <= m; i++) 
		dp[1][i] = (i - 1) * a[i] - sm[i-1];
	for(i = 2; i <= p; i++) {
		st.clear();
		st.pb(pii(-oo, 0));
		for(j = 1; j <= m; j++) {
			int l = 0, r = st.size() - 1;
			while(l < r) {
				int m = (l + r + 1) / 2;
				if(st[m].fst <= a[j]) l = m;
				else r = m - 1;
			}
			k = st[l].snd;
			dp[i][j] = a[j] * (j - k) - sm[j] + sm[k] + dp[i-1][k]; 
			while(!st.empty() && xcont(st.back().snd, j, i) <= st.back().fst)
				st.pop_back();
			st.pb(pii(xcont(st.back().snd, j, i), j));
		}
	}
	cout << dp[p][m] << endl;
	return 0;
}
void PERM(int start)
{
    if(res.size()==k)
    {
        PRINT("", 0, 0);
        return;
    }
    if(start==full) return;
    for(int i = 0; i<full; i++)
    {
        res.pb(i);
        PERM(i+1);
        res.pop_back();
    }
}
Example #26
0
int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	for (int i = 0; i < n; i++)
	{
		int j = min_element(a + i, a + n) - a;
		ans.pb(mp(i, j));
		swap(a[i], a[j]);
	}
	cout << (int)(ans.size()) << '\n';
	for (int i = 0; i < (int)ans.size(); i++)
		cout << ans[i].f << " " << ans[i].s << '\n';
}
Example #27
0
bool f(int k)
{
	int d = A[k].F, p = B[k].F;
	int D = A[k].S, P = B[k].S;
	int i = 0, j = 0;
	ll S = 0;
	y.clear();
	//printf("k:%d D:(%d %d$) P:(%d %d$)\n", k, D, d, P, p);
	while ((int)y.size() < K && (i < (int)x[1].size() || j < (int)x[2].size()))
	{
		//printf(I64 " vs " I64, x[1][i].F * 1ll * d, x[2][j].F * 1ll * p);
		if (j == int(x[2].size()) ||( i < int(x[1].size()) && x[1][i].F * 1ll * d < x[2][j].F * 1ll * p))
		{
			S += x[1][i].F * 1ll * d;
			y.pb(mp(x[1][i++].S, D));
		}
		else
		{
			S += x[2][j].F * 1ll * p;
			y.pb(mp(x[2][j++].S, P));
		}
		//printf("(%d %d)\n", y.back().F, y.back().S);
		if (S > s)
		{
			//puts("-");
			return 0;
		}
		if ((int)y.size() >= K)
		{
			//puts("+");
			return 1;
		}
	}
	//puts("-");
	return 0;
}
Example #28
0
void generate_divisor(int idx, ll num)
{
    if(idx>=SZ(prime_factor))
    {
        divisors.pb(num);
        return;
    }
    ll next=prime_factor[idx].ff;
    for(int i=0;i<prime_factor[idx].ss;i++)
    {
        generate_divisor(idx+1,num*next);
        next*=prime_factor[idx].ff;
    }
    generate_divisor(idx+1,num);
}
Example #29
0
int main () {
	int t;
	cin >> t;
	while(t--){
		N.clear();
		S.clear();
		cin >> n;
		for(int i = 0; i < n; ++i){
			string a, b;
			int v;
			cin >> a >> b >> v;
			N.pb(A(a,b,v));
		}
		cin >> m;
		for(int i = 0; i < m; ++i){
			string a, b;
			int v;
			cin >> a >> b >> v; 
			S.pb(A(a,b,v));
		}
		for(int i = 1; i <= m; ++i) bit[i] = mp(0,0);
		for(int i = 0; i < n; ++i){
			for(int j = m-1; j >= 0; --j){
				A& e = S[j];
				if(e.y == N[i].y){
					PII tmp = query(j-1);
					tmp.ff += N[i].v + e.v;
					--tmp.ss;
					update(j, tmp);
				}
			}
		}		
		PII ans = query(m-1);
		cout << ans.ff << ' ' << -ans.ss <<endl;
	}
}
Example #30
0
void SlidingWindowMax(int N,int K)
{
    //N=number of elements.
    //K=windows size.
    MaxValu.clear();
    head=0;tail=0;
    for(int i=1;i<=N;i++)
    {
        while(head!=tail && Q[head]<=i-K) head++;// Cheack window size.
        while(head!=tail && store[Q[tail-1]]<=store[i]) tail--; // truncate the previous smaller value.
        Q[tail++]=i; // insert new elements.
        if(i>=K) MaxValu.pb(store[Q[head]]); // store valu aeach posirion of window.
    }
    return;
}