USACO18FEB Platinum
SlingShot 求数轴上从x到y的最短路( 边长为1),有若干个从xi到yi长度为ti的传送门,每次只能选择其中一个使用。
即求min(|x-y|,min{|a-x|+|b-y|+c}),拆开绝对值,根据相对位置分开讨论,转换成二维数点问题。
MLE的主席树版本:
#include<bits/stdc++.h>
#define P pair<ll,ll>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
const int N=1e9,T=6e6,M=1e5+;
const ll inf=1ll<<;
P Min[T];
int ls[T],rs[T],A[M],x,y,sc,n,rt0[M],rt1[M],m;
struct node{ll a,b,c;}p[M];
bool cmp(const node &A,const node &B) {return A.a<B.a;}
P fmin(P a,P b){
return P(min(a.fir,b.fir),min(a.sec,b.sec));
};
void ins(int &k,int pk,int l,int r,int x,P y)
{
k=++sc;ls[k]=ls[pk];rs[k]=rs[pk];Min[k]=Min[pk];
if (l==r) {Min[k]=fmin(Min[k],y);return;}
int mid=(l+r)>>;
if (x<=mid) ins(ls[k],ls[pk],l,mid,x,y);
else ins(rs[k],rs[pk],mid+,r,x,y);
Min[k]=fmin(Min[ls[k]],Min[rs[k]]);
}
P qry(int k,int l,int r,int L,int R)
{
if (!k) return P(inf,inf);
if (L<=l&&r<=R) return Min[k];
int mid=(l+r)>>;P mn=P(inf,inf);
if (L<=mid) mn=fmin(mn,qry(ls[k],l,mid,L,R));
if (R>mid) mn=fmin(mn,qry(rs[k],mid+,r,L,R));
return mn;
}
int main()
{
n=read();m=read();Min[]=P(inf,inf);
for (int i=;i<=n;i++)
p[i].a=read(),p[i].b=read(),p[i].c=read(),A[i]=p[i].a;
sort(p+,p+n+,cmp);
sort(A+,A+n+);//寻址数组
for (int i=n;i>=;i--)
ins(rt0[i],rt0[i+],,N,p[i].b,P(p[i].a-p[i].b+p[i].c,p[i].a+p[i].b+p[i].c));
for (int i=;i<=n;i++)
ins(rt1[i],rt1[i-],,N,p[i].b,P(-p[i].a-p[i].b+p[i].c,-p[i].a+p[i].b+p[i].c));
while (m--)
{
x=read();y=read();
ll ans=abs(x-y);
int k=upper_bound(A+,A+n+,x)-A-;
ans=min(ans,qry(rt0[k+],,N,,y).fir-x+y);
ans=min(ans,qry(rt1[k],,N,,y).fir+x+y);
ans=min(ans,qry(rt0[k+],,N,y,N).sec-x-y);
ans=min(ans,qry(rt1[k],,N,y,N).sec+x-y);
printf("%lld\n",ans);
}
return ;
}
正常二维数点的树状数组版本(AC):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
const int M=1e5+;
const ll inf=1ll<<;
int A[M],n,m,tot,t,B[M*]; ll ans[M],bit[M*];
vector<int> vec1[M],vec2[M];
struct node{ll a,b,c,d;}p[M],q[M];
bool cmp(const node &A,const node &B) {return A.a<B.a;}
int lowbit(int x) {return x&(-x);}
void add1(int x,ll y){while (x<=tot) bit[x]=min(bit[x],y),x+=lowbit(x);}//前缀最小值
ll qry1(int x){ll res=inf;while (x) res=min(res,bit[x]),x-=lowbit(x);return res;}
void add2(int x,ll y){while (x) bit[x]=min(bit[x],y),x-=lowbit(x);}//后缀最小值
ll qry2(int x){ll res=inf;while (x<=tot) res=min(res,bit[x]),x+=lowbit(x);return res;}
void init(){for (int i=;i<=tot;i++) bit[i]=inf;}
int main()
{
n=read();m=read();
for (int i=;i<=n;i++)
p[i].a=read(),p[i].b=B[++tot]=read(),p[i].c=read(),A[i]=p[i].a;
sort(p+,p+n+,cmp);sort(A+,A+n+);//寻址数组
for (int i=;i<=m;i++)
{
q[i].a=read(),q[i].b=B[++tot]=read();ans[i]=abs(q[i].a-q[i].b);
int k=upper_bound(A+,A+n+,q[i].a)-A-;
vec1[k+].push_back(i);
vec2[k].push_back(i);
}
sort(B+,B+tot+);tot=unique(B+,B+tot+)-B-;
for (int i=;i<=n;i++) p[i].d=lower_bound(B+,B+tot+,p[i].b)-B;
for (int i=;i<=m;i++) q[i].d=lower_bound(B+,B+tot+,q[i].b)-B;
init();
for (int i=n;i>=;i--)
{
add1(p[i].d,p[i].a-p[i].b+p[i].c);
for (int j=;j<vec1[i].size();j++)
t=vec1[i][j],ans[t]=min(ans[t],qry1(q[t].d)-q[t].a+q[t].b);
}
init();
for (int i=n;i>=;i--)
{
add2(p[i].d,p[i].a+p[i].b+p[i].c);
for (int j=;j<vec1[i].size();j++)
t=vec1[i][j],ans[t]=min(ans[t],qry2(q[t].d)-q[t].a-q[t].b);
}
init();
for (int i=;i<=n;i++)
{
add1(p[i].d,-p[i].a-p[i].b+p[i].c);
for (int j=;j<vec2[i].size();j++)
t=vec2[i][j],ans[t]=min(ans[t],qry1(q[t].d)+q[t].a+q[t].b);
}
init();
for (int i=;i<=n;i++)
{
add2(p[i].d,-p[i].a+p[i].b+p[i].c);
for (int j=;j<vec2[i].size();j++)
t=vec2[i][j],ans[t]=min(ans[t],qry2(q[t].d)+q[t].a-q[t].b);
}
for (int i=;i<=m;i++) printf("%lld\n",ans[i]);
return ;
}
Newbarn 加点x,询问x在树上能走的最远距离
最远距离一定会走到直径端点。维护每棵树的直径(维护一条就够了)。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int q,x,dep[N],fa[N][],id,bel[N],sc,Max,u[N],v[N],tmp;
char s[];
int lca(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
int del=dep[x]-dep[y];
for (int i=;i>=;i--)
if (del&(<<i)) x=fa[x][i];
if (x==y) return x;
for (int i=;i>=;i--)
if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
}
int dis(int x,int y) {return dep[x]+dep[y]-*dep[lca(x,y)];}
int main()
{
scanf("%d",&q);
while (q--)
{
scanf("%s%d",s,&x);
if (s[]=='B')
{
id++;
if (x!=-)
{
dep[id]=dep[x]+,fa[id][]=x; bel[id]=bel[x];
for (int j=;j<=;j++)
fa[id][j]=fa[fa[id][j-]][j-];
Max=dis(u[bel[id]],v[bel[id]]);
if (tmp=dis(id,u[bel[id]]),tmp>Max) Max=tmp,v[bel[id]]=id;
if (tmp=dis(id,v[bel[id]]),tmp>Max) Max=tmp,u[bel[id]]=id;
}else bel[id]=++sc,u[sc]=v[sc]=id;
}else printf("%d\n",max(dis(x,u[bel[x]]),dis(x,v[bel[x]])));
}
return ;
}
Cow Gymnasts 求有多少个数组A任意位i都满足A[i]=sigma[A[i-j+1]>=j](i-j+1<=0时从N开始往下)?(1<=A[i]<=N)
关键点在发现循环节。大胆从最小位置x入手,设其值为m,则满足y=x(mod gcd(N,m)的位置y的值都为m。
同样也可以归纳证明,所有位置的值都<=m+1。(注意一个循环节中有一个m+1,那么就不会出现m)
枚举m,$Ans=\sum_{m=1}^{n-1}(2^{\gcd(n,m)}-1)+1$。m=n的情况只有可能全是m,故加1。
把gcd提出来,$Ans=\sum_{d|n}2^d*\varphi(N/d)-N+2-2^N$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+;
#define P pair<ll,int>
ll n,ans,sum;
map<ll,ll> Phi;
vector<P> vec;
ll ksm(ll x,ll y) {
ll res=;
while (y) {if (y&) res=res*x%mod; x=x*x%mod;y>>=;}
return res;
}
void dvd(ll x)
{
for (int i=;i<=sqrt(x);i++)
if (x%i==)
{
sum*=i-;int cnt=;x/=i;
while (x%i==) x/=i,cnt++,sum*=i;
vec.push_back(P(i,cnt));
}
if (x!=) vec.push_back(P(x,));
}
void dfs(ll x,int d,ll phi)
{
if (d==vec.size()) {Phi[x]=phi;return;}
dfs(x,d+,phi);
ll t=vec[d].first,sum=t-;
for (int i=;i<=vec[d].second;i++)
{
x*=t;
dfs(x,d+,phi*sum);
sum*=t;
}
}
int main()
{
scanf("%lld",&n);
if (n==) return puts(""),;
sum=;dvd(n);
dfs(,,);ans=((-n-ksm(,n))%mod+mod)%mod;
for (int i=;i<=sqrt(n);i++)
if (n%i==){
ans+=ksm(,i)*Phi[n/i]%mod; ans%=mod;
if ((ll)i*i!=n) ans+=ksm(,n/i)*Phi[i]%mod,ans%=mod;
}
printf("%lld\n",ans);
return ;
}
USACO18FEB Platinum的更多相关文章
- WordPress Platinum SEO插件跨站脚本漏洞
漏洞名称: WordPress Platinum SEO插件跨站脚本漏洞 CNNVD编号: CNNVD-201309-398 发布时间: 2013-09-24 更新时间: 2013-09-24 危害等 ...
- NDK下 将Platinum SDK 编译成so库 (android - upnp)
Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U ...
- 基于Platinum库的DMS实现(android)
接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 ...
- 关于Platinum库的MediaRender具体C++代码实现探讨
接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...
- Usaco 2019 Jan Platinum
Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...
- 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G
题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...
- Platinum UPnP
http://www.plutinosoft.com/platinum http://blog.csdn.net/lancees/article/details/9178385 Note that P ...
- P4271 [USACO18FEB]New Barns
题目 P4271 [USACO18FEB]New Barns 做法 这题很长见识啊!! 知识点:两棵树\((A,B)\)联通后,新树的径端点为\(A\)的径端点与\(B\)的径端点的两点 不断加边,那 ...
- [转帖]56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装
56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装 https://www.cnbeta.com/articles/tech/835271.htm 当英特尔宣布上周正式 ...
随机推荐
- leetcode.字符串.205同构字符串-Java
1. 具体题目 给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不 ...
- Excel简单应用
数据透视表的简单应用 LEN.LENB MID LEFT,RIGHT CONCATENATE 和 & TRIM(去掉前后空格) 和 SUBSTITUDE(去空格,包括字符串之间的空格) FIN ...
- 使ie6/7/8支持css3的方法
使用PIE.htc让IE6\7\8支持CSS3部分属性 包括圆角,阴影,背景渐变等效果 下载地址 http://css3pie.com/download/ 需要注意几点的是 第一,pie是以相对页面h ...
- hdu6354 /// 线段树
题目大意: 给定n m x y z 长度为n的序列初始为0 接下来m个操作 l r v 将l r区间内比v小的数都变成v l r v由x y z和给定的函数生成 线段树维护区间 最大值 最小值 再加 ...
- 《代码大全2》读书笔记 Week3
<代码大全2>第六.七章 作者在第六章中从抽象数据类型(Abstract Data Type)出发阐释类(class)的概念,给出创建类的原因以及创建高质量的常涉及的设计问题.抽象数据类型 ...
- [转载]A星寻路算法介绍
转载自:http://www.raywenderlich.com/zh-hans/21503/a%E6%98%9F%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95%E4%BB% ...
- 笔记53 Mybatis快速入门(四)
动态SQL 1.if 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询.那么按照现在的方式,必须提供两条sql语句:listProduct和listProductBy ...
- ubuntu phpize 安裝
php 版本 7.2,所以安裝 php7.2的 sudo apt-get install php7.2-dev 參考 Is is possible to install phpize for PHP7 ...
- leetcode-第12周双周赛-5111-分享巧克力
题目描述: 方法: class Solution: def maximizeSweetness(self, A: List[int], K: int) -> int: def possible( ...
- Batch - FOR /F Delims 和 Tokens 用法
原文地址: for /f命令之—Delims和Tokens用法&总结 作者:别逗了好么 在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮 ...