清华集训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. C#退出模式

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  2. Android Webview 和Javascript交互,实现Android和JavaScript相互调用

    在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...

  3. Android之封装好的异步网络请求框架

    1.简介  Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnection,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使 ...

  4. 介绍 Jersey 依赖

    Jersey 使用 Apache Maven 进行构造和安装.非快照(Non-snapshot)Jersey 发行版本是不会部署到 中心 Maven 仓库(Central Maven Reposito ...

  5. Docker+Hadoop+Hive+Presto 使用Docker部署Hadoop环境和Presto

    Background 一. 什么是Presto Presto通过使用分布式查询,可以快速高效的完成海量数据的查询.如果你需要处理TB或者PB级别的数据,那么你可能更希望借助于Hadoop和HDFS来完 ...

  6. 第5章——使用 Razor(MVC框架视图引擎)

    Razor 是MVC框架视图引擎的名称. 本章提供 Razor 语法的快速教程,以使你能够识别 Razor 表达式. 本章不打算提供 Razor 的完整参考,而将其视为一个语法速成教程.在本书的后续内 ...

  7. Eclipse重命名项目名后如何彻底修改工程名

    背景:在Eclipse中当我们修改了一个Web项目名称后,在再次运行该项目,发现使用新的名称无法正常的浏览,而用旧的名称去可以 解决方案: 1:修改该项目目录下:.project文件 <?xml ...

  8. XML解析之JAXP

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. 《Python》 property、classmethod、staticmethod、isinstance、issubclass

    一.property property是一个装饰器函数 装饰器函数的使用方法:在函数.方法.类的上面一行直接@装饰器的名字 装饰器的分类: 1.装饰函数 2.装饰方法:property 3.装饰类 i ...

  10. Swift网络封装库Moya中文手册之Providers

    Providers 使用Moya,你可以通过一个 MoyaProvider 的实例发送所有网络请求,通过枚举来指定你要访问的具体API.在配置你的 Endpoint 之后,你差不多就做好了基础配置: ...