[APIO2016]

2016的题貌似是韩国棒子出的,好丧啊.... 看了题解还想了好久......

-------------------------------------------------

A.Boat

有n个数,每个数字可取[li,ri]内的任意整数si,但是要求对于任意i<j,都有si<sj,求方案数  n<=500,l,r<=10^9

题解:首先离散,然后不同区间的方案数很好转移,我们考虑相同区间的方案数,发现是一个差分了多次的数列,如果区间长度是l,选m个这样的区间,那么方案数是11111...差分m次后的第l项。然后我们可以发现这个其实是一个组合数,等于C(m,m+l)。我们用f[i][j]表示第i个选第j个区间的方案数,然后我们把f数组前缀和之后推出公式,

f[i][j]=∑C(i-i'-1,i-i'+l-1) * f[i'-1][j-1]

复杂度n^3

#include<iostream>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
#define MAXN 1000
#define int long long
using namespace std;
inline int read()
{int x = 0 , f = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;
}int tot=-1,n,L[2*MAXN+5];
int l2[MAXN*2+5],l[MAXN+5],r[MAXN+5];
int f[MAXN+5][MAXN*2+5];
int inv[MAXN+5],p[MAXN+5];main()
{p[0]=inv[0]=p[1]=inv[1]=1;for(int i=2;i<=MAXN;i++){p[i]=1LL*p[i-1]*i%mod;inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;}//for(int i=2;i<=MAXN;i++) inv[i]=1LL*inv[i]*inv[i-1]%mod;n=read();for(int i=1;i<=n;i++){l[i]=l2[i*2-1]=read();r[i]=l2[i<<1]=read();l2[i<<1]+=1;}sort(l2+1,l2+n*2+1);for(int j=1;j<=n*2;j++)if(l2[j]!=l2[j-1])l2[++tot]=l2[j];  tot++;for(int i=1;i<tot;i++) L[i]=l2[i]-l2[i-1]; for(int i=1;i<=n;i++){   l[i]=upper_bound(l2,l2+tot,l[i])-l2;r[i]=upper_bound(l2,l2+tot,r[i])-l2;//  cout<<l[i]<<" "<<r[i]<<endl;
    }for(int i=0;i<tot;i++) f[0][i]=1;for(int i=1;i<=n;i++){f[i][0]=1;for(int j=l[i];j<=r[i];j++){f[i][j]=(long long)L[j]*f[i-1][j-1]%mod;//cout<<f[i][j]<<endl;int now=1;long long c=L[j]-1;for(int k=i-1;k;--k)if(l[k]<=j&&j<=r[k]){now++;c=c*(long long)(L[j]+now-2)%mod*inv[now]%mod;if(!c)break;f[i][j]=(f[i][j]+(long long)f[k-1][j-1]*c)%mod;}}for(int j=1;j<tot;j++)f[i][j]=((long long)f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]+mod)%mod;//  for(int j=1;j<tot;j++)//  cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
    }cout<<(long long)(f[n][tot-1]-1+mod)%mod;return 0;
}

B.给定一棵n个非叶节点,m个叶节点的树,有边权,定义修改边权的费用为前后边权的差的绝对值,你要让所有叶节点到根节点的距离相同,但又不能把边权改成负数,求最小费用。

n,m<=300000

题解:我们用f[i][j]表示第i个点,子树中的叶节点到它的距离都是j的最小费用,那么f[i][0]=∑Wjk   (jk都在子树i中)。

很显然,f函数是一个下凸的函数,并且存在一些拐点,拐点前后斜率变化是1,但是拐点可以重在某一个点上。只有一个叶节点时,拐点有两个,且都为于0,凸壳形状像一个绝对值函数。

所以我们只要知道所有拐点,就可以知道这个函数啦。

我们考虑向一个子树添加边时候的影响,由于w可以无限增大,在一定大小后只修改这一条边一定最优,斜率肯定都是1,所以对于斜率大于1的部分我们都可以舍去,即弹掉所有原来斜率大等0的拐点。

这样一次合并我们实际上只把它向右平移了一下。需要删除和合并操作,所以写一个可并堆就好啦。

复杂度(n+m)log(n+m)

#include<iostream>
#include<cstdio>
#define MN 600000
#define ll long long
using namespace std;
inline int read()
{int x = 0 , f = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;
}int n,m,fa[MN+5],in[MN+5];
ll w[MN+5],ans=0;struct Heap{Heap *l,*r;ll p;int d;Heap(ll _p):p(_p),l(0),r(0),d(1){};inline friend int dis(Heap*x){return x?x->d:0;}friend Heap* Merge(Heap*x,Heap*y){if(!x) return y;if(!y) return x;if(x->p<y->p) swap(x,y);x->r=Merge(x->r,y);if(dis(x->r)>dis(x->l)) swap(x->l,x->r);x->d=dis(x->r)+1;return x;}
}*s[MN+5],*a,*b;int main()
{n=read();m=read();n+=m;for(int i=2;i<=n;i++){++in[fa[i]=read()];ans+=(w[i]=read());}for(int i=n;i>1;i--){if(!s[i]) s[i]=Merge(new Heap(0),new Heap(0));for(int j=1;j<in[i];j++)s[i]=Merge(s[i]->l,s[i]->r);a=new Heap(s[i]->p+w[i]);s[i]=Merge(s[i]->l,s[i]->r);b=new Heap(s[i]->p+w[i]);s[i]=Merge(s[i]->l,s[i]->r);s[fa[i]]=Merge(s[fa[i]],Merge(s[i],Merge(a,b)));}int top=0;while(s[1])w[++top]=s[1]->p,s[1]=Merge(s[1]->l,s[1]->r);w[top+1]=0;for(int i=top;m;m--,i--) ans-=(w[i]-w[i+1])*m;printf("%lld\n",ans);return 0;
}

C.Gap

给定一个长度为n的严格递增数列,你每次可以询问一个数字区间的最大值,最小值,求最大差分。n<=100000

题解:对于subtask1,询问次数不超过(n+1)/2,我们枚举左右节点查,然后缩短这个区间就好啦。

对于subtask2,询问的区间含有k个数时费用是k+1,要让费用不超过3n。我们先求最大值x和最小值y,显然答案不会低于(y-x)/(n-1),所以我们把数字分块,每块内不存在答案,都询问一次就行了。

#include "gap.h"
#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
#define INF 1000000000000000000LL
ll s[200005];
ll ans=0;
int cnt=0;ll solve(int x)
{ll l,r;MinMax(0,INF,s+1,s+x);cnt=2;int i=2,j=x-1;for(l=s[1]+1,r=s[x]-1;i<=j;l=s[i++]+1,r=s[j--]-1){MinMax(l,r,s+i,s+j);}for(int i=2;i<=x;i++)ans=max(ans,s[i]-s[i-1]);return ans;
}ll findGap(int T, int N)
{if(T==1) return solve(N);if(N==1) return 0;MinMax(0,INF,s+1,s+2);cnt=2;ll p=(s[2]-s[1]-1)/(N-1)+1;for(ll i=s[1]+1;i<=s[2]-1;i+=p){MinMax(i,min(i+p-1,s[2]-1),s+cnt+1,s+cnt+2);if(s[cnt+1]>0)cnt+=2;}sort(s+1,s+cnt+1);for(int i=2;i<=cnt;i++)ans=max(ans,s[i]-s[i-1]);return ans;
}

 

转载于:https://www.cnblogs.com/FallDream/p/apio2016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 使用StackFrame和StackTrace类 获取当前函数名,当前代码行,源代码文件

https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stackframe?viewnetframework-3.0 https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stacktrace?viewnetframework-3.0 测试代码如下&#xff1a; using System; using System.Collections…

华为鸿蒙系统智能手机_余承东再度确认:鸿蒙系统将适配到华为手机上

近期余承东承认华为芯片不够用&#xff0c;麒麟芯片也将在9月15日暂时停产&#xff0c;华为麒麟芯片或将成为绝唱已经确定为事实&#xff0c;这显然是有点遗憾的事情&#xff0c;不过华为也有好消息传来&#xff0c;那就是余承东再度确认鸿蒙系统将适配到手机上&#xff0c;具体…

2017-03-16 Codeforces 453A 概率期望,思维 UOJ 228(待补)

Codeforces 453A A. Little Pony and Expected Maximum 题意&#xff1a;一个m面质地均匀的骰子&#xff0c;每面出现的概率都是独立的1/m, 你需要投掷n次&#xff0c;其结果是这n次出现的最大点数。问投掷n次骰子的结果的期望值是多少&#xff0c;要求相对误差或绝对误差不…

C#多线程时对同一资源加锁实现互斥访问

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; //using System.Diagnostics;namespace 多线程 {#region 我的程序class ResultCount{public static int PassNumber { get; s…

vuex的命名空间有哪些_Vue 3 带来的 Vuex 的替代方案

一、前言就像是 React 社区在 HOOK API 出现后很快就使用 useReducer、useContext 代替了 Redux 进行状态管理一样。Vue3 也是时候抛弃 Vuex 进行状态管理了。在考虑为什么要抛弃 Vuex 之前&#xff0c;我们先来想一下为什么要引入 Vuex&#xff1f;Vuex 实际上解决的问题是「组…

GO语言安装配置

原文链接http://www.cnblogs.com/zsy/p/5215336.html转载于:https://www.cnblogs.com/zjdeblog/p/6605364.html

C# Task异步编程

1、不适用异步的示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Net; using System.Diagnostics;namespace ConsoleApplication1 {class MyDownloadStrin…

人形图案c语言程序_最多 280 字符,你能用 Basic 玩出哪些花样程序来?

(给程序员的那些事加星标)转自&#xff1a;机器之心【导读】&#xff1a;推特与计算机能擦出什么样的火花呢&#xff1f;大多数人可能就想到在计算机上发推特呗。但是&#xff0c;有人就不这么想。酷爱计算机演进史和推特的 Dominic Pajak 创建了 BBC Micro Bot&#xff0c;它能…

???--???二进制变换

题意 &#xff1a; 定义两种变换 1 &#xff1a; i i - 1 2 &#xff1a; i i - lowbit (i) 定义函数Calc(i,j)为二进制意义下 i 变换到 j 的最小步数。 给你一个二进制整数 n&#xff0c;要求 sigma {(i 1 -> n) sigma {(j 0 -> i - 1) Calc (i,j)}} 数据范围 : 令…

C# 派生类的构造函数

假定没有为任何类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的初始化构 造函数,在后台会进行许多操作,但编译器可以很好地解决类的层次结构中的所有问题,每个类中 的每个字段都会初始化为对应的默认值。但在添加了一个我们自己的构造函数后,就要通过派生类 的层…

js 获取url问号前_PHP获取指定网页的HTML代码并执行输出

PHP获取指定网页的HTML代码并执行输出&#xff0c;这个方法主要是将所要或取目标的URL地址的网站中获取相关内容到自己的网页中。代码如下&#xff1a;<?php $srcurl "所要截取目标的URL地址"; $handle fopen($srcurl,"rb"); $content fread($handl…

AD16画线时如何切换90°、45°、任意角度画线模式

在绘图界面选择画线后&#xff0c;使用“shift空格”可切换不同的画线模式。切换过程中会有90模式、45度模式、任意角度模式等&#xff0c;在这些模式中可使用空格键在进行细分切换。 1、90模式 2、45模式 3、任意模式

1200兆路由器网速_如何选购路由器才能发挥宽带的网速?

很多人多少都会遇到家里宽带网速慢的时候&#xff0c;家中明明是光纤宽带&#xff0c;可是网速却没有想象中的那么快&#xff1f;尤其是宽带的带宽升级到100M、200M、500M的时候&#xff0c;感觉跟没有提速一样。也许你家的路由器该换新啦&#xff01;那么&#xff0c;想要选购…

C# 静态类

------《C#高级编程》第7版

学习曾国藩,学做人做事学技术

三个字&#xff1a;诚、勤、恒早期&#xff1a; 早起、耐烦、有恒 语录&#xff1a;不日进&#xff0c;就日退 语录&#xff1a;拙看似慢&#xff0c;实则最快&#xff01; &#xff08;反思学技术&#xff1f;&#xff09; 语录&#xff1a; 决定成败的&#xff0c;不在高处…

vant实现下拉刷新和上拉加载_微信小程序 - 实现下拉刷新、上拉加载

在小程序开发中使用下拉刷新和上拉加载非常多&#xff0c;比如常用的展示型首页&#xff0c;而实现这个功能有两种形式&#xff0c;第一种是使用 scroll-view 组件&#xff0c;第二种是不使用 scroll-view 组件而让整个页面刷新&#xff0c;那就分别都在此简单分享下。方法一在…

经验证过的跨线程更新辅助类MyInvokeHelper

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Windows.Forms;namespace Extension.MyDll {/// <summary>/// 辅助类&#xff1a;跨线程更新控件/// &l…

02函数-03-闭包

1、闭包的概念闭包是一种特殊的程序结构&#xff0c;即 函数A中定义了另一个函数a&#xff0c;内部函数a引用了外部函数A的参数和局部变量&#xff0c;最终A会返回一个保存了相关参数和变量的函数a。简洁地说&#xff0c;外层函数将保存了信息的可执行内层函数作为结果返回。来…

mapper同时添加数据只能添加一条_springcloud项目搭建第二节:eureka+数据库

在上一节搭建的项目基础上&#xff0c;在父项目spring-cloud的pom文件中添加mapper启动器和mysql驱动的配置&#xff0c;如果项目中使用lombok也可以引用&#xff0c;这里需要注意的是lombok引用的配置不在dependencyManagement结构中&#xff0c;这时为什么呢&#xff0c;因为…

C#控件命名规范

类 型 前 缀 示 例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calendar cal calMettingDates CheckBox chk chkBlue CheckBoxList chkl chklFavColors DropDownList drop dropCountries FileUpLoad fup fupImage …