【比赛】百度之星2017 初赛Round B
第一题
题意:给定n*m网络,定义两个棋子在同行同列则相互攻击,同时要求两个棋子的行和列不能一小一大,求满足条件的最大摆放的方案数。
题解:ans=C(max(n,m),min(n,m)),就是在max中取min个数字的组合,组合内排序构成一种方案。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,MOD=;
void gcd(ll a,ll b,ll& d,ll& x,ll& y)
{
if(!b){d=a;x=;y=;}
else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
ll inv(ll a,ll n)
{
ll d,x,y;
gcd(a,n,d,x,y);
return (x%n+n)%n;
}
ll n,fac[],fav[]; int main()
{
ll T,n,m;
scanf("%lld",&T);
fac[]=;fav[]=;
for(int i=;i<=;i++)fac[i]=fac[i-]*i%MOD;
for(int i=;i<=;i++)fav[i]=inv(fac[i],MOD);
for(int i=;i<=T;i++){
scanf("%lld%lld",&n,&m);
int mins=min(n,m);
int maxs=max(n,m);
printf("%lld\n",fac[maxs]*fav[mins]%MOD*fav[maxs-mins]%MOD);
}
return ;
}
第二题
第三题
第四题
第五题
最小费用流(不要求最大流),不用拆点,S向每个点连边生产,每个点向T连边销售,点与点之间连无向边运输。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=;
struct edge{int from,v,flow,cost;}e[];
int n,m,first[maxn],d[maxn],cur[maxn],ans,S,T,tot=,q[];
bool vis[maxn];
void insert(int u,int v,int flow,int cost)
{
tot++;e[tot].v=v;e[tot].flow=flow;e[tot].cost=cost;e[tot].from=first[u];first[u]=tot;
tot++;e[tot].v=u;e[tot].flow=;e[tot].cost=-cost;e[tot].from=first[v];first[v]=tot;
}
bool spfa()
{
memset(vis,,sizeof(vis));
memset(d,0x3f,sizeof(d));
int head=,tail=;q[]=T;vis[T]=;d[T]=;
while(head!=tail)
{
int x=q[head++];if(head>)head=;
for(int i=first[x];i;i=e[i].from)
if(e[i^].flow&&d[x]+e[i^].cost<d[e[i].v])
{
int y=e[i].v;
d[y]=d[x]+e[i^].cost;
if(!vis[y])
{
if(d[y]<d[q[head]]){head--;if(head<)head=;q[head]=y;}
else{q[tail++]=y;if(tail>)tail=;}
vis[y]=;
}
}
vis[x]=;
}
return d[S]<;
}
int dfs(int x,int a)
{
if(x==T||a==)return a;
vis[x]=;
int flow=,f;
for(int& i=cur[x];i;i=e[i].from)
if(!vis[e[i].v]&&d[x]==e[i].cost+d[e[i].v]&&(f=dfs(e[i].v,min(a,e[i].flow)))>)
{
e[i].flow-=f;
e[i^].flow+=f;
ans+=e[i].cost*f;
flow+=f;
a-=f;
if(a==)break;
}
vis[x]=;
return flow;
}
int main()
{
while(scanf("%d%d",&n,&m)==){
S=;T=n+;
int a1,b1,c1,d1,u1,v1,k1;
tot=;
memset(first,,sizeof(first));
for(int i=;i<=n;i++){
a1=read();b1=read();c1=read();d1=read();
insert(S,i,b1,a1);
insert(i,T,d1,-c1);
}
for(int i=;i<=m;i++){
u1=read();v1=read();k1=read();
if(u1==v1)continue;
insert(u1,v1,inf,k1);
insert(v1,u1,inf,k1);
}
ans=;
memset(vis,,sizeof(vis));
while(spfa())
{
for(int i=S;i<=T;i++)cur[i]=first[i];
dfs(S,inf);
}
printf("%d\n",-ans);
}
return ;
}
第六题
题意:在无限的数轴上,给定n个区间,补充m个点使最长连续区间最长。n<=10^5。
题解:
区间左闭右开的好处:区间内距离和区间间距离直接计算,两区间左右端点重合就紧贴。
经典区间交问题:左闭右开,按左端点排序,分类讨论三种情况:
1.右端点<=R,包含。
2.右端点>R,左端点<=R,相交。
3.右端点>R,左端点>R,不相交。
(另一种思路,左+1右-1,排序后前缀和为0时加入一个区间。)
处理成若干个独立区间后,对于每个l计算出能延伸出最远的r,经典的双指针位移问题,多余的补充点直接加入答案。
双指针位移:for左端点,每次扩展右端点到极限。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=; int n,m;
struct cyc{int l,r;}a[maxn],b[maxn]; bool cmp(cyc a,cyc b){return a.l<b.l;} int main(){
while(scanf("%d%d",&n,&m)==){
for(int i=;i<=n;i++){scanf("%d%d",&a[i].l,&a[i].r);a[i].r++;}
sort(a+,a+n+,cmp);
int L=a[].l,R=a[].r,tot=;
for(int i=;i<=n;i++){
if(a[i].r<=R)continue;
if(a[i].r>R&&a[i].l<=R)R=a[i].r;
else{b[++tot]=(cyc){L,R};L=a[i].l;R=a[i].r;}
}
b[++tot]=(cyc){L,R};
n=tot;
int j=,leave=m,ans=;
for(int i=;i<=n;i++){
while(j+<=n&&leave-(b[j+].l-b[j].r)>=){
leave-=b[j+].l-b[j].r;
j++;
}
ans=max(ans,b[j].r-b[i].l+leave);
leave+=b[i+].l-b[i].r;
if(i==j){j=i+;leave=m;}
}
printf("%d\n",ans);
}
return ;
}
PS:进复赛啦>w<!
【比赛】百度之星2017 初赛Round B的更多相关文章
- 【比赛】百度之星2017 初赛Round A
第一题 题意:给定多组数据P,每次询问P进制下,有多少数字B满足条件:只要数位之和是B的倍数,该数字就是B的倍数. 题解:此题是参考10进制下3和9倍数的特殊性质. 对于10进制,ab=10*a+b= ...
- 百度之星2017初赛A-1005-今夕何夕
今夕何夕 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 百度之星2017初赛A轮 1001 小C的倍数问题
小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- 百度之星2017初赛A-1006-度度熊的01世界
度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- 百度之星2017初赛A
雪崩,没晋级,补题 1001 分析:求n-1的约数个数 #include "iostream" #include "cstdio" #include " ...
- 百度之星2017初赛B1006 小小粉丝度度熊
思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...
- 【百度之星2014~初赛(第二轮)解题报告】Chess
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- HDU - 6383 百度之星2018初赛B 1004 p1m2(二分答案)
p1m2 Accepts: 1003 Submissions: 4595 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072 ...
随机推荐
- bug单的提交
顶头信息 所属产品,所属项目,所属模块,影响版本,当前指派,bug类型:代码错误,界面优化,设计缺陷,性能问题,标准规范,其他,安全相关.bug标题,严重程度,优先级 缺陷描述 bug描述,预置条件, ...
- python3 安装win32clipboard 和 win32con 报No matching distribution found for win32con错误
win32con.win32clipboad不能用pip install 安装,也不能够查找到这个包,原来,这个是pypiwin32的一部分,直接安装pypiwin32就可以了 pip install ...
- python 网络编程(远程执行命令与粘包)
远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subpro ...
- 最短路径——Dijkstra算法
一.相关定义 最短路径:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径. 地位:Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据 ...
- 【iOS开发】iOS对UIViewController生命周期和属性方法的解析
iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...
- 【EasyNetQ】- 多态发布和订阅
您可以订阅接口,然后发布该接口的实现. 我们来看一个例子.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name { get ...
- Java的sql语句 写关键字不需要添加单引号
Java的sql语句 写关键字不需要添加单引号
- 【bzoj2733】[HNOI2012]永无乡 Treap启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- 2017 Multi-University Training Contest - Team 2 Puzzle
题目大意: 给定n, m, p.然后按照一个规则往n*m的方格里填数,最后一个方格是空格,然后玩拼图游戏,问能否复原 规则是:把1~n*m-1的排列中的第1,p+1,2*p+1.....个数依次取出来 ...
- WPS是个坑
WPS2016 10.1.0.5740 存储的EXCEL表格文件,用PHP mime_content_type函数获取到的mime类型是“application/zip”