首页 > 其他分享 >Educational Codeforces Round 157 (Rated for Div. 2)

Educational Codeforces Round 157 (Rated for Div. 2)

时间:2023-11-06 11:56:22浏览次数:31  
标签:pre Educational Rated Mat 157 int res 钦定 ch

F. Fancy Arrays

第一眼感觉是去容斥掉条件 1,因为条件 2 其实挺紧的。

不妨用 \(f(l,r)\) 表示 \(a\) 值域在 \([l,r]\) 的方案(满足条件 2)。

那么答案为 \(f(0,+\infty)-f(0,x-1)-f(x+k,+\infty)\),因为如果选了 \([0,x-1]\) 的数,那么还要更大的话,一定会选到 \([x,x+k-1]\),所以你要钦定没有的话,一定只能在 \([0,x-1]\) 里面选。\(>x+k-1\) 同理。

考虑 \(+\infty\) 的上界很烦,能不能合并下消去,\(f(0,+\infty)-f(x+k,+\infty)\) 是啥?显然是存在一个数在 \([0,x+k-1]\) 的方案数。抽象到二维平面上便可以很好的解释。或者考虑二者的集合对称差,显然是 \([0,x+k-1]\) 这意味着二者减去之后一定是存在一个数在 \([0,x+k-1]\) 的方案数。考虑咋做。这个东西等价于最小值在这个区间的方案数,考虑钦定差分数组,接下来,记差分数组的前缀最小值为 \(mi\),那么最小值显然为 \(a_1+mi\),考虑钦定 \(a_1+mi\) 落在那个区间即可。而你会发现,我们这样钦定实际上对于差分数组是没有限制的。那这样钦定一定不重不漏吗?考虑一个序列,显然一定会被钦定到。接下来,再考虑一个序列,会被钦定几次?你注意到,对于一种确定的差分数组,其最小值的位置/位置集是唯一的。也就是说,我们钦定后,构造出来的一定是互不相同的。

接下来 \(f(0,x-1)\) 这一部分直接 \(dp\) 即可。注意到,这种东西实际上是可以抽象成 DAG 数路径数的,这东西直接矩阵加速即可。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int mod=(int)(1e9+7);
int n,K,X;

int fpow(int x,int y) {
	int res=1; x%=mod;
	while(y) {
		if(y&1) res=res*x%mod;
		y>>=1; x=x*x%mod;
	} return res;
}

struct Mat {
	int a[41][41];
	Mat() {
		memset(a,0,sizeof(a));
	}
	void clr() {
		memset(a,0,sizeof(a));
	}
}E,F;

Mat mul(Mat &f,Mat &g) {
	Mat res;
	for(int i=0;i<X;i++)
		for(int j=0;j<X;j++)
			for(int k=0;k<X;k++)
				res.a[i][j]=(res.a[i][j]+f.a[i][k]*g.a[k][j]%mod)%mod;
	return res;
}

void sol() {
	cin>>n>>X>>K;
	int ans=fpow(2*K+1,n-1)*(X+K)%mod;
	E.clr(); F.clr();
	for(int i=0;i<X;i++) F.a[0][i]=1;
	for(int i=0;i<X;i++) {
		for(int j=0;j<X;j++) {
			if(abs(i-j)<=K) E.a[i][j]=1;
		}
	}
	int qwq=n-1;
	while(qwq>0) {
		if(qwq&1) F=mul(F,E);
		qwq>>=1; E=mul(E,E);
	}
	for(int i=0;i<X;i++) ans=(ans-F.a[0][i]+mod)%mod;
	cout<<(ans%mod+mod)%mod<<'\n';
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) sol();
	return 0;
} 

D.XOR Construction

注意到如果确定了第一个,其他一定是确定的。

即 \(b_i=pre_{i-1}^b_1\),\(pre\) 为 \(a\) 的前缀异或。

那么限制有两个,一个是均不相同。

不妨考虑相同,即 \(pre_{i-1}^b_1=pre{j-1}^b_1\),即二者 \(pre\) 相同,这与我们选取 \(b_1\) 是无关的。

另一个限制就是最大的数 \(\le n-1\),这个限制我们直接变成 check 每个开头是否合法,变成最大异或扔到 01trie 上即可。

#include <bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
const int N=(int)(4e5+5);
int n,a[N],b[N],pre[N],ch[2][N*22],tot=1;

void ins(int x) {
	int p=1;
	for(int i=20;i>=0;i--) {
		bool c=((x>>i)&1);
		if(!ch[c][p]) ch[c][p]=++tot;
		p=ch[c][p];
	} 
}

int qry(int x) {
	int res=0,p=1;
	for(int i=20;i>=0;i--) {
		bool c=((x>>i)&1);
		if(ch[c^1][p]) {
			res|=(1<<i);
			p=ch[c^1][p];
		} else p=ch[c][p];
	}
	return res;
}

void sol() {
	for(int i=2;i<=n;i++) b[i]=(pre[i-1]^b[1]);
	for(int i=1;i<=n;i++) cout<<b[i]<<' ';
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<n;i++) cin>>a[i];
	for(int i=1;i<n;i++) pre[i]=(pre[i-1]^a[i]);
	for(int i=1;i<n;i++) ins(pre[i]);
	for(int i=0;i<n;i++) {
		int qwq=qry(i);
		if(qwq<=n-1) {
			b[1]=i; sol(); return 0;
		}
	}
	return 0;
} 

标签:pre,Educational,Rated,Mat,157,int,res,钦定,ch
From: https://www.cnblogs.com/xugangfan/p/17812340.html

相关文章

  • 关于topology generated by functions的一些思考
      平时所学的拓扑都是直接给出开集族或者是basisorsubbasis,然后由basisorsubbasis生成拓扑。  前些天看Kechris时,遇到了weaktopology。泛函分析时学过weakconvergence,但没有接触过weaktopology。  它给出的定义是generatedbyfunctions………看到的时候就很纳闷到......
  • Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) B. Kuroni an
    Problem-1305B-Codeforces 啦啦啦,这题题目有点长,概括一下就是,希望将所有()匹配的括号去掉问你需要操作多少次 双指针,一个i一个j,从前往后记录匹配的括号如果发现:1.括号匹配2.i<jok,就放入ans (⊙o⊙)…,最后记得sort一遍ans,第一遍因为这个wa了一发 #include......
  • Educational Codeforces Round 157 (Rated for Div. 2)
    A.TreasureChest分类讨论一下,只有两种情况。走到钥匙处,然后走到箱子处走到箱子处,移动箱子,走到钥匙处,走回箱子处对于第二种情况可以直接枚举箱子被移动到的位置#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;usingpi......
  • Educational Codeforces Round 157 (Rated for Div. 2) D. XOR Construction
    题目链接题意给你\(n-1\)个整数\(a_1,a_2,\dots,a_{n-1}\)。你的任务是构造一个数组\(b_1,b_2,\dots,b_n\),使得:从\(0\)到\(n-1\)的每个整数都在\(b\)中出现一次;对于从\(1\)到\(n-1\)的每个\(i\),\(b_i\oplusb_{i+1}=a_i\)(其中\(\oplus\)表示......
  • How to format lists in pandoc-generated docx documents?
    Sorry,thelistindentationsarecurrentlyhard-codedandcan'tbecustomized.Youcould,however,postprocessthedocxproducedbypandoc,changingthefilenumbering.xmlinthedocxcontainer.Oryoucouldmodifythesourcecodeandrecompile.Thes......
  • Educational Codeforces Round 134 (Div.2) D 题解
    题目链接D.MaximumAND题目大意给定两组序列\(a\)\(b\),长度为\(n\),现有一新序列\(c\),长度也为\(n\)。其中,\(c_i=a_i\oplusb_i\)。定义\(f(a,b)=c_1\&c_2\&……\&c_n\)。现在你可以随意编排\(b\)序列的顺序,求\(f(a,b)\)的最大值。思路以下位运算均是......
  • Educational Codeforces Round 128 (Rated for Div. 2)
    添加链接描述C题显然二分0的数量,然后双指针,算一下前缀和后缀1的数量即可。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#defineAputs("YES")#defineBputs("NO&q......
  • mysql数据库管理-FEDERATED存储引擎远程链接MYSQL
    开启FEDERATED存储引擎1.1、查看存储引擎存在的FEDERATED存储引擎就配置文件开启不存在就安装查看showengines;YES支持并开启DEFAULT支持并开启,并且为默认引擎;NO不支持;DISABLED支持,但未开启。创建federated引擎表创建语句最好和原表语句一样,当然去掉id的auto之类的。CREATE......
  • CF1572F Stations 题解-Segment Tree Beats
    20231025CF1572FStations题解-SegmentTreeBeats吉司机线段树好题!!!CF3400。传送门Statement有\(n\)个广播站,第\(i\)个广播站高度为\(h_i\),范围为\(w_i\)。初始\(h_i=0,w_i=i\)。广播站\(i\)能向广播站\(j\)传递消息,当且仅当\(i\lej\lew_i\),且\(h_i>\max\lim......
  • [转]Oracle数据文件损坏的模拟和修复(一) |ORA-01578 data block corrupted|
    造成数据块损坏的原因通常是由于开启了异步I/O或者增加了写进程,还有可能是硬件引起的,今天模拟一下该问题的发生及修复方法。由于水平有限,那面疏漏,欢迎大家指正。 创建测试环境建立测试表空间:123456create tablespacetestdatafile  '/u02/oradata/logdw......