1、两个长度为$n$的数组$a,b$,$0 \leq a_{i} <2^{30}$。$b_{i}=-1$或者$b_{i}$为除$a_{i}$外其他数字的抑或值。现在给定$b$,如果不存在$a$,返回-1.否则输出$a$数组所有数字和的最小值。

思路:一位一位考虑。当前考虑第$k$位。对于所有不知道的数字将它们看做一个数字0或者1。现在就是一个全是01的数组$c$,那么$c_{i}$^$c_{j}$=$A_{i}$^$A_{j}$。其中$A_{i}=(a_{i}$>>$k)$&1.然后假定$A_{0}=$0或者1进行判断即可。

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <assert.h>
using namespace std; const int N=44; int n;
vector<pair<int,int> > g[N]; int a[N],m;
int b[N];
int c[N]; int dfs(int t)
{
for(int i=0;i<(int)g[t].size();++i)
{
int v=g[t][i].first;
int w=g[t][i].second;
if(b[v]==-1)
{
b[v]=w^b[t];
if(!dfs(v)) return 0;
}
else if(b[v]!=(w^b[t])) return 0;
}
return 1;
} int get()
{
for(int i=0;i<m;++i) g[i].clear();
for(int i=0;i<m;++i) {
for(int j=i+1;j<m;++j) {
g[i].push_back(make_pair(j,a[i]^a[j]));
g[j].push_back(make_pair(i,a[i]^a[j]));
}
}
int ans=m+1;
for(int i=0;i<2;++i)
{
memset(b,-1,sizeof(b));
b[0]=i;
if(!dfs(0)) return -1;
int all=0;
for(int i=0;i<m;++i) all^=b[i]; int ok=1; for(int i=0;i<m&&ok;++i)
{
if(a[i]!=(all^b[i])) ok=0;
}
if(!ok) continue; int tmp=0;
for(int i=0;i<m;++i) tmp+=b[i];
if(ans>tmp) ans=tmp;
}
if(ans==m+1) ans=-1;
return ans;
} int cal()
{
m=0;
int k=0;
for(int i=0;i<n;++i)
{
if(c[i]==-1) k=1;
else a[m++]=c[i];
}
if(k)
{
++m;
a[m-1]=0;
int p0=get();
a[m-1]=1;
int p1=get();
if(p0==-1)
{
if(p1==-1) return -1;
return p1;
}
else
{
if(p1==-1) return p0;
return min(p0,p1);
}
}
else
{
return get();
}
} class OthersXor
{
public:
long long minSum(vector<int> x)
{
n=(int)x.size();
long long sum=0;
for(int i=0;i<30;++i)
{
for(int j=0;j<n;++j)
{
if(x[j]==-1) c[j]=-1;
else c[j]=(x[j]>>i)&1;
}
int p=cal();
if(p==-1) return -1;
sum+=(1ll<<i)*p;
}
return sum;
}
};

  

2、一个$N$个节点的有向图。给出$m$个数对$(a_{0},b_{0}),(a_{1},b_{1})...(a_{m-1},b_{m-1})$。两个节点$X,Y$有边当且仅当存在一个数对$(a_{i},b_{i})$使得$a_{i}$可整除$X$且$b_{i}$可整除$Y$。给定起点$s$终点$t$,求最短路。

思路:将数对看做节点。第$i$个节点可以向第$j$个节点连边当且仅当$lcm(b_{i},a_{j})\leq N$。

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <assert.h>
using namespace std; vector<int> g[1005];
int n;
int s,t; queue<int> Q;
int f[1005]; int bfs()
{
memset(f,-1,sizeof(f));
f[0]=0;
Q.push(0);
while(!Q.empty())
{
int u=Q.front(); Q.pop();
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
if(f[v]==-1)
{
f[v]=f[u]+1;
Q.push(v);
}
}
}
if(f[t]!=-1) return f[t]-1;
return f[t];
} int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
} class FromToDivisible
{
public:
int shortest(int N,int S,int T,vector<int> a,vector<int> b)
{
n=(int)a.size();
s=0;
t=n+1;
for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(i!=j)
{
long long tmp=1ll*b[i]/gcd(b[i],a[j])*a[j];
if(tmp<=N)
{
g[i+1].push_back(j+1);
}
}
for(int i=0;i<n;++i)
{
if(S%a[i]==0) g[0].push_back(i+1);
if(T%b[i]==0) g[i+1].push_back(t);
}
return bfs();
}
};

  

topcoder srm 699 div1 -3的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. Lambda表达式语法2

    package airycode_java8.nice3; import airycode_java8.nice1.Employee; import org.junit.Test; import ja ...

  2. laravel orm

    ###多对多关系 多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了. 我们定义两个模型:Article 和 Tag,分别表示文章和标签,他们是多对多的关系. ...

  3. caffe中通过prototxt文件查看神经网络模型结构的方法

    在修改propotxt之前我们可以对之前的网络结构进行一个直观的认识: 可以使用http://ethereon.github.io/netscope/#/editor 这个网址. 将propotxt文 ...

  4. 十二 总结JS原型

    基本概念: 对象:属性和方法的集合(变量和函数的封装). 构造器函数:用于创建对象的函数,通过new关键字生成对象.函数名一般首字母大写的. 原型对象:每个函数都有一个prototype属性,它是一个 ...

  5. JavaScript--将秒数换算成时分秒

    getTime()  返回距 1970 年 1 月 1 日之间的毫秒数 new Date(dateString) 定义 Date 对象的一种方式 <!DOCTYPE html> <h ...

  6. UITableView 的坑

    1.cell的view和contentView的区别 1.1 addSubView UITableViewCell实例上添加子视图,有两种方式:[cell addSubview:view]或[cell ...

  7. 文件缓冲区在fork后复制

    场景:父进程trace进程A,当A进程fork子进程B时,让父进程也fork子进程去trace子进程B,用于trace的进程将被trace的进程发生的系统调用号通过fprintf存入各自文件中 问题: ...

  8. JustOj 1910: 人见人爱A+B

    [提交][状态][讨论版] 题目描述 北大的acm上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱.   ...

  9. 一起学习在 Ubuntu 上授予和移除 sudo 权限

    如你所知,用户可以在 Ubuntu 系统上使用 sudo 权限执行任何管理任务.在 Linux 机器上创建新用户时,他们无法执行任何管理任务,直到你将其加入 sudo 组的成员.在这个简短的教程中,我 ...

  10. MySql安装和基本管理

    一.什么是数据库? mysql就是一个基于socket编写的C/S架构的软件 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流 ...