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)其 ...
随机推荐
- SSM框架-SpringMVC 实例文件上传下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- 了解MQ
一.了解RocketMQ? rocketMQ是阿里开源的一款十分优秀的消息队列,rocketMQ具有很多其他消息队列不具有的特性,更重要的是rocketMQ是用java开发的学习成本较低,并且经历了双 ...
- 加快cin读取速度
cin在读取大量数据时会比C里的scanf慢很多,但这并不是cin"无能",而是C++为了兼容C,对cin做了scanf的同步,只要关闭这个同步,cin就会有不弱于scanf的速度 ...
- Python全栈-day11-函数3
装饰器 1.开放封闭原则 通常情况下,软件一旦上线就应该遵循开放封闭原则,即对修改封闭.对扩展开放 扩展开放需遵循两个原则: 1)不修改源代码 2)不修改原函数的调用方式 2.装饰器 器指的是工具,装 ...
- sitecore系统教程之内容创作入门
在Sitecore中,有两种编辑工具,您可以在其中创建和编辑网站上的内容: 内容编辑器 - 专为熟悉Sitecore及其包含的功能的经验丰富的内容作者而设计的应用程序. 体验编辑器 - 一种直观的编辑 ...
- python二 总结--函数-- 装饰器
装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码 ...
- mysql 问题:wait_timeout
1,show global variables like 'wait_timeout'; 查询'wait_timeout' 默认是8天即28800秒 2,修改 windows 安装目录下的my.ini ...
- Linux基础命令---显示树形进程pstree
pstree pstree显示正在运行的进程的树形结构,树以PID为根:如果省略了pid则以init为根.如果指定了用户名,则显示根植于该用户拥有的进程的所有进程树.如果pstree被调用为pstre ...
- Codeforce 835B - The number on the board (贪心)
Some natural number was written on the board. Its sum of digits was not less than k. But you were di ...
- Python进阶【第七篇】文件处理
一.文件操作 在Python中,文件读写是最常见的操作.对文件的操作为: #1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默 ...