题外话
被教育了,读题不认真,明明能四题的(靠),竟然打不过jy,很烦
A
A题意
给你n,m(m是奇数的数量)问你是否可以使用m个奇数(不相同的)构成n
A思路
自己上来以为是判断奇偶就死了
其实还有点其他的东西,比如k个互不相同的奇数最小就是k*k(记录一下)
A代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
ll n , k ;
int ar[1000010];
int br[100010];
ll res =0 ;
int main()
{
int n;cin >>n;
while (n--){
int a, b;cin>>a>>b;
int num =0 ;
if(a%2 == b%2 && b <= sqrt(a)){
cout<<"Yes"<<endl;
continue ;
}
else cout<<"NO"<<endl;
}
return 0;
}
B
题意
题面挺长的,其实就是一个简单的模拟,问题就是让你给国王的女儿分配王子,不能分配的就optimal,不然就imporve(自己一开始以为是二分图。。有点尴尬)
思路
判断每个公主,是否有一个王子对应, 没有的话,就可以improve , 不然就是optimal
注意,只能添加一次
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
ll n , k ;
int ar[1000010];
int br[100010];
ll res =0 ;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t;cin >>t;
while(t--){
int n;cin >>n;
map<int ,int >mp;
// memset(ar, 0 ,sizeof ar);
int flag=0 ;int pos =0;
for(int i=0 ;i<n;i++){
int f =0 ;
cin >>ar[i];
for(int j=0;j<ar[i];j++){
int b; cin >>b;
if(mp[b]==0 &&f==0 ){
mp[b] ++ ;
f =1 ;
}
}
if(!f){
flag =1 ;
pos =i+1 ;
}
}
if(!flag ){
cout<<"OPTIMAL"<<endl;
continue ;
}
cout<<"IMPROVE"<<endl;
for(int i=1;i<=n;i++)if(!mp[i]){
cout<<pos <<" "<< i <<endl;
break;
}
}
return 0;
}
C
题意
就是问你是否有一种方案,可以让所有的芯片至少通过一次给定的位置
思路
**注意, 最长不能够超过2mn,然后,每个位置可以放置多个芯片,* 这意味着,你可以先把所有芯片放到(1,1),然后蛇形排列,就好了
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
ll n , k, m ;
string v;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
// int i ;
n =read(), m = read() ;
rep(i,0,m-1)v.pb('L') ;
rep(i,0,n-1)v.pb('U');
rep(i,0,n){
if(i%2==0)rep(j,0,m-1)v.pb('R');
else rep(j,0,m-1)v.pb('L');
v.pb('D');
}
cout<<SZ(v)<<endl;
printf("%s
", v.c_str());
return 0;
}
E
题意
让你在【1,(10^n)-1】里面找出所有n个连续相同的数字块的数量(要从n到1的块都输出)
思路
其实就是一个规律题,推一推公式,如果不会的,就上oeis上面蒙蒙数据,看看能否成立啥的那就先打表,发现其实就是(ar[i]= ar[i-1]*10+81*10^{i-1})
主要要取余一下,其他的就没什么了
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
#define __i __int128
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
ll n , k, m ;
ll ar[500010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
// int i ;
n =read();
ar[1]=10;
ar[2]=180;
ll cnt =810 ;
for(int i=3;i<=n;i++){
ar[i] = ar[i-1]*10%998244353+cnt;
ar[i]%=998244353;
cnt *=10;
cnt%=998244353;
}
for(int i=n;i>=1;i--)cout<<ar[i]<<" "; cout<<endl;
return 0;
}