第一题

题意:给定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的更多相关文章

  1. 【比赛】百度之星2017 初赛Round A

    第一题 题意:给定多组数据P,每次询问P进制下,有多少数字B满足条件:只要数位之和是B的倍数,该数字就是B的倍数. 题解:此题是参考10进制下3和9倍数的特殊性质. 对于10进制,ab=10*a+b= ...

  2. 百度之星2017初赛A-1005-今夕何夕

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. 百度之星2017初赛A轮 1001 小C的倍数问题

    小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...

  4. 百度之星2017初赛A-1006-度度熊的01世界

    度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...

  5. 百度之星2017初赛A

    雪崩,没晋级,补题 1001 分析:求n-1的约数个数 #include "iostream" #include "cstdio" #include " ...

  6. 百度之星2017初赛B1006 小小粉丝度度熊

    思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...

  7. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  8. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  9. HDU - 6383 百度之星2018初赛B 1004 p1m2(二分答案)

    p1m2  Accepts: 1003  Submissions: 4595  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072 ...

随机推荐

  1. js学习日记-new Object和Object.create到底干了啥

    function Car () { this.color = "red"; } Car.prototype.sayHi=function(){ console.log('你好') ...

  2. lessJs

    lessJs下载地址 ======== 简介 lessJs主要提供页面切换,页面管理的一个框架:less-ui.css 和 less-ui.js 是独立于less.js的,他们提供的是一组ui,包括消 ...

  3. CTS测试笔记

    电脑安装12.4乌班图系统 更新源 (1) 打开ubuntu software center (2) 电脑左上角选择edit→software sources…→点击download from,选择o ...

  4. Sleuth+Zipkin+Log

    https://blog.csdn.net/sqzhao/article/details/70568637 https://blog.csdn.net/yejingtao703/article/det ...

  5. java 生成简单word(利用Itext工具),生成简单Excel,以及下载笔记

    1.java 生成简单word(包含图片表格) pom中加入itext 相关依赖 <dependency> <groupId>com.lowagie</groupId&g ...

  6. word2vec是如何工作的?

    如何有效的将文本向量化是自然语言处理(Natural Language Processing: NLP)领域非常重要的一个研究方向.传统的文本向量化可以用独热编码(one-hot encoding). ...

  7. Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列

    题意概述: 给出一个长度为N的序列和M组询问,问假设把某个位置的值改成另一个给出的值之后,序列的最长上升子序列的长度. N,M<=400000. 分析: 考虑某个位置的值改动后这个位置和最长上升 ...

  8. HDU 3696 Farm Game(拓扑+DP)(2010 Asia Fuzhou Regional Contest)

    Description “Farm Game” is one of the most popular games in online community. In the community each ...

  9. 【iOS开发】动态添加子视图 UIView 的正确方法

    很多时候哥比较喜欢用代码添加视图,特别是要同时加很多UIView时,而且跟 xib 比起来代码更容易管理,在多人的项目中代码不容易 conflict. 但小牛哥最近发现很多新人都不太清楚正确的使用方法 ...

  10. SQL SERVER 时间相关操作笔记

    1.DATEADD函数: A.  MSDN上的示例:http://msdn.microsoft.com/zh-cn/library/ms186819%28v=sql.90%29.aspx