codeforces 2218
次こそはですね私は
下次真的要结束了
Codeforces Round 1090 (Div. 4)
D. The 67th OEIS Problem 1039

令 \(p_i\) 表示第 \(i\) 个质数,然后令 \(a_i=p_i\times p_{i+1}\),这样的话 \(\text{gcd}(a_i,a_{i+1})=\text{gcd}(p_i\times p_{i+1},p_{i+1}\times p_{i+2})=p_{i+1}\)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=1e6+5;
int prime[N];
bool vis[N];
inline void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cout<<prime[i]*prime[i+1]<<' ';
}
cout<<'\n';
}
signed main(void){
cin.tie(NULL)->sync_with_stdio(false);
vis[1]=true;
int cnt=0;
prime[++cnt]=1;
for(int i=2;i<=1000000;i++){
if(vis[i]) continue;
prime[++cnt]=i;
for(int j=i;j<=1000000;j+=i){
vis[j]=true;
}
}
// cerr<<cnt<<endl;
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
5
4 3 2 5 1
*/
E. The 67th XOR Problem 1242

设这次删除 \(a_i\),那么\(a_j=a_j \oplus a_i\),\(a_k=a_k \oplus a_i\),再删除 \(a_j\),会使得 \(a_k=a_k \oplus a_i \oplus a_j \oplus a_i=a_k \oplus a_j\),正好消掉中间项,所以可以 \(n^2\) 枚举 \(a_i \oplus a_j\) 最后一项来求出最大值。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x;
const int N=1e5+5;
int a[N];
inline void solve(){
cin>>n;
int res=0;
for(int i=1;i<=n;i++){
cin>>a[i];
res^=a[i];
}
int maxn=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
maxn=max(maxn,a[i]^a[j]);
}
}
cout<<maxn<<'\n';
}
signed main(void){
cin.tie(NULL)->sync_with_stdio(false);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
5
4 3 2 5 1
*/
F. The 67th Tree Problem 1533

可以考虑构建一个菊花图,首先根节点的奇偶性是根据 \(x+y\) 来决定的。然后任意一个节点连到根节点上就是一个奇节点,在这个节点上再接一个就是一个奇节点一个偶节点。所以说一个偶节点必须有一个奇节点。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=3e5+5;
int x,y;
inline void solve(){
cin>>x>>y;
if(y==0||((x+y)%2==0&&!x)){
cout<<"NO\n";
return;
}
if((x+y)%2==1){
y--;
}
else{
x--;
}
if(x>y){
cout<<"NO\n";
return;
}
cout<<"YES\n";
for(int i=1;i<=x;i++){//x个偶
cout<<"1 "<<i+1<<"\n";
}
for(int i=1;i<=x;i++){//x个偶
cout<<i+1<<" "<<i+x+1<<"\n";
}
for(int i=1;i<=y-x;i++){
cout<<"1 "<<2*x+i+1<<"\n";
}
}
signed main(void){
cin.tie(NULL)->sync_with_stdio(false);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
5
4 3 2 5 1
*/
G. The 67th Iteration of "Counting is Fun" 1837

第 \(i\) 个人在时间 \(t\) 坐下有两个条件,一是已经有 \(a_i\) 个人在 \(t\) 之前坐下,二是 \(i-1\) 或者 \(i+1\) 中最早坐下的时间小于 \(t\) ,即 \(min(b_{i-1},b_{i+1})<t\)
对于第 \(i\) 个人,因为 \(b_i\) 是确定的,我们先找邻居的条件是否满足,\(min(b_{i-1},b_{i+1})\)
记 \(sum_i\) 表示到时间 \(i\) 有夺少人已经坐下。
-
如果 \(min(b_{i-1},b_{i+1})= t-1\),说明第一个条件随时都可以满足,\(a_i\) 的取值范围是 \([1,sum_{t-1}]。\)
-
如果 \(min(b_{i-1},b_{i+1})< t-1\),说明第一个条件必须得满足 \(sum_{t-1}\geq a_i > sum_{t-2}\),\(a_i\) 的取值范围是 \((sum_{t-2},sum_{t-1}]。\)
-
如果 \(min(b_{i-1},b_{i+1})> t-1\),违反条件。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N=3e5+5;
const int mod=676767677;
int b[N];
int cnt[N],sum[N];
inline void solve(){
cin>>n>>m;
for(int i=0;i<=max(n,m);i++){
cnt[i]=sum[i]=0;
}
for(int i=1;i<=n;i++){
cin>>b[i];
cnt[b[i]]++;
}
sum[0]=cnt[0];
for(int i=1;i<=m;i++){
sum[i]=sum[i-1]+cnt[i];
// cerr<<sum[i]<<" ";
}
// cerr<<endl;
int ans=1;
for(int i=1;i<=n;i++){
if(b[i]==0) continue;
int minn=LONG_LONG_MAX;
if(i>1){
minn=min(minn,b[i-1]);
}
if(i<=n-1){
minn=min(minn,b[i+1]);
}
// cerr<<"???"<<minn<<endl;
if(minn==b[i]-1){
ans=ans*(sum[b[i]-1])%mod;
}
else if(minn<b[i]-1){
int lst=0;
if(b[i]-2>=0){
lst=sum[b[i]-2];
}
else{
lst=0;
}
ans=ans*(sum[b[i]-1]-lst)%mod;
}
else{
cout<<0<<'\n';
return;
}
}
cout<<ans<<'\n';
}
signed main(void){
cin.tie(NULL)->sync_with_stdio(false);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
5
4 3 2 5 1
*/
后日谈:
明天要考蓝桥杯了,但是我才发现我没报名,正在想怎么和队长说TvT

浙公网安备 33010602011771号