题面:https://www.cnblogs.com/Juve/articles/11767225.html

数列:

简化题意:已知a,b,c,求满足$a*x+b*y=c$的$x+y$最小值

然后ex_gcd硬刚就好了,若c为负,则取abs

如果我们设a<b,最优决策点就是x的最小正整数解和最大负整数解

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int n,a,b,g,val,x,y,ans=;
int ex_gcd(int a,int b,int &x,int &y){
if(!b){
x=,y=;
return a;
}
int d=ex_gcd(b,a%b,x,y);
int t=x;
x=y,y=t-a/b*x;
return d;
}
signed main(){
scanf("%lld%lld%lld",&n,&a,&b);
if(a>b) swap(a,b);
g=ex_gcd(a,b,x,y);
a/=g,b/=g;
x=(x%b+b)%b;
for(int i=;i<=n;++i){
scanf("%lld",&val);
if(val<) val=-val;
if(val%g){
puts("-1");
return ;
}
val/=g;
int p=(x*val%b+b)%b;
int q=(val-a*p)/b;
ans+=min(abs(p)+abs(q),abs(p-b)+abs(q+a));
}
printf("%lld\n",ans);
return ;
}

数对:

队长快跑加了权值

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int n,ans=,sta[MAXN<<],top=;
struct node{
int a,b,w;
friend bool operator < (node p,node q){
return p.a+p.b<q.a+q.b;
}
}p[MAXN];
int tr[MAXN<<],laz[MAXN<<];
void down(int k){
tr[k<<]+=laz[k],tr[k<<|]+=laz[k];
laz[k<<]+=laz[k],laz[k<<|]+=laz[k];
laz[k]=;
}
int query(int k,int l,int r,int opl,int opr){
if(opl<=l&&r<=opr) return tr[k];
if(laz[k]) down(k);
int mid=(l+r)>>,res=;
if(opl<=mid) res=max(res,query(k<<,l,mid,opl,opr));
if(opr>mid) res=max(res,query(k<<|,mid+,r,opl,opr));
return res;
}
void update(int k,int l,int r,int opl,int opr,int val){
if(opl<=l&&r<=opr){
tr[k]+=val;
laz[k]+=val;
return ;
}
if(laz[k]) down(k);
int mid=(l+r)>>;
if(opl<=mid) update(k<<,l,mid,opl,opr,val);
if(opr>mid) update(k<<|,mid+,r,opl,opr,val);
tr[k]=max(tr[k<<],tr[k<<|]);
}
void change(int k,int l,int r,int opt,int val){
if(l==r){
tr[k]=max(tr[k],val);
return ;
}
if(laz[k]) down(k);
int mid=(l+r)>>;
if(opt<=mid) change(k<<,l,mid,opt,val);
else change(k<<|,mid+,r,opt,val);
tr[k]=max(tr[k<<],tr[k<<|]);
}
signed main(){
//freopen("pair.in","r",stdin);
scanf("%lld",&n);
for(int i=;i<=n;++i){
scanf("%lld%lld%lld",&p[i].a,&p[i].b,&p[i].w);
sta[++top]=p[i].a,sta[++top]=p[i].b;
}
sort(p+,p+n+);
sort(sta+,sta+top+);
top=unique(sta+,sta+top+)-sta-;
for(int i=;i<=n;++i){
p[i].a=lower_bound(sta+,sta+top+,p[i].a)-sta;
p[i].b=lower_bound(sta+,sta+top+,p[i].b)-sta;
}
for(int i=;i<=n;++i){
if(p[i].a<p[i].b){
update(,,top,p[i].a+,p[i].b,p[i].w);
int t=query(,,top,,p[i].a)+p[i].w;
change(,,top,p[i].a,t);
}else{
int t=query(,,top,,p[i].b)+p[i].w;
change(,,top,p[i].a,t);
}
}
printf("%lld\n",tr[]);
return ;
}

最小距离:

多源点spfa,把所有特殊点作为远点跑spfa,此时的dis数组意义就是这个点到所有特殊点中最小那一个的距离,同时记录这个点是从那一个点转移而来,

跑完后枚举所有边,如果边的两段的点不是由同一个特殊点更新而来,那么用dis[u]+dis[v]+val[u,v]更新两个特殊点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
const int MAXN=2e5+5;
int n,m,p,x[MAXN];
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],val[MAXN<<1],cnt=0,fr[MAXN<<1];
void add(int u,int v,int w){
++cnt,to[cnt]=v,fr[cnt]=u,nxt[cnt]=pre[u],pre[u]=cnt,val[cnt]=w;
}
int dis[MAXN],fro[MAXN],ans[MAXN];
bool vis[MAXN];
queue<int>q;
void spfa(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<=p;++i){
dis[x[i]]=0,vis[x[i]]=1;
q.push(x[i]);
fro[x[i]]=x[i];
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+val[i]){
dis[y]=dis[x]+val[i];
fro[y]=fro[x];
if(!vis[y]) q.push(y),vis[y]=1;
}
}
vis[x]=0;
}
}
signed main(){
//freopen("distance.in","r",stdin);
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=p;++i) scanf("%lld",&x[i]);
for(int i=1,u,v,w;i<=m;++i){
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
memset(ans,0x3f,sizeof(ans));
spfa();
for(int i=1;i<=cnt;i+=2){
int u=fr[i],v=to[i];
if(fro[u]!=fro[v]){
ans[fro[u]]=min(ans[fro[u]],dis[u]+dis[v]+val[i]);
ans[fro[v]]=min(ans[fro[v]],dis[u]+dis[v]+val[i]);
}
}
for(int i=1;i<=p;++i) printf("%lld ",ans[x[i]]);
puts("");
return 0;
}

csps模拟92数列,数对,最小距离题解的更多相关文章

  1. 812考试总结(NOIP模拟37)[数列·数对·最小距离·真相]

    前言 考得挺憋屈的... 先是搞了两个半小时的 T1 后来发现假了,又没多想跳了.. 然后一看 T2 这不是队长快跑嘛... 先是根据自己的想法打了一遍(考完之后发现是对的..) 然后回想了一下之前的 ...

  2. [CSP-S模拟测试]:平方数(数学+哈希)

    题目传送门(内部题137) 输入格式 第一行,一个正整数$n$. 第二行$n$个正整数$a_1\sim a_n$. 输出格式 输出一个整数,为满足条件的二元组个数. 样例 样例输入: 51 2 3 4 ...

  3. [CSP-S模拟测试]:数列(数学)

    题目传送门(内部题95) 输入格式 第一行三个整数$n,a,b$,第二行$n$个整数$x_1\sim x_n$表示数列. 输出格式 一行一个整数表示答案.无解输出$-1$. 样例 样例输入:2 2 3 ...

  4. CSPS模拟 92

    为什么每次我的flag都会倒? skyh:12:15之前你把T2改出来我吃屎. ----12:10 于是12:12把线段树打完 12:13把主函数打完,过样例,带着一个sb错误交了,WA飞. 然后我就 ...

  5. csp-s模拟100,101T1,T2题解

    题面:https://www.cnblogs.com/Juve/articles/11799325.html 我太蒻了只会T1T2 组合: 欧拉路板子?不会呀... 然后打了个优化,防止暴栈 #inc ...

  6. csps模拟84Smooth,Six,Walker题解

    题面:https://www.cnblogs.com/Juve/articles/11733280.html smooth: 暴力强筛到7e7有60分... 正解: 维护一个队列,存所有的B-光滑数, ...

  7. csp-s模拟测试52平均数,序列题解

    题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...

  8. CSP-S模拟41影子,玫瑰花精题解

    题面:https://www.cnblogs.com/Juve/articles/11523567.html 影子: 暴力方法:枚举每一对点暴力统计最小权 优化:考虑并查集,枚举每个点,如果没有被访问 ...

  9. Codeforces VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线线段树 求区间相同数的最小距离

    D. Closest Equals Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/prob ...

随机推荐

  1. 继续搞我的linux

    小程序研发已经告一段落,还是继续我的Linux研究.上次因为捣鼓那个fastab,结果吧虚拟机搞崩溃了.好吧,这次老子来装正式机,从机房拉来了一台破烂货,联想的老式服务器,开工吧. 用UltraISO ...

  2. Linux下Qt调用共享库文件.so

    修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...

  3. 通过网络socket获取对方 ip 和port

    int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...

  4. Delphi全面控制Windows任务栏

    使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏.从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮.应用程序 ...

  5. SP2713 GSS4 - Can you answer these queries IV(线段树)

    传送门 解题思路 大概就是一个数很少次数的开方会开到\(1\),而\(1\)开方还是\(1\),所以维护一个和,维护一个开方标记,维护一个区间是否全部为\(1/0\)的标记.然后每次修改时先看是否有全 ...

  6. NX二次开发-UFUN求两个对象最短距离UF_MODL_ask_minimum_dist

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...

  7. [Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?

    转:http://blog.csdn.net/alexander_xfl/article/details/9150971 RunTime.exec()这个接口可以说是给我们开发者提供了一个很好的直观操 ...

  8. 2015ACM/ICPC亚洲区沈阳站重现赛-HDU5512-Pagodas-gcd

    n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...

  9. SpringAOP中的注解配置

    使用注解实现SpringAOP的功能: 例子: //表示这是被注入Spring容器中的 @Component //表示这是个切面类 @Aspect public class AnnotationHan ...

  10. 【LGP5439】【XR-2】永恒

    题目 是个傻题 显然枚举每一条路径经过了多少次,如果\(u,v\)在树上不是祖先关系的话经过\((u,v)\)这条路径的路径条数就是\(sum_u\times sum_v\) 于是我们子树大小映射到\ ...