清华集训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\) 的网格状棋 ...
随机推荐
- Java注解的使用,类似于C#的Attribute
1.定义注解,代码如下: import java.lang.annotation.*; /** * 定义注解类,用于注解某个类或方法 * * @author Administrator * */ @T ...
- spring boot:创建一个简单的web(maven web project)
1.新建一个maven web project; 2.在pom.xml文件中添加相应的依赖包: 3.新建一个HelloController请求控制类: 4.编写index.jsp页面: 5.编写启动类 ...
- 【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(五)
2.Find示例代码 (1)xaml文件: //添加Symbol命名空间 xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbol ...
- codeforces 1041d// Glider// Codeforces Round #509(Div. 2)
题意:给出,n和飞行员高度h,n是区间数.在区间里飞行员高度不变,其它地方每秒高度-1,x坐标+1.问在高度变为0以前,x坐标最多加多少? 用数组gap记录本区间右端到下一个区间左端的距离.用sum记 ...
- android--------阿里 AndFix 热修复
AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug. 支持Android 2.3 到 6.0,并且支持arm 与 X86 ...
- Nastya and King-Shamans CodeForces - 992E (线段树二分)
大意: 给定序列a, 单点更新, 询问是否存在a[i]等于s[i-1], s为a的前缀和, a非负 考虑到前缀和的单调性, 枚举从1开始前缀和, 找到第一个大于等于s[1]的a[i], 如果相等直接输 ...
- Oracle11g温习-第一章:Oracle 体系架构
2013年4月27日 星期六 10:20 1.oracle 网络架构及应用环境 1. ORACLE 实例——包括内存结构与后台进程 2. ORACLE 数据库——物理操作系统文件的集合 3. 了解内存 ...
- OAF 小知识
打开新窗口链接地址 1.link的动态使用 link组件有一个属性叫 Target Frame,设置为_blank就可以新开窗口 link组件默认是打开当前系统中的连接地址,如果要打开外部网页,可以在 ...
- zk请求和响应对
zk的请求和响应是通过id对应上的: 请求头(RequestHeader)和响应头(ReplyHeader)共用一个xid,它的本质是ClientCnxn类中的一个计数器. 1. 首先看客户端: Pa ...
- xrat CC特征
["6", 11818669.0, 8326.0, 599.75, 19705.992496873696, 13.882451021258857, 0.07203338938265 ...