4.13 BJ集训
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集训的更多相关文章
- XStream的例子
写个小例子,方便以后复习: 1 package com.demo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 impor ...
- EAS常用工具类
package com.kingdee.eas.custom; import java.io.File; import java.io.FileNotFoundException; import ja ...
- Python Pandas 分析郁达夫《故都的秋》
最近刚学这块,如果有错误的地方还请大家担待. 本文用到的Python包: Ipython, Numpy, Pandas, Matplotlib 故都的秋原文参考:http://www.xiexingc ...
- Day5 - 06 函数的参数-命名关键字参数
引子:对于关键字参数,调用时可以传入任意个不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过[函数里定义的关键字参数]检查,例子里就是通过otherinfo检查. >& ...
- 示例讲解PostgreSQL表分区的三种方式
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议 ...
- 【NOIP2016提高A组集训第13场11.11】最大匹配
题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...
- 【纪中集训2019.3.13】fft
题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...
- 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配
题目描述 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存 ...
- 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串
题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...
随机推荐
- Delphi TScrollBar 用于滚动窗口、组件内容
滚动条组件(TScrollBar)此组件是一个Windows滚动条,用于滚动窗口.组件内容.许多控制有滚动条属性,它们把滚动条作为自己的一部分,对于没有完整滚动条的控制,TScrollBar组件提供了 ...
- MySQL主从复制技术与读写分离技术amoeba应用
MySQL主从复制技术与读写分离技术amoeba应用 前言:眼下在搭建一个人才站点,估计流量会非常大,须要用到分布式数据库技术,MySQL的主从复制+读写分离技术.读写分离技术有官方的MySQL-pr ...
- 绝不要在构造函数和析构过程中调用virtual函数
下面是一个用来塑模股市交易的类: derived的类的构造函数被调用,但是首先得调用基类Transaction的构造函数,但是在后面还得调用virrual函数,这个时候子类的对象的构造还没有完成,那么 ...
- 读《疯狂Java讲义》笔记总结三
1.初始化块 实际上初始化块是一个假象,使用javac命令编译Java类后,该Java类中的初始化块会消失--初始化块中代码会被 "还原" 到每一个构造器中,且位于构造器全部代码的 ...
- swift学习_xcode6搭建
首先是环境搭建 , 我的是苹果系统 , 我是个穷小子. 8k的电脑离我比較遥远. 自己动手的黑苹果 . 总价1k, 学习够用了即可.期间也学到了非常多东西 . 就是穷人仅仅能发时间去换钱了, 一直在考 ...
- java通过http方式下载文件
package com.qiyi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- git 下载与Linux源码安装最新版
win: https://git-for-windows.github.io/ 或 https://git-scm.com/downloads 官网! 源码安装git Git 的工作需要调用 ...
- Html5的placeholder属性(IE兼容)
HTML5对Web Form做了很多增强,比方input新增的type类型.Form Validation等. Placeholder是HTML5新增的还有一个属性,当input或者textarea设 ...
- iOS8需要兼容的内容
本文转载至 http://blog.csdn.net/liuwuguigui/article/details/39494435 1.iPad上使用presentModalViewController ...
- 监控hadoop任务结果shell脚本
需求:每日hadoop结果文件中,找出数据不完整的日期和没有跑出数据的日期,重新进行跑hadoop任务 分析:在result/目录生成的文件中数据有2个特点 第一:日期有,但是数据不完整 第二:日期对 ...