清华集训2016Day4

组合数问题(problem)

用卢卡斯定理可知满足条件即将\(n\)和\(m\)分别用\(k\)进制表示,要求\(n\)的每一位都要大于等于\(m\)的对应位。直接数位\(dp\),设\(f_{i,0/1,0/1}\)表示处理到第\(i\)位,\(n\)是否触上界,\(m\)是否触上界时的方案数。复杂度\(O(t\log_kn)\) 。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const ll mod = 1000000007;
int t,k,l,a[100],b[100];ll n,m,f[100][4];
int main(){
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
scanf("%d%d",&t,&k);
while (t--){
scanf("%lld%lld",&n,&m);m=min(n,m);
int all=((2*n-m+2)%mod)*((m+1)%mod)%mod*500000004%mod;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
l=0;while (m) b[++l]=m%k,m/=k;
l=0;while (n) a[++l]=n%k,n/=k;
f[0][0]=f[0][1]=f[0][2]=f[0][3]=1;
for (int i=1;i<=l;++i){
f[i][0]=(k*(k+1)>>1)*f[i-1][0]%mod;
f[i][1]=((a[i]*(a[i]+1)>>1)*f[i-1][0]+(a[i]+1)*f[i-1][1])%mod;
f[i][2]=((b[i]*(2*k-b[i]+1)>>1)*f[i-1][0]+(k-b[i])*f[i-1][2])%mod;
if (b[i]<=a[i])
f[i][3]=(f[i-1][3]+(a[i]-b[i])*f[i-1][2]+b[i]*f[i-1][1]+(b[i]*(2*a[i]-b[i]+1)>>1)*f[i-1][0])%mod;
else
f[i][3]=((a[i]+1)*f[i-1][1]+(a[i]*(a[i]+1)>>1)*f[i-1][0])%mod;
}
printf("%lld\n",(all-f[l][3]+mod)%mod);
}
return 0;
}

汽水(soda)

看见平均值自然可以想到分数规划。题目中所给的\(k\)可以减到每条边的权值里面去,这样问题就变成了找一条路径使其平均值的绝对值最小。

先点分,对于每个分治重心做一次二分。假设组成答案路径的是\((A,B),(C,D)\)这两个二元组,其中\(A,C\)代表两条到根路径的权值和,\(B,D\)代表长度。二分\(-k<\frac{A+C}{B+D}<k\),只需要判断是否存在满足条件的二元组即可。

先假设\(A+C\ge0\),那么就只需要满足\(\frac{A+C}{B+D}<k\)这个条件,即\(kB-A>C-kD\)。按\(A\)从小到大枚举\((A,B)(A\ge0)\),加入所有使\(A+C\ge0\)的\((C,D)\),维护\(C-kD\)的最小值即可。考虑到\((A,B),(C,D)\)不能来自于分治重心的同一棵子树,故需要维护来自不同子树的最小及次小值。

\(A+C<0\)同理,可得\(A+kB>-C-kD\),故维护\(-C-kD\)的最小值即可。

这样复杂度为\(O(n\log^2n)\)。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define pi pair<ll,int>
#define mk make_pair
const int N = 50005;
int n,to[N<<1],nxt[N<<1],head[N],cnt,sz[N],w[N],vis[N],root,sum,top,pos;
ll ww[N<<1],ans=1ll<<60;
struct data{
ll x,y,z;
data(){x=y=z=0;}
data(ll _x,ll _y,ll _z){x=_x,y=_y,z=_z;}
bool operator < (const data &b) const {return y<b.y;}
}s[N];
pi m1,m2;
void getroot(int u,int f){
sz[u]=1;w[u]=0;
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f&&!vis[to[e]]){
getroot(to[e],u),sz[u]+=sz[to[e]];
w[u]=max(w[u],sz[to[e]]);
}
w[u]=max(w[u],sum-sz[u]);
if (w[u]<w[root]) root=u;
}
void dfs(int u,int f,ll dep,ll dis,int ac){
s[++top]=data(dep,dis,ac);
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f&&!vis[to[e]])
dfs(to[e],u,dep+1,dis+ww[e],ac);
}
void upt(pi S){
if (S.first<m1.first){
if (S.second!=m1.second) m2=m1;
m1=S;
}else if (S.first<m2.first&&S.second!=m1.second) m2=S;
}
bool chk1(ll k){
m1=m2=mk(1ll<<60,0);
for (int i=pos,j=pos-1;i<=top;++i){
while (j&&s[i].y+s[j].y>=0) upt(mk(s[j].y-k*s[j].x,s[j].z)),--j;
if (k*s[i].x-s[i].y>(s[i].z==m1.second?m2.first:m1.first)) return true;
upt(mk(s[i].y-k*s[i].x,s[i].z));
}
return false;
}
bool chk2(ll k){
m1=m2=mk(1ll<<60,0);
for (int i=pos-1,j=pos;i;--i){
while (j<=top&&s[i].y+s[j].y<0) upt(mk(-k*s[j].x-s[j].y,s[j].z)),++j;
if (k*s[i].x+s[i].y>(s[i].z==m1.second?m2.first:m1.first)) return true;
upt(mk(-k*s[i].x-s[i].y,s[i].z));
}
return false;
}
void solve(int u){
vis[u]=1;s[top=1]=data(0,0,0);
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]]) dfs(to[e],u,1,ww[e],to[e]);
sort(s+1,s+top+1);
for (pos=1;s[pos].y<0;++pos) ;
ll l=1,r=ans;
while (l<=r){
ll mid=l+r>>1;
if (chk1(mid)||chk2(mid)) ans=r=mid-1;
else l=mid+1;
}
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]]){
root=0,sum=sz[to[e]];
getroot(to[e],u),solve(root);
}
}
int main(){
freopen("soda.in","r",stdin);
freopen("soda.out","w",stdout);
ll k;scanf("%d%lld",&n,&k);
for (int i=1;i<n;++i){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);w-=k;ans=min(ans,abs(w));
to[++cnt]=v;nxt[cnt]=head[u];ww[cnt]=w;head[u]=cnt;
to[++cnt]=u;nxt[cnt]=head[v];ww[cnt]=w;head[v]=cnt;
}
sum=w[0]=n;getroot(1,0);solve(1);
printf("%lld\n",ans);return 0;
}

定向越野(circle)

咕咕咕

清华集训2016Day4的更多相关文章

  1. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  2. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  3. 【luoguP4006 清华集训2017】小Y和二叉树

    题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...

  4. UOJ_274_[清华集训2016]温暖会指引我们前行_LCT

    UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...

  5. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

  6. UOJ #269. 【清华集训2016】如何优雅地求和

    UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...

  7. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  8. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  9. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

随机推荐

  1. jsp/post中文乱码问题

    在 iso-8859-1,gb2312, utf-8 以及任意一种编码格式下,英文编码格式都是一样的,每个字符占8位,而中文就麻烦了,在gb2312 下一个中文占 16位,两字节,而在utf-8 下一 ...

  2. 雷林鹏分享:C# 命名空间(Namespace)

    C# 命名空间(Namespace) 命名空间的设计目的是为了提供一种让一组名称与其他名称分隔开的方式.在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突. 定义命名空间 命名 ...

  3. [.NET开发] C# 合并、拆分PDF文档

    在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...

  4. 20170814xlVBA部分代号收盘价转置

    原始数据: 转置效果: Sub TransformData() Dim Rng As Range Dim Arr As Variant Dim Dic As Object Dim dCode As O ...

  5. Dynamic Web Module 3.1 requires Java 1.7 or newer. 错误解决方案

    在写代码的时候工程出现了这样奇怪的bug很是蛋疼啊,经过查询解决方法,终于解决了这些个问题. 下面是解决问题的方法,和大家分享一下 (1)确定你的java工程配置使用了java 7 右键单击你的工程p ...

  6. 51nod-1605-博弈

    1605 棋盘问题  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在 ...

  7. 第 6 章 —— 依赖项注入(DI)容器 —— Ninject

    有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...

  8. 使用API失效供应商地址Demo(转)

    原文地址  使用API失效供应商地址Demo DECLARE lv_return_status ) := NULL; ln_msg_count NUMBER; lv_errmsg ); lt_vend ...

  9. 多态性&& 虚函数 && 抽象类

    http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/11/2134673.html 多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动 ...

  10. Idea热部署jrebel失败

    Idea热部署jrebel