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. Controller 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现 Controller 层以及一些辅助类的实现. 1.2 实验知识点 Spring MVC 框架 1.3 实验环境 JD ...

  2. php程序调试: xdebug的配置

    怎样在phpeclipse中像调试Java程序一样调试php呢? XDebug的版本号非常多,打开http://xdebug.org/index.php.把站点细致看一下,你会发现有句"If ...

  3. angular - 小结

    引入样式: 导入全局 - >styles.css 导入第三方 - > 在package.json配置,然后再 npm install 安装好以后,最后再angular.json里面的sty ...

  4. 判断用户Input输入的事件来进行登陆

    我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...

  5. C++11中的原子操作(atomic operation)(转)

    所谓的原子操作,取的就是“原子是最小的.不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源.也就是他确保了在同一时刻只有唯一的线 ...

  6. [LeetCode][Java] Combinations

    题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For ex ...

  7. 解题报告 之 HDU5288 OO&#39; s Sequence

    解题报告 之 HDU5288 OO' s Sequence Description OO has got a array A of size n ,defined a function f(l,r) ...

  8. C语言-多重背包问题

    多重背包问题 问题:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 分 ...

  9. MQTT 测试工具介绍

    eclipse paho 下载地址为: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org ...

  10. DDR硬件设计要点详解(包括电源部分)

    转自 http://www.fairchildic.org/module/forum/thread-658-1-1.html (原帖包括详细的附件内容) 1. 电源 DDR的电源可以分为三类A.主电源 ...