T1 卡牌选取_xiyuping24的博客-CSDN博客
拆位拆串行挂50pts可还行qwq
#include
using namespace std;
#define int long long
const int N=100010;
int n,m,res,a[N];
set s;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int gcd(int x,int y){return y?gcd(y,x%y):x;}
signed main()
{
freopen("pair.in","r",stdin);
freopen("pair.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i)
{
int x=read();
set::iterator it;
it=s.find(x);
if(it==s.end())
{
for(auto t:s) if(gcd(a[x],a[t])==1) res++;
s.insert(x);
}
else
{
s.erase(it);
for(auto t:s) if(gcd(a[x],a[t])==1) res--;
}
printf("%d\n",res);
}
return 0;
}
题中说航线有负权,但是道路是保证大于0的啊啊啊啊
这就说明不会有负环只会有负边权套SPFA就好 然而但是TLE挂了30分
考完查题解,发现有两个选择:1.缩点优化Dij 2.deque优化SPFA
deque优化我确实从来没见过(太菜辣)在spfa的基础上,在将当前点放入队列时,根据当前点是否比当前deque的队头更优,分别从队头放入和队尾放入即可,从而优化了维护队列中结点最优状态的时间复杂度。code:
#include
using namespace std;
const int N=1000010;
int n,r,p,s;
struct edge{int u,v,w,nxt;}e[N];
int head[N],tot,dis[N];
void addage(int u,int v,int w)
{
e[++tot].u=u;
e[tot].v=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
}
bool vis[N];
void spfa(int x)
{
memset(dis,0x3f,sizeof dis);
vis[x]=1;dis[x]=0;
dequeq;
q.push_front(x);
while(!q.empty())
{
int u=q.front();
q.pop_front();
vis[u]=0;
for(int i=head[u]; i; i=e[i].nxt)
{
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w)
{
dis[v]=dis[u]+e[i].w;
if(!vis[v])
{
if(q.empty()||dis[v]'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
freopen("roadplane.in","r",stdin);
freopen("roadplane.out","w",stdout);
n=read();r=read();
p=read();s=read();
for(int u,v,w,i=0; i
还是审题的锅:1.不支持换乘!!! 2.所有公交车从0出发!!!!
因为时间只剩30min所以很着急qwq,初始化一直有问题
正解需要斜率优化,但是50分还是比较容易的:
#include
using namespace std;
#define int long long
const int N=1000010;
int n,f[N],c[N],v[N],maxc;
signed main()
{
freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);
scanf("%lld%lld",&n,&maxc);
for(int i=0;i=0;j--)
if((i-j)%c[j]==0) f[i]=min(f[i],f[j]+(i-j)/c[j]*v[j]);
for(int i=1;i<=n;i++)
{
if(f[i]==1e12) printf("-1 ");
else printf("%lld ",f[i]);
}
return 0;
}