清华集训2016Day4
清华集训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的更多相关文章
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- 清华集训2015 V
#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...
- 【luoguP4006 清华集训2017】小Y和二叉树
题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
随机推荐
- springboot集成mybatis及mybatis generator工具使用
原文链接 前言mybatis是一个半自动化的orm框架,所谓半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernat ...
- English trip -- Review Unit6 Time 时间
It's at seven o'clock 整点 7点整 It's at half past seven or It's seven-thirty7点30 It's at seven fi ...
- memcached哈希表操作主要逻辑笔记
以下注释的源代码都在memcached项目的assoc.c文件中 /* how many powers of 2's worth of buckets we use */ unsigned int h ...
- 教你一步一步用 Node.js 制作慕课网视频爬虫
转自:http://www.jianshu.com/p/d7631fc695af 开始 这个教程十分适合初学 Node.js 的初学者看(因为我也是一只初学的菜鸟~) 在这里,我就默认大家都已经在自己 ...
- shell批量杀进程
ps aux |grep java |grep -v 'grep java'|awk {'print $2'}|xargs kill -9 ps aux |grep java 查询包含‘java’的进 ...
- vue 表单校验(二)
vue 表单校验(二) vue element-ui表单校验 由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐, ...
- JS常用操作方法图表
截取字符串方法 方法名 参数 返回值 例子 String.prototype.substr() (indexStart, length) 都可为负数,length为负数时自动转为0,length不传默 ...
- 15年-ICPC长春-网络赛
ID name status one word POJ 5437 Alisha’s Party 赛后AC. 优先队列,模拟.对时间t排序 POJ 5438 Ponds 赛后AC 循环链表 POJ 5 ...
- jsp config设置jsp页面
jsp-config jsp-config功能:用于设定jsp页面的相关设置(web.xml 版本在2.4之后) 常用的设置包括 taglib和jsp-property-group两个子元素.其中ta ...
- Vue SSR的渲染性能
一.前言 前端技术年年有新宠,Vue.js 2.0以其轻量级.渐进式.简洁的语法在MVVM框架中脱颖而出,一经推出便很受业界青睐. 为了提高首屏渲染速度 缓存+直出 是必不可少的.在Vue 1× 时代 ...