首页 > 其他分享 >暑假集训CSP提高模拟11

暑假集训CSP提高模拟11

时间:2024-07-29 19:18:38浏览次数:19  
标签:11 200001 int 短路 集训 ans id CSP dis

A.Fate

求次短路方案数.

这题有点小水了,好像之前做过.

具体的方案显然是 DP,考虑枚举当前每一个路径长度,假如比最短路更优则覆盖最短路,之前的最短路用来覆盖次短路. 否则如果比次短路更优,则直接覆盖次短路.

方案数的话考虑一样的方法维护,只是在遇到相等的路径长时使方案数加一即可.

考试的时候把转移写在最短路里面了,所以错了一遍,因为这样是不完全更新,所以要拉到外面跑一遍.

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1e9+7;
vector<int>e[200001];
int dis[200001],f[2][200001];
struct node{
    int id,dis;
    bool operator <(const node& A)const{
        return dis>A.dis;
    }
};
priority_queue<node>q;
void dij(int s){
    memset(dis,0x3f,sizeof dis);
    dis[s]=0;
    q.push({s,dis[s]});
    while(!q.empty()){
        node u=q.top();
		q.pop();
        if(dis[u.id]!=u.dis){
			continue;
		}
        for(int i:e[u.id]){
            if(dis[i]>dis[u.id]+1){
            	dis[i]=dis[u.id]+1;
				q.push({i,dis[i]});
			}
        }
    }
}
struct node_{
	int id,dis;
	bool operator <(const node_ &A)const{
		return dis<A.dis;
	}
}no[200001];
signed main(){
//	freopen("Fate9.in","r",stdin);
    int n,m,s,t;
    scanf("%lld %lld %lld %lld",&n,&m,&s,&t);
    for(int i=1;i<=m;++i){
        int u,v;scanf("%lld %lld",&u,&v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dij(s);
    for(int i=1;i<=n;++i){
		no[i].id=i;
		no[i].dis=dis[i];
	}
    sort(no+1,no+n+1);
    f[0][s]=1;
    for(int k=0;k<=1;++k){
        for(int i=1;i<=n;++i){
            for(int j:e[no[i].id]){
                if(dis[j]==dis[no[i].id]+1){
					f[k][j]+=f[k][no[i].id];
					f[k][j]%=p;
				}
                if(k==0 and dis[no[i].id]+1==dis[j]+1){
					f[1][j]+=f[0][no[i].id];
					f[1][j]%=p;
				}
            }
        }
    }
    printf("%lld",f[1][t]%p);
}

B.EVA

首先,把区间左端点放在一条鱼身上一定比较优,考虑到这个题 \(n\) 不是很大,可以枚举一遍左端点放在哪条鱼上.

其次,对于其他的鱼,可以考虑用相对速度算出它和当前鱼的相遇和离开时间,相遇时加上贡献,离开时减去贡献,计算途中最大值即可.

需要注意的是 \(v_{i}=v_{j}\) 时这么干会除以零,因为相对静止所以遇到这样的鱼直接在最初判一下就行了.

#include<bits/stdc++.h>
using namespace std;
const long double eps=1e-7;
int n,a,ans;
struct fish{
	int w,x,v;
}f[3001];
int main(){
	scanf("%d %d",&n,&a);
	for(int i=1;i<=n;++i){
		scanf("%d %d %d",&f[i].w,&f[i].x,&f[i].v);
	}
	for(int i=1;i<=n;++i){
		map<double,int>mp;
		int res=0;
		for(int j=1;j<=n;++j){
			if(f[i].v==f[j].v){
				if(f[j].x>=f[i].x and f[j].x-f[i].x<=a){
					res+=f[j].w;
				}
			}
			else{
				double l=(f[i].x-f[j].x)*1.0/(f[j].v-f[i].v);
				double r=(f[i].x-f[j].x+a)*1.0/(f[j].v-f[i].v);
				if(r-l<eps) swap(l,r);
				if(r>=0){
					l=max(l,0.0);
					mp[l]+=f[j].w;
					mp[r+eps]-=f[j].w;
				}
			}
		}
		ans=max(ans,res);
		for(auto i=mp.begin();i!=mp.end();i++){
			res+=i->second;
			ans=max(ans,res);
		}
	}
	printf("%d\n",ans);
}

C.嘉然登场

考虑一种策略:每次在插入 \(x\) 时,首先把所有 \(\ge k-x\) 的数全部放进去(也就是从大到小放),会发现,放完了之后,现在没放的数都是 \(i+x\lt k\) 的,因此全都不合法,而我们已经放入的数全部都是合法的.

新放的数不能与任何一个已经放过的 \(\le \lfloor\frac{k}{2}\rfloor\) 的数相邻,因此考虑插空算方案书,乘法原理算一下即可.

(\(e\) 是空位数量)

\[x(\ge \lfloor\frac{k}{2}\rfloor) C^{e-1}_{cnt_{x}+s-1},e=e+cnt_{x} \]

\[x(\lt \lfloor\frac{k}{2}\rfloor) C^{cnt_{x}}_{e},e=e-cnt_{x} \]

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=998244353;
int n,m,ans=1;
int a[200001],inv[200001];
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    int l=1,r=n;
    for(int i=1;i<=n;++i){
        ans=ans*(i-2*(l-1))%p;
        if(a[l]+a[r]>=m){
            r--;
        }
        else{
            l++;
        }
    }
    inv[0]=inv[1]=1;
    for(int i=2;i<=n;++i){
        inv[i]=(p-p/i)*inv[p%i]%p;
    }
    a[0]=a[n+1]=-1;
    int iv=1,cnt=1;
    for(int i=1;i<=n+1;++i){
        if(a[i]!=a[i-1]){
            ans=ans*iv%p;
            iv=cnt=1;
        }
        else{
            cnt++;
            iv=iv*inv[cnt]%p;
        }
    }
    cout<<ans<<endl;
}

D.Clannad

标签:11,200001,int,短路,集训,ans,id,CSP,dis
From: https://www.cnblogs.com/HaneDaCafe/p/18330729

相关文章

  • 暑假集训CSP提高模拟11
    暑假集训CSP提高模拟11组题人:@KafuuChinocpp\(T1\)P152.Fate\(24pts\)强化版:HDU1688Sightseeing设\(dis_{i,0/1}\)表示从\(s\)到\(i\)的最短路/次短路长度,\(f_{i,0/1}\)表示从\(s\)到\(i\)的最短路/次短路条数。\(dijkstra\)过程中按照路径长度与......
  • 『模拟赛』暑假集训CSP提高模拟11
    Rank昨天积攒的rp生效了!A.Fate签到题。次短路计数,感觉做过类似的,不过这里次短路定义为最短路长度+1,赛时把自环想成环了,原谅我犯唐。还是用dijkstra,我们这次开两个dis数组存最短路和次短路长度,然后两个cnt数组存二者的个数,稍微想想就能想到一共的四种可能:更新后......
  • 【C++11】C++11新纪元:深入探索右值引用与移动语义
    ......
  • CSP11
    CSP11T1暴力#include<bits/stdc++.h>#definespeed()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);#definelllonglong#defineullunsignedlonglong#definelid(rt<<1)#definerid(rt<<1|1)//#defineendl'\n'//#d......
  • 都是全志T113处理器,“-i”和“-S3”有什么区别?
    自9个月前,创龙科技“1片含税就79元”的全志T113-i双核[email protected]的工业核心板(SOM-TLT113)推出之后,不少嵌入式软硬件工程师、用户都咨询我们,究竟T113-i和T113-S3这两款处理器有什么区别?不同后缀型号的处理器,哪个更适合工业场景?今天,创龙科技就为大家深度揭秘,详细讲解......
  • spellman电源维修XRM50P50X3839 NY11788
    电源维修的常见故障包括:无法开机、电源烧、短路、输出偏小、电源不通电、电源风扇不转,无输出,缺项,输出过高,电源烧毁,灯不亮,不动作等故障维修。Spellman的专有高压技术,再加上MT电路,导致了一个紧凑和轻量级的模块,是理想的OEM应用布置来获得的高压输出,而较低的电压单元则采用稳健......
  • GLSL教程 第11章:性能优化和调试
    目录11.1GLSL着色器的性能考量11.1.1减少计算复杂度避免不必要的计算使用适当的数据类型优化数学操作11.1.2减少内存访问减少纹理采样次数使用纹理缓存11.1.3优化数据传输减少数据传输量批处理(Batching)11.1.4使用高级渲染技术LevelofDetail(LOD)延迟渲染......
  • 911、基于51单片机的温度报警(上下限,LCD)
    完整资料或代做滴滴我(有偿)目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能温度报警系统1、实时显示当前温度2、对上下限进行设定,通过按键设置3、温度高于上限或低于下限显示屏有相应提示,蜂鸣器响二、proteus仿真三......
  • CF1178D Prime Graph 题解
    首先考虑一个问题:如果没有边数是素数的限制,应该怎么构造?这其实很简单,把原图连成一个环即可,每个点度数为\(2\)。接着考虑在原图上加边,注意到\(3\)也是个素数,所以每次可以任意选两个度数为\(2\)的点连边,此时仍然符合条件。这样加边最多可以加\(\left\lfloor\frac{n}{2}\rig......
  • CSP2023&NOIP2023游记
    CSP(10.21)早上8:30开考,根据以往的经验,去考场去早了也只能白等着,所以这次差不多8:10才进考场(指的是进学校大门),到的时候发现我们机房的几个同学都先走了。先是普及组,希望拿个400,还是比较有信心的。J组8:30开始考试。先看了一下四道题,前三道都是直接看出了思路,T4感觉有点难度,到时候可......