SDOI2016 Round1 题解
BZOJ4513 储能表
数位DP,f[i][2][2][2]表示前i位,是否卡n的上界,是否卡m的上界,是否卡k的下界,枚举每一维的下一位直接转移。
#include<cstdio>
#include<cstring>
typedef unsigned u32;
typedef long long ll;
ll x,y,z;
int p,q;
u32 f[61][2][2][2][2];
int main(){
scanf("%d",&q);
while(q--){
scanf("%lld%lld%lld%d",&x,&y,&z,&p);
memset(f,0,sizeof f);
f[60][1][1][1][0]=1;
for(int i=59;~i;--i)
for(int j=1;~j;--j)
for(int k=1;~k;--k)
for(int l=1;~l;--l)
for(int a=j?x>>i&1:1;~a;--a)
for(int b=k?y>>i&1:1;~b;--b)
if(!l||(z>>i&1)<=(a^b)){
u32*s=f[i][j&(x>>i&1)==a][k&(y>>i&1)==b][l&(z>>i&1)==(a^b)],*t=f[i+1][j][k][l];
(s[0]+=t[0])%=p,(s[1]+=t[1]*2+(a^b)*t[0])%=p;
}
printf("%lld\n",(1[****f]-z%p******f%p+p)%p);
}
}
BZOJ4514 数字配对
若$j$是$i$的倍数且$\Omega(j)-1=\Omega(i)$则$i$,$j$可以配对,其中$\Omega(i)$表示$i$的质因子指数和。按$\Omega(i)$的奇偶性建二分图,跑费用流。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=-1e18;
const int N=205;
void eq1(int&a,int b){a=b<a?b:a;}
struct edge{
int v,c;ll w;edge*s;
}e[N*N];
edge*p=e,*h[N];
void ins(int u,int v,ll w,int c){
edge s={v,c,w,h[u]};
edge t={u,0,-w,h[v]};
*(h[u]=p++)=s;
*(h[v]=p++)=t;
}
int n,s,t,q[N*N];
typedef int arr[N];
arr a,b,c,d,f,z;
ll r[N];
int dfs(int u,int c){
if(u==t)return c;
int f=0;
for(edge*i=h[u];i;i=i->s)
if(r[u]-i->w==r[i->v]&&d[u]-1==d[i->v]&&i->c){
int j=dfs(i->v,min(c-f,i->c));
i->c-=j,e[i-e^1].c+=j,f+=j;
if(f==c)break;
}
if(!f)d[u]=-1;
return f;
}
int spfa(){
int f=0;
ll c=0;
while(1){
fill(r+s,r+t,inf);
q[0]=t;
for(int a=0,b=0;a<=b;++a){
int u=q[a];
z[u]=0;
for(edge*i=h[u];i;i=i->s)
if(r[i->v]<r[u]-i->w&&e[i-e^1].c){
r[i->v]=r[u]-i->w;
d[i->v]=d[u]+1;
if(!z[i->v]++)q[++b]=i->v;
}
}
if(r[s]==inf)return f;
while(1){
int j=dfs(s,1e9);
if(!j)break;
if(r[s]<0&&c/-r[s]<=j){
f+=c/-r[s],c%=-r[s];
break;
}
f+=j,c+=j*r[s];
}
}
}
int main(){
scanf("%d",&n),t=n+1;
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<=n;++i)
scanf("%d",b+i);
for(int i=1;i<=n;++i)
scanf("%d",c+i);
for(int i=1;i<=n;++i){
int j=a[i];
for(int d=2;d*d<=j;++d)
for(;j%d==0;j/=d)++f[i];
f[i]+=j!=1;
}
for(int i=1;i<=n;++i)
if(f[i]&1){
ins(s,i,0,b[i]);
for(int j=1;j<=n;++j)
if(abs(f[i]-f[j])==1&&max(a[i],a[j])%min(a[i],a[j])==0)
ins(i,j,(ll)c[i]*c[j],1e9);
}else
ins(i,t,0,b[i]);
printf("%d\n",spfa());
}
BZOJ4515 游戏
哪个SB把李超线段树出到树上的……修改拆成两条链,设$t$是$s$的祖先,那么$x$上的数字为$a(d_s-d_x)+b$,所以可以统一插入斜率为$-a$,截距为$ad_s+b$的线段。
#include<bits/stdc++.h>
#define I (i+j+2>>1)
#define J (i+j>>1)
#define P (k<<1)
#define S (k<<1^1)
using namespace std;
template<class T>
void eq1(T&a,T b){a=b<a?b:a;}
typedef long long ll;
const int N=1e5+5;
int n,n2;
typedef int arr[N];
arr d1,f1,f2,f3,f4,f5,f6;
ll d2[N],z[N*4];
struct tag{
int s;ll t;
ll operator()(int i){
return s*d2[f6[i]]+t;
}
}c[N*4];
void ins(tag f,int s,int t,int i,int j,int k){
if(s<=i&&j<=t){
if(i==j){
if(f(i)<c[k](i))c[k]=f;
}else
if(f(i)<c[k](i))
if(f(j)<c[k](j))c[k]=f;
else
if(f(J)>c[k](J))ins(f,s,t,i,J,P);
else
ins(c[k],s,t,I,j,S),c[k]=f;
else
if(f(j)<c[k](j))
if(f(I)>c[k](I))ins(f,s,t,I,j,S);
else
ins(c[k],s,t,i,J,P),c[k]=f;
eq1(z[k],c[k](i));
eq1(z[k],c[k](j));
}else{
if(s<I)ins(f,s,t,i,J,P);
if(t>J)ins(f,s,t,I,j,S);
eq1(z[k],z[P]);
eq1(z[k],z[S]);
}
}
ll ask(int s,int t,int i,int j,int k){
if(s==i&&j==t)return z[k];
ll y=min(c[k](s),c[k](t));
if(t<I)return min(y,ask(s,t,i,J,P));
if(s>J)return min(y,ask(s,t,I,j,S));
return min(y,min(ask(s,J,i,J,P),ask(I,t,I,j,S)));
}
struct edge{
int v,w;edge*s;
}e[N*2];
edge*x=e,*h[N];
void ins(int u,int v,int w){
edge s={v,w,h[u]};
*(h[u]=x++)=s;
}
void dfs1(int u){
f1[u]=1;
for(edge*i=h[u];i;i=i->s)
if(i->v!=f2[u]){
f2[i->v]=u,d1[i->v]=d1[u]+1,d2[i->v]=d2[u]+i->w;
dfs1(i->v);
f1[u]+=f1[i->v];
if(f1[i->v]>f1[f3[u]])
f3[u]=i->v;
}
}
void dfs2(int u,int v){
f4[f6[f5[u]=++n2]=u]=v;
if(f3[u])dfs2(f3[u],v);
for(edge*i=h[u];i;i=i->s)
if(i->v!=f2[u]&&i->v!=f3[u])
dfs2(i->v,i->v);
}
int lca(int s,int t){
while(f4[s]!=f4[t]){
if(d1[f4[s]]<d1[f4[t]])swap(s,t);
s=f2[f4[s]];
}
return d1[s]<d1[t]?s:t;
}
void ins(tag f,int s,int t){
while(f4[s]!=f4[t]){
ins(f,f5[f4[s]],f5[s],1,n,1);
s=f2[f4[s]];
}
ins(f,f5[t],f5[s],1,n,1);
}
int main(){
int m,w,u,v,s,t;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;++i){
scanf("%d%d%d",&u,&v,&w);
ins(u,v,w),ins(v,u,w);
}
dfs1(1),dfs2(1,1);
for(int i=1;i<N*4;++i)
c[i].t=z[i]=123456789123456789;
while(m--){
scanf("%d%d%d",&w,&s,&t);
if(w==1){
scanf("%d%d",&u,&v);
int l=lca(s,t);
tag f1={-u,u*d2[s]+v},f2={u,u*d2[s]-u*d2[l]*2+v};
ins(f1,s,l);
ins(f2,t,l);
}else{
ll y=1e18;
while(f4[s]!=f4[t]){
if(d1[f4[s]]<d1[f4[t]])
swap(s,t);
y=min(y,ask(f5[f4[s]],f5[s],1,n,1));
s=f2[f4[s]];
}
if(d1[s]<d1[t])swap(s,t);
y=min(y,ask(f5[t],f5[s],1,n,1));
printf("%lld\n",y);
}
}
}
BZOJ4517 排列计数
裸的错排……
#include<cstdio>
typedef long long ll;
const int p=1e9+7;
const int N=1e6+5;
int q,n,m;
ll f1[N],f2[N],f3[N],f4[N];
int main(){
f1[1]=f2[0]=f3[0]=f4[0]=1;
for(int i=2;i<N;++i)
f1[i]=f1[p%i]*(p-p/i)%p,f4[i]=(i-1)*(f4[i-1]+f4[i-2])%p;
for(int i=1;i<N;++i)
f2[i]=f2[i-1]*i%p,f3[i]=f3[i-1]*f1[i]%p;
scanf("%d",&q);
while(q--){
scanf("%d%d",&n,&m);
printf("%d\n",f2[n]*f3[m]%p*f3[n-m]%p*f4[n-m]%p);
}
}
BZOJ4518 征途
斜率优化,设$s$为前缀和,容易推出$f_j+(m+1)s_j^2=2ms_is_j+f_i-(m-1)s_i^2$,横坐标和斜率都单调,单调队列维护即可。
#include<cstdio>
typedef long long ll;
const int N=3005;
int n,m,a,b,q[N];
ll s[N],f[N],g[N];
double cal1(int i,int j){
return(f[i]-f[j]+(m+1)*(s[i]*s[i]-s[j]*s[j]))/1./(s[i]-s[j]);
}
ll cal2(int j,int i){
return f[j]+(m-1)*s[i]*s[i]+(m+1)*s[j]*s[j]-m*s[i]*s[j]*2;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",s+i),s[i]+=s[i-1],f[i]=1e18;
for(int z=1;z<=m;++z){
q[a=b=0]=z-1;
for(int i=z;i<=n;++i){
while(a<b&&cal2(q[a],i)>cal2(q[a+1],i))
++a;
g[i]=cal2(q[a],i);
while(a<b&&cal1(q[b],i)<cal1(q[b-1],i))
--b;
q[++b]=i;
}
for(int i=z;i<=n;++i)
f[i]=g[i];
}
printf("%lld\n",f[n]);
}
SDOI2016 Round1 题解的更多相关文章
- cogs2223 [SDOI2016 Round1] 生成魔咒
cogs2223 [SDOI2016 Round1] 生成魔咒 原题链接 题解 暴力:每次更新后缀数组??? set+二分+hash暴力 http://paste.ubuntu.com/2549629 ...
- [SDOI2016 Round1] 数字配对
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★ 输入文件:m ...
- [SDOI2016 Round1] 征途[斜率优化]
2225. [SDOI2016 Round1] 征途 ★★★☆ 输入文件:menci_journey.in 输出文件:menci_journey.out 简单对比时间限制:1 s 内存 ...
- ZROI WC Round1 题解
ZROI WC Round1 题解 Problem A 题意 一个 \(n \times m\) 格子图,一个人从左上角出发,每次向右或者向下走一格,方法如下: 如果他在最下面一排,那么他会往右行走. ...
- Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)
[SDOI2016 Round1] 数字配对 ★★★ 输入文件:menci_pair.in 输出文件:menci_pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 ...
- 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表
4513: [Sdoi2016]储能表 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 395 Solved: 213[Submit][Status] ...
- cogs 2223. [SDOI2016 Round1] 生成魔咒
★★☆ 输入文件:menci_incantation.in 输出文件:menci_incantation.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述]魔咒串由许多魔咒字符组 ...
- cogs 2221. [SDOI2016 Round1] 数字配对
★★ 输入文件:pair.in 输出文件:pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两 ...
- SDOI2016 round1滚粗记
Day -1 刚刚从HN集训回来,感觉整个人萌萌哒.考前不断立flag——这次我一定会滚粗的,然后设想着滚粗之后文化课先补什么,浑浑噩噩的过了一天,晚上看到CA爷(娘)发了关于cena爆栈的问题,这时 ...
随机推荐
- tar [options] [list of file]
打包:zcvf 解压:zxvf -c 创建新档案文件 -x 从档案文件中解出文件(释放文件) -v (verbose)显示tar命令执行的详细过程 -f 指定目标为一个文件而不是一个设备 -z 调用g ...
- 设计模式之建造者(Builder)模式
设计模式之建造者(Builder)模式 存在一些情况,比如,一些对象会有一些重要的属性,在这些属性没有恰当的值之前,对象不能作为一个完整的产品使用(如一个电子邮件最起码得有收件人地址):还有一些些情况 ...
- Jetty插件实现热部署(开发时修改文件自动重启Jetty)
在pom.xml文件中配置Jetty插件的参数:scanIntervalSeconds <plugin> <groupId>org.mortbay.jetty</grou ...
- 完整的MVC框架(前端、后台和数据库)
终于学完了数据库的连接,可以做一个完整的项目了,以前做的练习都没有关联到数据库,没法进行事务. MVC框架 先上图: 老师画的图,有点乱,但是大概意思还是可以理解. 这个练习是简单的存储一个学生读了哪 ...
- [CSS3] Target HTML Elements not Explicitly set in the DOM with CSS Pseudo Elements (Blockquotes)
Pseudo elements allow us to target elements that are not explicitly set in the DOM. Using ::before : ...
- Mac 下解决虚拟机virtualbox 4.3和windows共享问题
mac上面安装了最新的virtualbox,有些软件还是须要windows的. 1,在设置了共享之后,仍然不能使用 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- UltraEdit UE如何取消保存文件自动备份
高级-配置-文件处理-备份,设置为不备份
- 微信小程序 项目实战(一)生命周期 配置服务器信息 splash启动页
步骤一:小程序 生命周期 //app.js App({ onLaunch: function () { //当小程序初始化完成时,会触发onLaunch(全局只触发一次) }, onShow: fun ...
- const成员函数总结
const 成员函数: 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作不论什么改变. 在设计类的时候.一个原则就是对于不改变数据成员的成员函数都要 ...
- 处理页面载入图片js(等比例压缩图片)
第一页面html <div class="admin">${answer.content}</div> <div class="admin ...