题面: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. Spring入门(四)Spring-test模块

    自动化转配bean的测试案例分析 package soundsystem; import static org.junit.Assert.*; import org.junit.Rule; impor ...

  2. JS window对象取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间。

    取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间. 语法: clearInterval(id_of_setInterv ...

  3. top.location.href

    window.location.href.location.href是本页面跳转   parent.location.href是上一层页面跳转   top.location.href是最外层的页面跳转 ...

  4. Java用集合实现斗地主发牌

    本文以java双列集合HashMap为核心实现发牌操作:                                思路: 1.准备牌:创建一个Map集合,存储牌的索引和组装好的牌 创建一个lis ...

  5. 关于CheckListBox触发ItemCheck事件的问题

    开发时遇到一个有趣的问题,我们需要CheckListBox可以实现单选功能,因为默认是多选的,开始我写的代码如下: void cb_ItemCheck(object sender,ItemCheckE ...

  6. leetcode-158周赛-5222-分割字符串

    题目描述: 自己的提交: class Solution: def balancedStringSplit(self, s: str) -> int: if not s:return 0 res ...

  7. python模块:typing

    很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种现象就 ...

  8. 云cassandra 重磅发布dynamodb特性

    云cassandra全新发布dynamodb特性 nosql主力数据库再上新台阶 9月阿里云cassandra产品发布,具体参考阿里云全球首发云Cassandra服务.迄今为止,已有上百大B客户开通了 ...

  9. Session监听类HttpSessionListener介绍及在listener里取得request

    Session监听类HttpSessionListener介绍及在listener里取得request servlet-api.jar中提供了监听类HttpSessionListener,主要方法有两 ...

  10. .net 项目如何添加log4net日志记录

    1.在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度. 文件实例: <?xml version="1.0"?><configura ...