20211115 NOIP 模拟赛

前言

日常垫底,人均会T2.jpg,就我不会,T1不开unordered_map.jpg,T飞了。

正题

T1:

F

ARC 124B

难度我觉的一般,比较好想,但由于不会map的遍历而GG了。
思路:
用一个哈希记录出现过的所有异或的值以及出现次数。
找到出现次数大于\(n\)次的数值,然后check。
check就反过去异或\(a[i]\),找所对应的的\(b[i]\)爱在不在。

比较重要的就是用auto遍历map。

#include<bits/stdc++.h>
using namespace std;
int n;
int a[2020],b[2020];
unordered_map<int,int> q;
vector<int> ans;
void check(int x){
	unordered_map<int,int> c;
	for(int i=1;i<=n;i++){
		c[b[i]]+=1;
	}
	for(int i=1;i<=n;i++){
		if(c[x^a[i]]){
			c[x^a[i]]--;
		}else{
			return ;
		}
	}
	ans.push_back(x);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int j=1;j<=n;j++){
		scanf("%d",&b[j]);
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			q[a[i]^b[j]]++;
	for(auto x:q){//没见过
		if(x.second>=n){
			check(x.first);
		}
	}
	cout<<ans.size()<<"\n";
	sort(ans.begin(),ans.end());
	for(auto x:ans){
		cout<<x<<"\n";
	}
	return 0;
}

T2 :

S

一道构造题,冯巨被超高的通过率震惊了。

思路:手摸样例就会发现是每三层一个对称弦图,这样递归即可。
还有就是\(10^9\)的ans要在\(O(1)\)内算出,看模数套公式即可,但我懒直接搞了个通项。

#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int N=2020;
int tem1[4][4]={{1,0},{0,1}};
int tem2[10][10]={{1,1,0,1},{0,0,0,1},{1,0,0,0},{1,0,1,1}};
int tem3[20][20]={{1,0,1,0,1,1},{1,0,1,0,0,0},{0,0,0,0,1,1},{1,1,0,0,0,0},{0,0,0,1,0,1},{1,1,0,1,0,1}};
int n,QWQ;
int a[N][N];
void pre(int x1,int y1,int x2,int y2){
	int len=x2-x1+1;
	if(len==2){
		for(int i=0;i<len;i++){
			for(int j=0;j<len;j++){
				a[x1+i][y1+j]=tem1[i][j];
			}
		}
	}else if(len==4){
		for(int i=0;i<len;i++){
			for(int j=0;j<len;j++){
				a[x1+i][y1+j]=tem2[i][j];
			}
		}
	}else if(len==6){
		for(int i=0;i<len;i++){
			for(int j=0;j<len;j++){
				a[x1+i][y1+j]=tem3[i][j];
			}
		}
	}else{//在外面三层构造一个弦图
		for(int i=y1;i<=y2-3;i+=2){
			a[x1][i]=a[x1+1][i]=1;
		}
		for(int i=y1+3;i<=y2;i+=2){
			a[x2][i]=a[x2-1][i]=1;
		}
		for(int i=x1;i<=x2-3;i+=2){
			a[i][y2-1]=a[i][y2]=1;
		}
		for(int i=x1+3;i<=x2;i+=2){
			a[i][y1+1]=a[i][y1]=1;
		}
		pre(x1+3,y1+3,x2-3,y2-3);//递归
	}
}
inline int read(){
	
}
signed main(){
	cin>>n>>QWQ;
	int ans=0;
	if(!QWQ){
		if(n==2){
			cout<<2<<endl;
		}else if(n==4){
			cout<<8<<endl;
		}else if(n==6){
			cout<<16<<endl;
		}else{
			ans=1ll*(n+1)*(n+1)/6;//公式
			cout<<ans*2<<endl;
		}
	}else{		
		pre(1,1,n,n);
		ans=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][j]){
					ans++;	
				}
			}
		}
		cout<<ans<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cout<<a[i][j]<<' ';
			}
			cout<<endl;
		}
	}
	
	return 0;
}

Y

ARC124E(冯巨以此来纪念他在NOI前一晚的那场比赛)

咕咕咕咕~~

来更新了,看大佬的题解根本看不懂啊。
%%%%%%%%%%%%%%%

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+10;
const int Mod=1e9+7;
int n,Ans,A[maxn],F[maxn][2];
inline int fast_pow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res*=x,res%=Mod;
		x*=x;
		x%=Mod;
		y>>=1;
	}
	return res%Mod;
}
inline int Add(int A,int B) {
	return A+=B,A>=Mod?A-Mod:A;
}
inline int S1(int S){
	return 1ll*S%Mod*(S+1)%Mod*fast_pow(2,Mod-2)%Mod;
}
inline int S2(int S){
	return 1ll*S%Mod*(S+1)%Mod*(2*S+1)%Mod*fast_pow(6,Mod-2)%Mod;
}

inline int calc(int St,int K){
	for(int i=0;i<=n+1;i++){
		F[i][0]=F[i][1]=0;
	}
	F[1][St]=1;
	for(int i=1;i<=n;i++){
		F[i+1][0]=Add(1ll*F[i][0]*S1(A[i]-K)%Mod,1ll*F[i][1]%Mod*(A[i]+1-K)%Mod);
		F[i+1][1]=Add((1ll*A[i]*S1(A[i])+Mod-S2(A[i]))%Mod*F[i][0]%Mod,1ll*F[i][1]*S1(A[i])%Mod);
	}
	return F[n+1][St];
}
signed main(){
	//cout<<fast_pow(2,4)<<endl;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
	}
	A[n+1]=A[1],Ans=Add(calc(0,0),Add(calc(1,0),Add(Mod-calc(0,1),Mod-calc(1,1))));
	cout<<Ans<<endl;
	return 0;
}

o

JOI Final 2020
咕咕咕咕

线段树板子有30分的样子,就维护一个区间最小值。

posted @ 2021-11-15 17:08  SSZX_loser_lcy  阅读(42)  评论(0编辑  收藏  举报