第 🖐🏻 周
一、SMU Summer 2024 Team Round 2
E - 签到题
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k,l;
int a[N];
signed main(){
cin>>n;
string s;
cin>>s;
map<char,int>v;
for(int i=0;i<n;i++){
v[s[i]]++;
}
int min1=INT_MAX;
v['S']+=v['s'];
v['H']+=v['h'];
v['A']+=v['a'];
v['N']+=v['n'];
v['G']+=v['g'];
v['I']+=v['i'];
v['A']/=2;
v['H']/=2;
for(auto ed:v){
if(ed.first=='S'||ed.first=='H'||ed.first=='N'||ed.first=='G'||ed.first=='A'||ed.first=='I') min1=min(min1,ed.second);
}
cout<<min1<<endl;
}
J - 主要考察素数筛 , 这里我用的是欧拉筛
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e6 + 10;
/*---------------------------------------------------------------*/
int prime[N];
bool vis[N];
void eular(int n)
{
int cnt = 0;
for(int i = 2 ; i <= n ; i++)
{
if(!vis[i]) prime[cnt++]=i;
for(int j = 0 ; j < cnt ; j++)
{
if(i * prime[j] > n) break;
vis[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
void solve() {
int n;
cin>>n;
vector<int> a(n + 1) , b(n + 1);
int k = 0;
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
b[i] = b[i-1] + a[i];
if(vis[a[i]] == 1) k=1;
}
if(k==1){
cout << 0 << endl;
return;
}
if(!vis[a[0]] and n==1){
cout << -1 << endl;
return;
}
int min1 = LLONG_MAX;
for(int i = 0 ;i < n ; i++){
for(int j = i ; j <= n ; j++){
if(vis[b[j] - b[i]] == 1){
min1 = min(min1,j-i-1);
}
}
}
if(min1 == LLONG_MAX) cout << -1 << endl;
else cout << min1 << endl;
}
signed main()
{
IOS
int t = 1;
eular(1000000);
cin >> t;
while (t--) solve();
return 0;
}
A - 一开始还以为是规律题,结果不是,队友写的
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=5e5 + 10;
const int N=2e6+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
int a[105][105];
void solve() {
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
for(int i1=0;i1<=n;i1++){
for(int j1=0;j1<=m;j1++){
if(i==i1 and j==j1){
continue;
}
int x1=i,y1=j,x2=i1,y2=j1;
int d1=(x2-x1),d2=(y2-y1);
int x3=x2+d2,y3=y2-d1;
int x4=x1+d2,y4=y1-d1;
if(x3>=0 and x3<=n and y3>=0 and y3<=m and x4>=0 and x4<=n and y4>=0 and y4<=m){
a[x1][y1]++;
a[x2][y2]++;
a[x3][y3]++;
a[x4][y4]++;
}
}
}
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
cout<<a[i][j]/4<<" ";
}
cout<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
// cin>>t;
while (t--){
solve();
}
return 0;
}
M - 思维题吧,也有一点数学 , 主要是要确定青蛙能跳的地方 , 队友三分写的 , 赛时我写的跳哪些的地方没有实现 , 赛后改了一下
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e6 + 10;
/*---------------------------------------------------------------*/
signed main(){
int n;
cin >> n;
int m = ceil(sqrt(n));
cout << n - m << endl;
int a = n - m;
for(int i = 0 ; i < n - 1 ; i++){
if(a > 0 and i % m != m - 1){
a--;
cout << i + 1 << " " << i + 2 << endl;
}
}
for(int i = 0 ; i < n - m ; i++){
cout << i + 1 << " " << i + m + 1 << endl;
}
}
二、河南萌新联赛2024第(四)场:河南理工大学
贪心
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 10;
/*---------------------------------------------------------------*/
int qmi(int a,int b){
int res = 1;
while (b)
{
if (b & 1) res = (res * a);
a = (a * a);
b >>= 1;
}
return res;
} // 快速幂
void solve(){
int n , m;
cin >> n >> m;
vector<int> a(n + 1);
for(int i = 1 ; i <= n ; i++) cin >> a[i];
sort(a.begin() + 1 , a.end());
vector<int> s;
for(int i = 2 ; i <= n ; i++) s.push_back(a[i] ^ a[i - 1]);
sort(s.begin() , s.end());
cout << (s[0] ^ (qmi(2,m) - 1)) << endl;
}
signed main(){
int t = 1 ;
//cin >> t;
while(t--) solve();
}
排列组合
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e+6 + 10;
/*---------------------------------------------------------------*/
int f[N];
int pow(int x,int y){ //快速幂
int ans = 1;
for(int i = y ; i ; i >>= 1 ,x = x * x % mod) if(i & 1) ans = ans * x % mod;
return ans;
}
int C(int n,int m){ //求组合数
if(m>n) return 0;
return ((f[n] * pow(f[m],mod - 2)) % mod * pow(f[n-m],mod - 2) % mod);
}
void solve(){
int n , m , sum = 0;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++) {
int x;
cin >> x;
sum += x;
}
cout << C(m + n - sum , n) % mod << endl;
}
signed main(){
int t = 1 ;
f[0]=1;
for(int i = 1 ;i <= N ; i++) f[i] = (f[i-1] * i) % mod;
//cin >> t;
while(t--) solve();
}
签到
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;
/*---------------------------------------------------------------*/
void solve(){
int n;
cin >> n;
for(int i = 2 ; i <= n / i ; i++){
if(n % i ==0) {
cout << "No" << endl;
return;
}
}
cout << "Yes" << endl;
}
signed main(){
int t;
cin >> t;
while(t--) solve();
}
先用欧拉筛筛出质数,然后二分查找,区间内的质数个数即为 r - l + 1 , 因为质数只有2为偶数,所以区间包含2时,答案为质数个数 - 2,不包含2就是0.
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e8 + 10;
/*---------------------------------------------------------------*/
int prime[N];
bool vis[N];
int cnt;
void eular(int n)
{
for(int i = 2 ; i <= n ; i++)
{
if(!vis[i]) prime[cnt++] = i;
for(int j = 0 ; j < cnt ; j++)
{
if(i * prime[j] > n) break;
vis[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
void solve(){
int l , r;
cin >> l >> r;
int ans ,l1 = 0 , r1 = cnt - 1, l2 = 0 , r2 = r1;
while(l1 < r1){
int mid = (l1 + r1) >> 1;
if(prime[mid] >= l) r1 = mid;
else l1 = mid + 1;
}
while(l2 < r2){
int mid = (l2 + r2) >> 1;
if(prime[mid] >= r) r2 = mid;
else l2 = mid + 1;
}
if(prime[l2] > r) l2--;
ans = l2 - l1 + 1;
cout << ans << " ";
if(l > 2 || ans == 1) cout << 0 << endl;
else cout << ans - 2 << endl;
}
signed main(){
eular(1e8);
int O_O;
cin >> O_O;
while(O_O--) solve();
}
签到
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;
/*---------------------------------------------------------------*/
void solve(){
string s , c;
cin >> s;
int len = s.size();
vector<int> a;
for(int i = 0 ; i < len ; i ++) {
if(s[i] == '+') {
if(c.size()) a.push_back(stoi(c)),c.clear();
}else c += s[i];
}
if(c.size()) a.push_back(stoi(c)),c.clear();
sort(a.begin() , a.end() , greater<int>());
int ans = 0;
for(int i = 0 ; i < a.size() ; i++){
if(i != a.size() - 1) cout << a[i] << "+";
else cout << a[i] << endl;
ans += a[i];
}
cout << ans << endl;
}
signed main(){
int t = 1;
//cin >> t;
while(t--) solve();
}
签到题,只不过最开始被数据搞了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e8 + 10;
/*---------------------------------------------------------------*/
int n = 0 , x = 0 , n1 , x1;
int ans = 0;
void solve(){
cin >> x1 >> n1;
x += x1;
n = max(n , n1);
}
signed main(){
int t = 1 ;
cin >> t;
while(t--) solve();
cout << x - (n - 1) / 2 << endl;
}
题读错了,一开始以为是遍历一棵树,没想到是dfs把路径跑一遍,标记走过的地方,最后结果是经过两个点的路径数相乘
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 3e5 + 10;
/*---------------------------------------------------------------*/
int n , x , y , ans;
vector<int> G[N];
bool vis[N] , pass[N];
int sum[N];
int dfs(int a){
vis[a] = 1;
sum[a] = 1;
if(a == x) pass[a] = 1;
for(auto i : G[a]){
if(!vis[i]){
sum[a] += dfs(i);
if(pass[i]) pass[a] = 1;
}
}
return sum[a];
}
void solve(){
cin >> n >> x >> y;
for(int i = 1 ; i < n ; i++) {
int f , s;
cin >> f >> s;
G[f].push_back(s);
G[s].push_back(f);
}
dfs(y);
int temp;
for(auto i : G[y]){
if(pass[i]){
temp = sum[y] - sum[i];
}
}
cout << temp * sum[x] << endl;
}
signed main(){
int O_O = 1;
//cin >> O_O;
while(O_O--) solve();
}
树状数组,维护当前数字左边比他大的,右边比他小的,减去相等的,就是答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e4 + 10;
/*---------------------------------------------------------------*/
int n,a[N],b[N],c[N],d[N];
int b1[N],c1[N],d1[N];
int t[100005];
void change(int x,int num){
for(int i = x ; i <= 1e5 ; i += lowbit(i)) t[i] += num;
}
int query(int x){
int sum = 0;
for(int i = x ; i > 0 ; i -= lowbit(i)) sum += t[i];
return sum;
}
void solve(){
for(int i = 1 ; i <= 1e5 ; i++) t[i] = 0;
cin >> n;
for(int i = 1 ; i <= n ; i++) {
cin >> a[i];
b[i] = query(a[i]);
c[i] = query(1e5) - query(a[i] - 1);
d[i] = query(a[i]) - query(a[i] - 1);
change(a[i],1);
}
for(int i = 1 ; i <= 1e5 ; i++) t[i] = 0;
int ans = 0;
for(int i = n ; i >= 1 ; i--){
b1[i] = query(a[i]);
c1[i] = query(1e5) - query(a[i] - 1);
d1[i] = query(a[i]) - query(a[i] - 1);
change(a[i],1);
ans += (b1[i] * c[i] + c1[i] * b[i] - d1[i] * d[i]);
}
cout << ans << endl;
}
signed main(){
int O_O;
cin >> O_O;
while(O_O--) solve();
}