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. c#Stream学习笔记

    C# 温故而知新:Stream篇(—) http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html 基本概念重点看这一篇. 什么 ...

  2. Rest概念学习

    参考文章 http://www.cnblogs.com/shanyou/archive/2012/05/12/2496959.html http://www.cnblogs.com/loveis715 ...

  3. java中的锁之AbstractQueuedSynchronizer源码分析(一)

    一.AbstractQueuedSynchronizer类介绍. 该抽象类有两个内部类,分别是静态不可继承的Node类和公有的ConditionObject类.AbstractQueuedSynchr ...

  4. wordpress学习(四)---url伪静态简单了解

    在page-url.php页面做测试 <h2>url伪静态</h2> 接收到的pagename参数是:<? echo $wp_query->query_vars[' ...

  5. Python2.6 升级2.7

    一. Centos6 默认为python2.6且不可卸载(因为Centos6深度依赖Python),要想升级为2.7 只能通过全新升级 操作如下: 1.下载 Python2.7 网址 https:// ...

  6. jQuery安装

    http://www.runoob.com/jquery/jquery-install.html 网页中添加jQuery: 方法一:可以从http://jquery.com/download/ 下载j ...

  7. 【转】LoadRunner压力测试:测试报告结果分析

    见:https://blog.csdn.net/haoui123/article/details/62036723

  8. JavaScript--常用的输出方式

       1.alert("要输出的内容"); 在浏览器中弹出一个对话框,然后把要输出的内容展示出来    2.document.write("要输出的内容");  ...

  9. Python大神成长之路: 第二次学习记录

    数据类型          数据操作 bytes 类型 "".encode() 编码-->二进制 "".decode() 解码 判断字符串里的字符是否全为 ...

  10. jack welch:“你们知道了,但是我们做到了”

    一.我们发现,只要我们敢于相信自己,敢于朝着那些看似不可能的目标不懈努力,最终会如愿以偿,个人的领袖形象也将因此而确立. 二.一个领导者必须要有魄力.对我来说,这就是一个人能否领导一项业务的分水岭. ...