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)其 ...
随机推荐
- Minecraft 1.8.9 FML Mod 开发教程
Mod开发教程 https://fmltutor.ustc-zzzz.net/
- idea软件上设置爱彼迎字体
- 事件响应模型(游戏引擎、JAVA中等应用)
事件,我们在生活中时时在产生事件并且做出响应,如早晨出门时,看见外面下雨了,这时候我们需要带把伞等情况! 在现实生活之中事件分为人为事件和自然事件,那么在计算机操作系统中也不例外,存在两种事件 1.人 ...
- 使用淘宝npm镜像
我们都知道淘宝大量采用了Nodej技术,所以它的镜像还是值得肯定的!更多相关可查看:淘宝NPM镜像 npm的官方镜像在国内访问是比较慢的,所以替代方法是使用淘宝npm镜像! 淘宝 NPM 镜像是一个完 ...
- Django admin模块无法调用css样式文件
在使用Django Admin开发时,发现admin模块css样式文件丢失,无法调用,使火狐浏览器提示: 此 URL 的资源不是文本: http://127.0.0.1:8000/statics/ad ...
- 文件、文件夹操作(I)
遍历一个目录下的所有文件 首先我们获取用户文档目录路径 let manager = FileManager.default let urlForDocument = manager.urls(for: ...
- Spring源码阅读(八)
摘要: 本文首先将举例说明如何使用BeanWrapper,然后根据例子中的结果分析BeanWrapper的源码.由于在spring中BeanWrapperImpl是BeanWrapper接口的唯一实现 ...
- php Allocator Jemalloc TCMalloc那个内存分配器比较好?
php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...
- 51Nod 1433 0和5
小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前 ...
- Android开发常见错误汇总
[错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requireme ...