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的更多相关文章

  1. WordPress Platinum SEO插件跨站脚本漏洞

    漏洞名称: WordPress Platinum SEO插件跨站脚本漏洞 CNNVD编号: CNNVD-201309-398 发布时间: 2013-09-24 更新时间: 2013-09-24 危害等 ...

  2. NDK下 将Platinum SDK 编译成so库 (android - upnp)

    Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U ...

  3. 基于Platinum库的DMS实现(android)

    接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 ...

  4. 关于Platinum库的MediaRender具体C++代码实现探讨

    接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...

  5. Usaco 2019 Jan Platinum

    Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...

  6. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

  7. Platinum UPnP

    http://www.plutinosoft.com/platinum http://blog.csdn.net/lancees/article/details/9178385 Note that P ...

  8. P4271 [USACO18FEB]New Barns

    题目 P4271 [USACO18FEB]New Barns 做法 这题很长见识啊!! 知识点:两棵树\((A,B)\)联通后,新树的径端点为\(A\)的径端点与\(B\)的径端点的两点 不断加边,那 ...

  9. [转帖]56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装

    56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装 https://www.cnbeta.com/articles/tech/835271.htm 当英特尔宣布上周正式 ...

随机推荐

  1. Feign 系列(01)最简使用姿态

    目录 Feign 系列(01)最简使用姿态 1. 引入 maven 依赖 2. 基本用法 3. Feign 声明式注解 Feign 系列(01)最简使用姿态 Spring Cloud 系列目录(htt ...

  2. CSS中background的用法

    CSS中  background 是一个很基本的而且比较常用的样式 background : background-color || background-image || background-re ...

  3. 随笔记录 shell脚本相关内容 2019-8-26

    字符串截取: 假设变量为var=http://www.hao.com/123.htm1. # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符, ...

  4. API Gateway和Route 53及CloudFront的连携使用

    API Gateway部署出来之后的url网址对于普通用户并不友好,所以肯定是需要一个正常的域名来作为url进行访问. 主要有以下几点, API Gateway可以自定义域名 自定义的域名要从Rout ...

  5. js中的Array数组清空

    var data = new Array();//数组 data.length = 0;//数组的长度等于0,数组的项就会被清空

  6. webapi JWT 认证

    第一步 使用ng安装JWT组件 第二步 编写登录和生成token代码 byte[] key = Encoding.UTF8.GetBytes("123456789aaaaaaa") ...

  7. vue之TodoMVC项目实战

    一.初始化项目 1.下载模板 进入github中https://github.com/tastejs/todomvc-app-template,并且在命令行将其clone下来 git clone ht ...

  8. 使用babel转码器,让浏览器支持es6语法

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,可是很多浏览器并不支持es6语法,所以我们需要一个转码工具, 把es6的语法转换成浏览器支持的javascr ...

  9. delphi xe10 网络连接

    //当前网络状态(引用 Androidapi.JNI.Network.pas) IsConnected //连接 IsWiFiConnected //Wifi是否连接 IsMobileConnecte ...

  10. QString与string的相互转换【转载】

    文章转载自https://blog.csdn.net/qq_33485434/article/details/80680506 1.QString转换String string s = qstr.to ...