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. HDU 4635 Strongly connected(强连通)经典

    Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. C++继承:公有,私有,保护(转)

    公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...

  3. android相关文件夹的存取方式与函数解析---全

    因为排版问题.转为markdown编辑: http://blog.csdn.net/self_study/article/details/58587412

  4. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  5. vs2012 MinGW 编译ffmeg 引用外部库libx264,librtmp

    VS2012如何编译ffmpeg前面已经有文章讲过,本来主要讲述如何引用外部库libx264,librtmp, ffmpeg版本是3.0.2. 1. 下载x264源文件并编译 源码地址是http:// ...

  6. find and xargs

    调整搜索深度 -mandepth 搜索当前目录,而不进入子目录: find . -maxdepth 0 -name "debug*" Linux中find常见用法示例 ·find  ...

  7. 详谈kubernetes滚动更新-1

    系列目录 这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment.replicaset.pod的细节以及创建过程以及deployment版本管理的方式 第二个小节将介 ...

  8. Finder 快捷键

    记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...

  9. PHP后台批量删除数据

    html <form action="" method="post"> <div><input type="submit ...

  10. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...