首页 > 其他分享 >CSP提高组模拟1

CSP提高组模拟1

时间:2024-07-12 16:22:32浏览次数:11  
标签:mat val lazyP int 提高 long st CSP 模拟

我的微軟輸入法莫名其妙變成繁體了,你們有什麽頭緒嗎

狀態 題目
20 Time Exceeded A 最短路
25 Time Exceeded B 方格取数
0 Time Exceeded C 数组
70 Time Exceeded D 树

A.最短路

我赛时想了想,会不会 DIJ 不是很对,因为这个题在打的时候觉得,在跑最短路的时候沿途加上点权有点草率了,但是后面没写完,所以也没回来想

有点像

我四十分的物理卷子

(内心):你做的这个对吗

我:管它呢,先画个圈,一会回来想,要不写不完了

(内心):你本来也写不完,要不再看看这题

(在想起一些不好的回忆(因为太磨叽挂了五十分)之后,还是毅然地跳了)

(过了一会)

(内心):跳了这么多,你这不也没写完

我:我草我前面还有题没想

所以这个题还是用 Floyed,为啥要点权从小到大排序,其实这么一听觉得真是太对了,但是我懒得想了,所以还是三遍 Floyed 来得实在(只需要保证完全更新就行了)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f3f3f3f3f;
int mp[301][301];
int dis[301][301];
int w[301];
int n,m,q;
void floyd(){
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int p=mp[i][k]+mp[k][j]+max(dis[i][k],dis[k][j]);
                if((p<mp[i][j]+dis[i][j])&&mp[i][k]<inf&&mp[k][j]<inf){
                    mp[i][j]=mp[i][k]+mp[k][j];
                    dis[i][j]=max(dis[i][k],dis[k][j]);
                }
            }
        }
    }
}
signed main(){
	freopen("path.in","r",stdin);
	freopen("path.out","w",stdout);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) mp[i][j]=0;
            else mp[i][j]=inf;
        }
    }
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        if(mp[x][y]>z){
            mp[x][y]=z;
            mp[y][x]=z;
            dis[x][y]=max(w[x],w[y]);
            dis[y][x]=max(w[x],w[y]);
        }
    }
    floyd();floyd();floyd();
    for(int i=1;i<=q;i++){
        int x,y;
        cin>>x>>y;
        int res=mp[x][y]+dis[x][y];
        cout<<(res>=0x3f3f3f3f3f3f3f3f?-1:res)<<endl;
    }
}

B. 方格取数

这个题的 \(n^4\) 挺好想的,我因为没什么头绪打的也是 \(n^4\) 暴力,没想到还能拿点分

如果有一个点大于等于 \(k\) 且小于等于 \(2k\) ,那么我们直接输出这个点即可

如果有一个点大于 \(2k\) ,那么我们一定不可以选这个点,和包括它的矩形

那么现在这个矩阵上只剩下不能选的点和权值小于 \(k\) 的点了,否则跑不到这里就输出答案了.

因此我们现在在这个简化的矩阵上考虑答案

我们可以考虑先找出一个最大的矩阵,即使它的权值大于 \(2k\),在我们一点点减少的过程中,因为所有节点都小于 \(k\),一定会在 \([k,2k]\) 内出现一次,因此直接大力删就行了. 删下来以后(其实就是切开了)要判一下哪边比较大(或者直接合法了,那更好)

洛谷上过了,咱们题库上 \(n\) 和 \(k\) 居然是反的,答案坐标也是反的 ,题库上莫名其妙 T 了, \(40\) 分,懒得改了,这并不是 AC 代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 2001
int k,n;
long long a[N][N];
long long sum[N][N];
int up[N][N],leftt[N],rightt[N];
long long ask(int lx,int ly,int ux,int uy){
	return sum[ux][uy]-sum[lx-1][uy]-sum[ux][ly-1]+sum[lx-1][ly-1];
}
long long sumx;
int mat_sx,mat_sy,mat_ex,mat_ey;
void cutline(int x,int l,int r){
	sumx=ask(x,l,x,r);
	for(int i=r;i>=l;--i){
		sumx-=a[x][i];
		if(sumx>=k and sumx<=(k<<1)){
			printf("%d %d %d %d",x,l,x,i-1);
			exit(0);
		}
	}
}
void update(int lx,int ly,int ux,int uy){
	long long t=ask(lx,ly,ux,uy);
	if(t>=k and t<=(k<<1)){
		printf("%d %d %d %d",lx,ly,ux,uy);
		exit(0);
	}
	if(t>sumx){
		sumx=t;
		mat_sx=lx,mat_sy=ly,mat_ex=ux,mat_ey=uy;
	}
}
stack<int>st;
signed main(){
	freopen("matrix.in","r",stdin);
	freopen("matrix.out","w",stdout);
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			cin>>a[i][j];
			sum[i][j]=sum[i][j-1]+a[i][j];
			if(a[i][j]>=k and a[i][j]<=(k<<1)){
				printf("%d %d %d %d",i,j,i,j);
				return 0;
			}
		}
		for(int j=1;j<=n;++j){
			sum[i][j]+=sum[i-1][j];
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			if(a[i][j]<k){
				up[i][j]=up[i-1][j]+1;
			}
		}
		while(!st.empty()) st.pop();
		st.push(0);
		up[i][0]=-1;
		for(int j=1;j<=n;++j){
			while(!st.empty() and up[i][st.top()]>=up[i][j]) st.pop();
			leftt[j]=st.top()+1;
			st.push(j);
		}
		while(!st.empty()) st.pop();
		st.push(n+1);
		up[i][n+1]=-1;
		for(int j=n;j>=1;--j){
			while(!st.empty() and up[i][st.top()]>=up[i][j]) st.pop();
			rightt[j]=st.top()-1;
			st.push(j);
			if(up[i][j]) update(i-up[i][j]+1,leftt[j],i,rightt[j]);
		}
	}
	if(sumx<k){
		printf("-1\n");
		return 0;
	}
	for(int i=mat_ex;i>=mat_sx;--i){
		long long t=ask(i,mat_sy,i,mat_ey);
		if(t>=k and t<=(k<<1)){
			printf("%d %d %d %d",i,mat_sy,i,mat_ey);
			return 0;
		}
		else if(t>(k<<1)){
			cutline(i,mat_sy,mat_ey);
		}
		else{
			sumx-=t;
			if(sumx>=k and sumx<=(k<<1)){
				printf("%d %d %d %d",mat_sx,mat_sy,i-1,mat_ey);
				return 0;
			}
		}
	}
}

C.数组

没想到搞了半天,线段树写对了,状压写对了,\(tag\) 写对了(其实是没写对,但是差不多对了),但是求 \(\phi\) 的时候寄了

标签:mat,val,lazyP,int,提高,long,st,CSP,模拟
From: https://www.cnblogs.com/HaneDaCafe/p/18298646

相关文章

  • 2024.7.12 模拟赛
    A容易观察到每个“\(1\)”相当于是独立的,那么其位置越靠后越优,则对于\(i=1\ton-1\),每次都为\(a_i\)选择一个最大的满足\(i+2^t\leqn\)的\(t\)全部进行操作最优。使用__builtin_clz函数做到\(O(n)\),暴力算\(t\)做到\(O(n\logV)\)。B要想求出每个前缀的答案,就......
  • PGSQL快速生成模拟数据
    背景有时候,我们为了测试数据库的性能,通常需要快速构建测试数据,PgSql提供了快速构建数据的工具,方便我们能够快捷的构建模拟数据。生成函数顺序生成生成SQL--生成一批顺序值SELECTidFROMGENERATE_SERIES(1,10)t(id);结果id1234......
  • 利用产品用途功能,提高业务效率与信息安全
    随着企业业务的不断发展和市场环境的日益复杂,进销存软件作为企业管理的重要工具,其产品用途功能的应用前景愈发广阔。以销售员为例,在传统的进销存管理中,销售员往往能够接触到包括售卖成品原料信息在内的所有产品信息。然而,在实际业务场景中,销售员并不需要了解这些原料信息,......
  • 旧衣回收小程序开发,提高回收效率,实现创收
    随着人们生活水平的提高,对穿衣打扮也越来越重视,衣服更换频率逐渐增高,旧衣回收行业因此产生,并随着市场规模的扩大,拥有了完善的回收产业链,旧衣回收行业的发展不仅能够让大众获得新的赚钱方式,也为我国资源回收利用、保护环境做出了贡献。一、旧衣回收小程序特点旧衣回收市场的......
  • 一文解析:如何提高IP纯净度?
    IP的“清白度”,简而言之,是指一个IP地址在网络环境中的清洁与可信度水平。它反映了该IP地址是否涉及非法活动、是否被滥用,以及是否因频繁异常行为而被网络服务提供商、防火墙或安全系统视为可疑。一个高“清白度”的IP地址,如同网络空间中的一位信誉卓越的公民,能够享受更加自由、......
  • HumanoidBench——模拟仿人机器人算法有未来
    概述论文地址:https://arxiv.org/pdf/2403.10506仿人机器人具有类似人类的外形,有望在各种环境和任务中为人类提供支持。然而,昂贵且易碎的硬件是这项研究面临的挑战。因此,本研究开发了使用先进模拟技术的HumanoidBench。该基准利用仿人机器人评估不同算法的性能,其中包括各......
  • 操作系统课程设计-模拟文件管理系统java实现
    模拟文件管理系统学校的期末课程设计,进行一个简单的分享,不足之处请各位大佬指正。一、主要内容综合运用操作系统理论知识和编程知识设计实现一个可视化操作的文件管理模拟系统,该系统包含的基本信息:创建用户、登录用户、创建文件、删除文件、打开文件、显示文件、关闭文......
  • YC312A [ 20240702 CQYC省选模拟赛 T1 ] 第一题(diyiti)
    题意给定一个长度为\(n\)的可重集,以及正整数\(k\)。设一个子集的价值为子集中最大值减去最小值,你需要将这个可重集划分为\(k\)个子集,使得价值之和最小,子集需要满足不重。\(n,k\le100\)。Sol思考一下发现如果不记录每个子集的信息是不好做的。考虑将所有子集的大小记......
  • NOIP2024模拟2
    NOIP2024模拟2都不会,哈哈哈我在此发表暴论,在\(T4\)放签到题的都是SB。做不出来的更SB。T1:酸碱度中和签到题。排序,二分答案,记录一下这一组的最小的,最小的和最多的差大于二倍答案就新开一组。T2:聪明的小明状压。50pts是显然状压,考虑延续其思路。压出状态发现只有......
  • P1039[NOIP2003提高组]侦探推理
    暂时未完成qwq[NOIP2003提高组]侦探推理(这道题思路很简单,但是细节一大堆qwq,调吐了QAQ这个题一共就20个人,星期一共就有7种可能,100句证词,所以可以直接暴力枚举,看一看假设第$i$个人是罪犯(guilty),今天是星期$j$,那么一共有几个人说了谎话。然后就好了awa…………了吗……这......