首页 > 其他分享 >ARC176D 做题记录

ARC176D 做题记录

时间:2024-04-22 18:33:38浏览次数:52  
标签:01 const 记录 ll dat ans ARC176D define

考场被创死了。

套路,枚举值域 \(i\),统计 \(\le i\) 和 \(>i\) 相邻的贡献。那么原排列对应一个 \(01\) 序列,其中 \(0\) 表示 \(\le i\),\(1\) 表示 \(>i\)。

然后拆贡献,考虑每个位置 \(j(1\le j<n)\),\(j,j+1\) 的组合有 \(00,01,10,11\),我们只关心每次交换后的组合会怎么变。

于是同一个组合的贡献是一样的,我们统计出四种组合各有多少个,然后矩阵快速幂算方案数。

反思:

考场上想了很多,想过 \(01\) 序列,想过 dp 优化。

但是却往 \(P_i>P_{i-1}\) 的方案数这个错误的方向想了很久,想了 1h 左右吧,最后才发现是个假做法。

想 \(01\) 序列时,却因认为“\(01\) 段个数统计”不可做而放弃了这个方向,而想不到每个位置分开贡献就好了。

还是想题不够老练,思路不够清晰,做题和比赛不够有经验。

菜就多练,但是一定要练!

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pir pair<ll,ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn=2e5+10, mod=998244353;
ll n,m,a[maxn],b[maxn],cnt0,cnt1,cnt2,ans;
struct mat{
	ll dat[3][3];
	const mat operator* (const mat t) const{
		mat res;
		for(ll i=0;i<3;i++)
			for(ll j=0;j<3;j++)
				res.dat[i][j]=(dat[i][0]*t.dat[0][j]+dat[i][1]*t.dat[1][j]
				+dat[i][2]*t.dat[2][j])%mod;
		return res;
	}
}base, ret;
int main(){
	scanf("%lld%lld",&n,&m);
	cnt2=n-1;
	for(ll i=1;i<=n;i++) scanf("%lld",a+i), b[a[i]]=i; ll tot=(n-1)*n/2%mod;
	for(ll i=1;i<n;i++){
		ll x=b[i];
		if(x>1){
			if(a[x-1]<i) --cnt1, ++cnt0;
			else --cnt2, ++cnt1;
		}
		if(x<n){
			if(a[x+1]<i) --cnt1, ++cnt0;
			else --cnt2, ++cnt1;
		}
		base.dat[0][1]=2*(n-i)%mod, base.dat[0][0]=(tot+mod-2*(n-i)%mod)%mod;
		base.dat[1][0]=i-1, base.dat[1][2]=n-i-1, base.dat[1][1]=(tot-(n-2)+mod)%mod;
		base.dat[2][1]=2*i%mod, base.dat[2][2]=(tot+mod-2*i%mod)%mod;
		base.dat[2][0]=base.dat[0][2]=0;
		ret.dat[0][0]=ret.dat[0][1]=ret.dat[0][2]=
		ret.dat[1][0]=ret.dat[1][1]=ret.dat[1][2]=
		ret.dat[2][0]=ret.dat[2][1]=ret.dat[2][2]=0;
		ret.dat[0][0]=ret.dat[1][1]=ret.dat[2][2]=1;
		ll t=m;
		while(t){
			if(t&1) ret=ret*base;
			base=base*base; t>>=1;
		}
		ll p=(cnt0*ret.dat[0][1]+cnt1*ret.dat[1][1]+cnt2*ret.dat[2][1])%mod;
		ans=(ans+p)%mod;
	} printf("%lld",ans);
	return 0;
}

标签:01,const,记录,ll,dat,ans,ARC176D,define
From: https://www.cnblogs.com/Sktn0089/p/18151203

相关文章

  • 记录如何用php做一个网站访问计数器的方法
    简介创建一个简单的网站访问计数器涉及到几个步骤,包括创建一个用于存储访问次数的文件或数据库表,以及编写PHP脚本来增加计数和显示当前的访问次数。方法以下是使用文件存储访问次数的基本步骤:创建一个文本文件来存储计数:在网站的根目录下创建一个名为counter.txt的文件,这个文......
  • 接口自动化Python+requests踩坑记录
    问题描述同一个接口,传参相同,用postman,jmeter等接口工具都能正常访问,后台也能正常返回数据,但是用requests.post()调用就会返回400jmeter传参以及响应这是一个登录接口,如图所示的传参,是可以正常登录的  postman传参以及响应可以看到,两个工具的传参不一样,但是也是同样可以正......
  • 记录真实项目中遇到的bug--010:支付截止bug
    T10:支付截止bug:1.优先级:T22.前提条件:已到截止时间,用户A未刷新页面3.预期结果:用户A点击支付宝,提示:支付已截止,并返回dashboard页面4.实际结果:用户A点击支付宝展示空白页5.缺陷跟踪:bug同步产品,告知先放着,只记录,不更改。6.总结:跟支付策略有关,无法修改原因:浏览器禁止用户在做异......
  • 数据湖问题记录跟进
    一、问题追踪问题详细描述提出问题时间是否完成计划完成时间备注了解Iceberg数据存储方式了解元数据存储信息、数据组织方式、查询时处理流程等20231013是20231019!!!20231124前均为大致的时间调研报告:调研报告-基于Iceberg构建湖仓一体平台调......
  • 记录:Flask 框架中,g对象的生命周期
    在Flask框架中,g对象是一个特殊的全局对象,它的设计目的是为了在不同的请求处理函数之间共享数据,但不需要将数据存储在session或数据库中。g对象的生命周期与当前的请求/响应周期紧密相关。以下是g对象生命周期的要点:创建:当一个请求到达Flask应用时,g对象会被创建并初始......
  • JPA使用问题总结记录
    1.jpa使用@OneToMany和@ManyToOne注解映射两个实体类的关系时报栈溢出的错误:>实体代码片段:①主表(一)@OneToMany(fetch=FetchType.EAGER,mappedBy="crewManagement",cascade=CascadeType.REMOVE)privateList<CrewMember>crewMemberList;②关联表(多)@ManyToOne@......
  • 新手学习记录丨Excel VBA(1)
    准备工作:开启ExcelVBA工作环境在MicrosoftExcel中,按键Alt+F11(或者Alt+Fn+F11)即可打开VBA编辑器。如下图所示,右键插入“模块”,即可开始在右侧的编辑器中编辑代码。实现最基本的任务:打印Helloworld在ExcelVBA中,字符串用双引号包围。我们可以使用MsgBox函数输出文......
  • Git的使用记录
    Git的使用配置:gitconfig是Git的一个强大命令。你可以使用Git配置文件来定制Git的工作方式。这个文件存在于初始化Git的项目目录(/project/.git/config)或用户根目录(~/.gitconfig)。如果没有指定配置,Git会使用其默认设置。使用如下命令可配置全局设置:gitconfig--gl......
  • 2023 5月 dp做题记录
    目录5月dp做题记录P1064[NOIP2006提高组]金明的预算方案P1941[NOIP2014提高组]飞扬的小鸟P2679[NOIP2015提高组]子串P1850[NOIP2016提高组]换教室P2831[NOIP2016提高组]愤怒的小鸟P5020[NOIP2018提高组]货币系统P6064[USACO05JAN]NaptimeGP9344去年天......
  • 2023 6月 dp做题记录
    目录6月dp做题记录P5664[CSP-S2019]Emiya家今天的饭P8867[NOIP2022]建造军营[ARC115E]LEQandNEQP3800Power收集P3594[POI2015]WIL6月dp做题记录P5664[CSP-S2019]Emiya家今天的饭分析条件,我们要选出来的菜的集合需要满足的限制,集合不为空和烹饪方法互不相同都好......