topcoder srm 699 div1 -3
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的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- 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)其 ...
随机推荐
- Hive自定义函数UDF和UDTF
UDF(user defined functions) 用于处理单行数据,并生成单个数据行. PS: l 一个普通UDF必须继承自“org.apache.hadoop.hive.ql.exec.UDF ...
- VS.C#如何向数据数据库中存入和读取图片的
写入图片部分代码:假设图片为 test.gifbyte [] bytes = File.ReadAllBytes(@"c:\test.gif");SqlConnection con ...
- c# mongo 数组里对象更新
var queryDetail = new BsonDocument("cNo", doc.cNo); queryDetail.AddRan ...
- KL距离,Kullback-Leibler Divergence
http://www.cnblogs.com/ywl925/p/3554502.html http://www.cnblogs.com/hxsyl/p/4910218.html http://blog ...
- 【Hadoop学习之十】MapReduce案例分析二-好友推荐
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 最应该推荐的好友TopN,如何排名 ...
- kalinux 五笔安装
1.输入命令 sudo apt-get install fcitx-table-wubi 2.配置,找到这个fcitx配置,运行,把五笔调到第2个 3.reboot重启系统
- 直流-直流(DC-DC)变换电路_BUCK&BOOST变换电路
1. 直流—直流变换器通过对电力电子器件的通断控制,将直流电压断续地加到负载上,通过改变占空比改变输出电压平均值. BUCK线路原理图如上,其中Q管/MOS作为开关管,驱动电压一般为PWM. 当开关管 ...
- OpenVPN 服务端(pritunl)的一些运维经验
1.当服务端部署在docker中,重启机器之后,docker服务会启动,pritunl的docker容器也会跟着自动启动.但此时,一些系统服务还未完全启动成功,导致会有一些pritunl server ...
- JDK8的新特性
- 把object转成JSONObject JSON.toJSON
把object转成JSONObject JSON.toJSON public void onNext(Object o) { LogUtil.i("getFavorites", & ...