洛谷 P4933 大师

news/2024/7/3 12:06:22

题面

 

(实名推荐:本题的出题人小哥哥打球暴帅哦!(APIO/CTSC/WC的时候一起打过球w,而且大学在我隔壁喔) )

没仔细看数据范围的时候真是摸不着头脑。。。还以为要 O(N^2) dp 爆锤。。

后来发现v<=20000,这能干啥呢?

至少我的暴力是可以趁机跑过了2333,暴力如下:

    我们枚举每一种公差,然后每一轮     先把所有 a[j]-a[i]=公差 的 i在图中连一条到j的边(i<j), 再跑一遍拓扑排序求这种公差的方案数。(因为任意一种选法都可以且仅可以对应到唯一的一轮的建出的DAG(为什么是DAG这个不用证吧。。。)上的一条链,我们直接统计总链数即可)

 

    这里有一点疏忽,因为仅仅一个数构成等差数列这种情况会在每一轮都被算一遍,而我们最后只需要算它一次。一种解决办法是把每轮的答案-n,然后所有算完了之后再+n。

 

算一下这个暴力的复杂度,O(2*N^2*log(N) + N*V ),后面拓扑排序总边数的 O(N^2)被前面更大的那个复杂度给按下去了,而那个复杂度是因为我懒得写基数排序而多出来的,但因为本题 2*N^2*log(N) 与 N*V 在 N与V同时取到最大值的时候恰好相等,所以我就懒得优化这个玩意了hhhh

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=1005,ha=998244353;

inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;}

vector<int> g[N];
int f[N],n,h[N],num,ans,id[N];
struct node{
	int x,y,z;
	bool operator <(const node &u)const{
		return z<u.z;
	}
}a[N*600+5];

inline void TSort(){
	queue<int> q;
	for(int i=1;i<=n;i++) if(!id[i]) q.push(i);
	
	for(int x;!q.empty();q.pop()){
		x=q.front(),ADD(ans,f[x]);
		for(int i:g[x]){
			ADD(f[i],f[x]);
			if(!(--id[i])) q.push(i);
		}
	}
}


inline void solve(){
	for(int i=1;i<n;i++)
	    for(int j=i+1;j<=n;j++) a[++num]=(node){i,j,h[j]-h[i]};
	sort(a+1,a+num+1);
	
	for(int i=1,j;i<=num;i=j){
		fill(f+1,f+n+1,1),j=i,memset(id,0,sizeof(id));
		for(int i=1;i<=n;i++) g[i].clear();
		
		while(j<=num&&a[j].z==a[i].z) g[a[j].x].pb(a[j].y),id[a[j].y]++,j++;
		
		TSort(),ADD(ans,ha-n);
	}
	
	ADD(ans,n);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",h+i);
	solve(),printf("%d\n",ans);
	return 0;
}

  

 

转载于:https://www.cnblogs.com/JYYHH/p/11299439.html


http://www.niftyadmin.cn/n/4646371.html

相关文章

Netty之SubPage级别的内存分配

SubPage 级别的内存分配: 通过之前的学习我们知道, 如果我们分配一个缓冲区大小远小于page, 则直接在一个page 上进行分配则会造成内存浪费, 所以需要将page 继续进行切分成多个子块进行分配, 子块分配的个数根据你要分配的缓冲区大小而定, 比如只需要分配1KB 的内存, 就会将一…

laravel报错 : laravel Please provide a valid cache path

这是因为laravel的缓存路径没有找到 laravel缓存文件路径是在 config/cache.php中设置&#xff0c;默认存在storage文件夹中 file > [driver > file,path > storage_path(framework/cache/data),], 解决 需要保证storage/framework下面创建 sessions&#xff0c; vie…

使用Pull解析XML获取新浪新闻

目标是获取新浪新闻如图所示位置的头条新闻数据&#xff1a; 思路是这样的&#xff0c;先访问这个首页拿到这个部分每一条新闻的url&#xff0c;然后再逐一访问这些详情页面&#xff0c;从详情页面获取标题正文图片等数据。 1.通过HttpUrlConection向网页发送数据并分析返回数…

位运算记录

作为在互联网领域工作的程序员啊&#xff0c;我们需要不断地学习。自己也坚持每天刷一两个 LeetCode 题目&#xff0c;在刷题的过程中&#xff0c;发现有不少题目都涉及到一些位运算的知识&#xff0c;这篇文章记录一下。 介绍运算 按位与(&)按位或(|)按位异或(^)左移(<…

只手遮天

.. 用这个作为这~ 一连5篇的结束 .. 有感而发&#xff0c;写段文字 .. 读大学时&#xff0c;自我感觉不太会说话&#xff0c;显得相当的木纳&#xff0c;对许多人除了微笑讲不上几句 .. 如今&#xff0c;已经会说话&#xff0c;而且也会分场合 .. 说话时&#xff0c;我的话仍然…

spring boot 开启https

1.生成证书 keytool -genkey -alias tomcat -keyalg RSA -keystore E:/https.keystore将生成好的证书放在项目根目录即可 2 修改配置文件 server:port: 443servlet:context-path: /tomcat:uri-encoding: UTF-8max-threads: 1000min-spare-threads: 30ssl:#生成证书的名字key-st…

从github上的优秀实例看MVP模式

github上有一个关于MVP模式学习的实例https://github.com/antoniolg/androidmvp&#xff0c;虽然只有简单的几个类&#xff0c;却收获了几千个星。这个例子确实通俗易懂&#xff0c;直观的体现出了MVP模式的特点&#xff1a; 考虑这样一个需求&#xff0c;页面显示一个列表&…

显著减少项目gradle编译时间

原文来自https://zeroturnaround.com/rebellabs/making-gradle-builds-faster/ 1.对build过程进行配置实现编译优化&#xff1a; &#xff08;1&#xff09;首先了解如何用命令行进行编译&#xff1a; 使用git命令行进入项目根目录&#xff0c;然后执行 ./gradlew :app:asse…