T1 Mobitel

题目大意:

一个全是正整数的矩阵,求从左上角到右下角的简单路径有多少条路径上数的乘积$>=K$

思路:

由于整数分块,我们设$f(i,j,k)$表示走到$(i,j)$,$k=K/$(路径上数的乘积),的方案数

然后转移还是正常转移,需要注意把$k--$,因为只能求$>k-1$

 #include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define rep(i,s,t) for(register int i=(s),i##end=(t);i<=i##end;++i)
#define dwn(i,s,t) for(register int i=(s),i##end=(t);i>=i##end;--i)
#define ren for(int i=fst[x];i;i=nxt[i])
#define ll long long
#define MAXN 305
#define MOD 1000000007
#define pls(a,b) ((a)+(b))%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,g[MAXN][MAXN],val[],id[];int k;
int f[][MAXN][MAXN*],tot;
void inc(int &x,int y) {x= (x+y>=MOD)?x+y-MOD:x+y;}
int main()
{
freopen("mobitel.in","r",stdin);freopen("mobitel.out","w",stdout);
n=read(),m=read(),k=read()-;rep(i,,n) rep(j,,m) g[i][j]=read();int c,pos;
rep(i,,k) pos=k/(k/i),val[++tot]=k/i,i=pos;++tot;rep(i,,tot) id[val[i]]=i;
f[][][id[k/g[][]]]=;rep(t,,n)
{
c=t&;rep(i,,m)
rep(j,,tot) {inc(f[c][i][id[val[j]/g[t][i]]],f[!c][i][j]);
if(i<m) inc(f[c][i+][id[val[j]/g[t][i+]]],f[c][i][j]);}
memset(f[!c],,sizeof(f[!c]));
}
printf("%d\n",f[n&][m][tot]);
}

T2 transport

题目大意:

一个树上,每个点有权值,边权有权值

求有多少对点对满足对于这条路径任意一个前缀都满足点的权值和>边的权值和

思路:

很明显的点分治,对每个分治重心

搜出每一条从重心开始的链需要之前盈余多少权值才能走到,搜出每一条能走到重心的链到根后盈余多少

(第一个分别记录$dis$的最低值,第二个记录最小的一个后缀判断能否走到

排序后双指针,然后容斥一下即可

 #include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define rep(i,s,t) for(register int i=(s),i##end=(t);i<=i##end;++i)
#define dwn(i,s,t) for(register int i=(s),i##end=(t);i>=i##end;--i)
#define ren for(int i=fst[x];i;i=nxt[i])
#define ll long long
#define inf 2139062143
#define MAXN 100100
#define MOD 1000000007
#define pls(a,b) ((a)+(b))%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,v[MAXN],fst[MAXN],nxt[MAXN<<],to[MAXN<<],val[MAXN<<];
int mx[MAXN],sz[MAXN],Sum,rt,Mx,vis[MAXN],cnt;
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void getrt(int x,int pa)
{
mx[x]=,sz[x]=;ren if(to[i]^pa&&!vis[to[i]])
getrt(to[i],x),sz[x]+=sz[to[i]],mx[x]=max(mx[x],sz[to[i]]);
mx[x]=max(mx[x],Sum-sz[x]);if(mx[x]<Mx) Mx=mx[x],rt=x;
}
ll g[MAXN],f[MAXN],ans;int ln,len;
void get1(int x,int pa,ll mn,ll dis)
{
g[++len]=mn,dis+=v[x];ren if(to[i]^pa&&!vis[to[i]])
get1(to[i],x,min(dis-val[i],mn),dis-val[i]);
}
void get2(int x,int pa,ll mx,ll dis)
{
if(v[x]-mx>=) f[++ln]=v[x]+dis;mx-=v[x],dis+=v[x];ren if(to[i]^pa&&!vis[to[i]])
get2(to[i],x,max((ll)val[i],mx+val[i]),dis-val[i]);
}
void calc(int x,int w,ll res=)
{
int tmp=,pos=ln;sort(g+,g+len+);sort(f+,f+ln+);
rep(i,,len) {while(pos&&g[i]+f[pos]>=) tmp++,pos--;res+=tmp;}ans+=res*w;
}
void div(int x)
{
vis[x]=;ln=len=;get1(x,,,);get2(x,,,-v[x]);
calc(x,);ans--;ren if(!vis[to[i]])
{
ln=len=;get1(to[i],x,v[x]-val[i],v[x]-val[i]);
get2(to[i],x,val[i],-val[i]);calc(to[i],-);
}
ren if(!vis[to[i]]) {Sum=sz[to[i]],Mx=n+;getrt(to[i],x);div(rt);}
}
int main()
{
freopen("transport.in","r",stdin);freopen("transport.out","w",stdout);
n=read();int a,b,c;rep(i,,n) v[i]=read();
rep(i,,n) a=read(),b=read(),c=read(),add(a,b,c),add(b,a,c);
Sum=n,Mx=n+;getrt(,);div(rt);printf("%lld\n",ans);
}

T3

题目大意:

$n$个1,要分成$k$段,每一段$[l,r]$的贡献为$\frac{r-l+1}{n-l+1}$,求最大贡献

思路:

这种恰好$k$段的可以二分

每一次分段都加上一个二分出来的这个值,判断最优的段数与$k$的关系来二分

转移的方程是$f_i=f_j+\frac{i-j}{n-j}+mid$ 是一个斜率优化的式子

然后就结束了

 #include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define rep(i,s,t) for(register int i=(s),i##end=(t);i<=i##end;++i)
#define dwn(i,s,t) for(register int i=(s),i##end=(t);i>=i##end;--i)
#define ren for(int i=fst[x];i;i=nxt[i])
#define ll long long
#define db double
#define MAXN 100100
#define pls(a,b) ((a)+(b))%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,k,pre[MAXN],nxt[MAXN],tm[MAXN],tl,hd,q[MAXN];db f[MAXN];
db Y(int i,int j) {return f[i]-f[j]-1.0*i/(n-i)+1.0*j/(n-j);}
db X(int i,int j) {return 1.0/(n-i)-1.0/(n-j);}
int cheq(db x)
{
memset(f,,sizeof(f));q[hd=tl=]=;int t;rep(i,,n)
{
while(hd<tl&&Y(q[hd],q[hd+])<=-i*X(q[hd],q[hd+])) hd++;
t=pre[i]=q[hd],f[i]=f[t]+1.0*(i-t)/(n-t)-x,tm[i]=tm[t]+,pre[i]=t;
while(hd<tl&&Y(q[tl-],q[tl])*X(q[tl],i)<Y(q[tl],i)*X(q[tl-],q[tl])) tl--;
q[++tl]=i;
}return tm[n];
}
int main()
{
freopen("quiz.in","r",stdin);freopen("quiz.out","w",stdout);
n=read(),k=read();db l=,r=,mid;
for(int t=,tmp;mid=(l+r)/2.0,t<=;t++)
{
if((tmp=cheq(mid))>k) l=mid;
else if(tmp<k) r=mid;else break;
}
printf("%.9lf\n",f[n]+k*mid);
}

4.13 BJ集训的更多相关文章

  1. XStream的例子

    写个小例子,方便以后复习: 1 package com.demo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 impor ...

  2. EAS常用工具类

    package com.kingdee.eas.custom; import java.io.File; import java.io.FileNotFoundException; import ja ...

  3. Python Pandas 分析郁达夫《故都的秋》

    最近刚学这块,如果有错误的地方还请大家担待. 本文用到的Python包: Ipython, Numpy, Pandas, Matplotlib 故都的秋原文参考:http://www.xiexingc ...

  4. Day5 - 06 函数的参数-命名关键字参数

    引子:对于关键字参数,调用时可以传入任意个不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过[函数里定义的关键字参数]检查,例子里就是通过otherinfo检查.        >& ...

  5. 示例讲解PostgreSQL表分区的三种方式

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议 ...

  6. 【NOIP2016提高A组集训第13场11.11】最大匹配

    题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...

  7. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  8. 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配

    题目描述 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存 ...

  9. 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串

    题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...

随机推荐

  1. vue2 less less-loader 的用法

    LESS基础语法 我们一起来学习一下LESS的基础语法,LESS的基础语法基本上分为以下几个方面:变量.混合(Mixins).嵌套规则.运算.函数.作用域等.这些基础语法需要我们先牢牢的掌握住,然后才 ...

  2. MySQL数据导入与导出

    http://blog.chinaunix.net/uid-23354495-id-3188029.html     mysql备份脚本之select into outfile

  3. mysql binlog配置详解

    关闭binlog,注释掉mysql配置文件中的log-bin=mysql-bin即可     baidu zone - 关闭binlog方法   cnblogs - linux下mysql配置文件my ...

  4. Selenium + Nightwatch 自动化测试环境搭建

    首先要安装 Java 7 或更高 ,(http://www.oracle.com/technetwork/java/javase/downloads/index.html) 并且 java 命令可正常 ...

  5. idea自动注入和自动编译

    ---恢复内容开始--- 自动编译也就是时时编译,当我们写错代码的时候,idea能够马上报错,这个是不错的功能. 安装操作看下图: 下面这个功能的作用就是,如果你不修改的话,你的项目可以正常运行,但是 ...

  6. Nexus 5更新 Android5.0 失败解决方法

    Android 5.0最终推出了正式版,今天也及时刷到了Android5.0 (LRX21O),官方链接:https://developers.google.com/android/nexus/ima ...

  7. 搭建mysql主从集群的步骤

    前提条件是:须要在linux上安装4个mysql数据库,都须要配置完对应的信息. 须要搭建: mysql 01: 主数据库  master                  mysql 02 :   ...

  8. 公网RTSP地址(持续更新)

    H264+AAC: rtsp://a2047.v1412b.c1412.g.vq.akamaistream.net/5/2047/1412/1_h264_350/1a1a1ae555c53196016 ...

  9. EasyDarwin添加自定义的服务模块EasyMyModule

    EasyDarwin模块的要求 每个QTSS模块必须实现两个方法函数: 一个Main入口函数,服务器在启动的时候将调用这个方法函数,来对您开发的模块所在的QTSS stub库进行初始化. 一个Disp ...

  10. mongodb学习之:文档操作

    在上一章中有讲到文档的插入操作是用insert的方法.如果该集合不在该数据库中,mongodb会自动创建该集合并插入文档 用find的方法可以查找所有的集合数据 > db.maple.find( ...