csps模拟92数列,数对,最小距离题解
题面: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数列,数对,最小距离题解的更多相关文章
- 812考试总结(NOIP模拟37)[数列·数对·最小距离·真相]
前言 考得挺憋屈的... 先是搞了两个半小时的 T1 后来发现假了,又没多想跳了.. 然后一看 T2 这不是队长快跑嘛... 先是根据自己的想法打了一遍(考完之后发现是对的..) 然后回想了一下之前的 ...
- [CSP-S模拟测试]:平方数(数学+哈希)
题目传送门(内部题137) 输入格式 第一行,一个正整数$n$. 第二行$n$个正整数$a_1\sim a_n$. 输出格式 输出一个整数,为满足条件的二元组个数. 样例 样例输入: 51 2 3 4 ...
- [CSP-S模拟测试]:数列(数学)
题目传送门(内部题95) 输入格式 第一行三个整数$n,a,b$,第二行$n$个整数$x_1\sim x_n$表示数列. 输出格式 一行一个整数表示答案.无解输出$-1$. 样例 样例输入:2 2 3 ...
- CSPS模拟 92
为什么每次我的flag都会倒? skyh:12:15之前你把T2改出来我吃屎. ----12:10 于是12:12把线段树打完 12:13把主函数打完,过样例,带着一个sb错误交了,WA飞. 然后我就 ...
- csp-s模拟100,101T1,T2题解
题面:https://www.cnblogs.com/Juve/articles/11799325.html 我太蒻了只会T1T2 组合: 欧拉路板子?不会呀... 然后打了个优化,防止暴栈 #inc ...
- csps模拟84Smooth,Six,Walker题解
题面:https://www.cnblogs.com/Juve/articles/11733280.html smooth: 暴力强筛到7e7有60分... 正解: 维护一个队列,存所有的B-光滑数, ...
- csp-s模拟测试52平均数,序列题解
题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...
- CSP-S模拟41影子,玫瑰花精题解
题面:https://www.cnblogs.com/Juve/articles/11523567.html 影子: 暴力方法:枚举每一对点暴力统计最小权 优化:考虑并查集,枚举每个点,如果没有被访问 ...
- 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 ...
随机推荐
- 目录文件的操作函数 mkdir ,opendir,readdir,closedir
1. int mkdir(const char *pathname, mode_t mode); 头文件 :<sys/stat.h> <sys/types.h> 功能: ...
- 关于print()里面的sep和end参数的使用
print('hello', 'world') #默认用空格隔开 #hello world print('hello', 'world', sep='wuli') #sep=''可以用来设置连接的字符 ...
- Simple example of use of __setstate__ and __getstate__
class Foo(object): def __init__(self, val=2): self.val = val def __getstate__(self): print ("I' ...
- leetcood学习笔记-404-左叶子之和
题目描述: 方法一:递归 class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: if not root: retur ...
- css制作旋转风车(transform 篇)
做这个案例之前首先要大概了解CSS的transform的属性 transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 看看效果图 打开的时候自动旋转 ...
- eclipse如何实现智能提示功能
一直时候用idea很久没有使用eclipse了,idead的ctrl+鼠标滚轮是可以调节字体大小,这项功能是我的最爱. 早就忘记eclipse的智能助手设置,今天翻下以前的笔记,觉得还是做个博客方便今 ...
- C++ 将汉字转换成拼音全拼【转载】
转载自https://www.cnblogs.com/mzhrd/p/4758105.html #include <string> using std::string; //======= ...
- Spring-Security (补充)
一.配置静态资源过滤 直接在xml中配置即可 <!-- 配置静态资源过滤 --> <security:http security="none" pattern=& ...
- Openstack组件实现原理 — OpenVswitch/Gre/vlan
目录 目录 前文提要 Neutron 管理的网络相关实体 OpenVswitchOVS OVS 的架构 VLan GRE 隧道 Compute Node 中的 Instance 通过 GRE 访问 P ...
- css中的zoom的作用
1.检查页面的标签是否闭合不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题, 却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而 他们很容易犯此类问题.快捷提示:可以用 Drea ...