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. C#制作、打包、签名、发布Activex全过程【转】

    http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...

  2. DataGridView.DataSource= list(Of T)

    注:本文样例的代码承接上篇文章:DataTable填充实体类返回泛型集合. 在D层查询完毕之后.我们将DataTable转化为泛型集合.然后经过中间各层,返回U层.到了这里,问题来了.我们这时候要将这 ...

  3. MySQL 压缩解决方案

    From:https://www.qcloud.com/community/article/876100 导语 描述 MySQL 压缩的使用场景和解决方案,包括压缩传输协议.压缩列解决方案和压缩表解决 ...

  4. 小数运算需要注意什么? 接口和抽象类 WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上

    小数运算需要注意什么? 1. 生活中0.1+0.2=0.3, 计算机中可不是这样,为什么呢? 大家都知道计算机类型都是有数据范围的.整形int范围是 正负21亿左右,小数类型同样也是有范围的,但是即使 ...

  5. iOS 插件制作

    概述 我们平时也使用了非常多的xcode插件,尽管官方对于插件制作没有提供不论什么支持,可是载入三方的插件,默认还是被同意的.第三方的插件,须要存放在 ~/Library/Application Su ...

  6. 关于Win8 用不了USB转串口驱动

    win8系统必需要关闭设备驱动自己主动更新,否则联网更新的驱动是用不了的.操作过程例如以下: 打开控制面板,搜索"设备".更改设备安装设置 watermark/2/text/aHR ...

  7. Python遍历列表

    #循环遍历列表 nums = [ss,gg,e,fff,bb] #while循环遍历,但是不推荐使用,因为还要把列表的元素数出来 i = 0 while i<5: print(nums[i]) ...

  8. python訪问redis

    python訪问redis 1 Linux上安装redis a) 下载 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz b) 编 ...

  9. 使用Caffe完成图像目标检测 和 caffe 全卷积网络

    一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...

  10. 备忘:js正则表达式中的元字符

    Predefined term Matches \t Horizontal tab \b Backspace \v Vertical tab \f Form feed \r Carriage retu ...