第一题

题意:给定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. 每天一个Linux命令(12):su命令

    su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码. 语法: su(选项)(参数) 选项: -c<指令>或--command=<指令>:执行完指定 ...

  2. Selenium PageFactory页面工厂

    使用Selenium PageFactory页面工厂的好处是: 当页面元素的位置发生变化时, 我们只需要去修改id或者xpath, 而不用去修改测试用例. import org.openqa.sele ...

  3. bam文件测序深度统计-bamdst

    最近接触的数据都是靶向测序,或者全外测序的数据.对数据的覆盖深度及靶向捕获效率的评估成为了数据质量监控中必不可少的一环. 以前都是用samtools depth 算出单碱基的深度后,用perl来进行深 ...

  4. 爬取图片过程遇到的ValueError: Missing scheme in request url: h 报错与解决方法

    一 .scrapy整体框架 1.1 scrapy框架图 1.2 scrapy框架各结构解析 item:保存抓取的内容 spider:定义抓取内容的规则,也是我们主要编辑的文件 pipelines:管道 ...

  5. LINQ学习笔记——(3)基本查询操作符

    Select() 作用于uIEnumerable<TSource>类型 public static void Test() { List<string> persons = n ...

  6. LeetCode 29——两数相除

    1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...

  7. LeetCode 19——删除链表的倒数第 N 个节点

    1. 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...

  8. C++STL——队列

    一.相关定义 原理:queue 队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(First In First Out)表. 队头&队尾:插入 ...

  9. Mybatis学习系列(六)延迟加载

    延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机.在Mybatis中经常用到关联查询,但是并不是任何时候都需要立即返回关联查询结果.比如查询订单信息,并不一定需要及时返回订单对应的产品信 ...

  10. Win10 1803安装Ubuntu1804子系统

    1.win10应用商店选择Ubuntu1804安装 点击打开会提示https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 2.用管理员po ...