A 膜法记录

Solution



Code

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int inf = 0x3f3f3f3f;
static auto faster_iostream = []() {
    std::ios::sync_with_stdio(false);  // turn off sync
    std::cin.tie(nullptr);             // untie in/out streams
    return 0;
}();
int vis[50];
char maze[22][100005];
int main(){
  int t;
  cin >> t;
  while(t--){
    int n, m, a, b;
    cin >> n >> m >> a >> b;
    for(int i = 1; i <= n; i++){
      for(int j = 1; j <= m; j++){
        cin >> maze[i][j];
      }
    }
    int flag = 0;
    for(int i = 0; i < (1LL << n); i++){
      int num = 0;
      memset(vis, 0, sizeof(vis));
      for(int j = 0; j < n; j++){
        if((i >> (n - j - 1)) & 1){
          num++; // 二进制有多少个1  第几个为1 说明选择第几行
          vis[n - j] = 1;
        }
      }
      if(num != a){ 
        continue;
      }
      vector<int> v(m + 1);
      for(int i = 1; i <= n; i++){
        if(vis[i]) continue;
        for(int j = 1; j <= m; j++){
          if(maze[i][j] == '*')
            v[j]++; // j列有敌人
        }
      }
      int cnt = 0;
      for(int i = 1; i <= m; i++){
        if(v[i] > 0) cnt++;
      }
      if(cnt <= b){ // 剩下有敌人的列大于b
        cout << "yes\n";
        flag = 1;
        break;
      }
    }
    if(!flag){
      cout << "no\n";
    }
  }
  return 0;
}

B 阶乘

Solution

图片说明

Code1(OEIS给的思路模拟)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e6 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double PI = acos(-1.0);
const double eps = 1e-12;
const ll inf = 1e18;
static auto fast_iostream = [](){
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  return 0;
}();
ll qpow(ll a, ll b){
  ll res = 1;;
  while(b){
    if(b & 1) res = res * a;
    a = a * a;
    b >>= 1;
  }
  return res;
}
ll pre[30];
map<ll, ll> mp;
ll solve(ll p){
  ll ans = 0;
  ll pre = p;
  int flag = 0;
  for(ll i = 2; i * i <= p; i++){
    if(p % i == 0){
      flag = 1;
      break;
    }
  }
  if(!flag){
    return p; // prime 素数直接输出
  }
  vector<pair<ll, ll> > v;
  for(ll i = 2; i * i <= p; i++){
    if(p % i == 0){
      ll cnt = 0;
      while(p % i == 0){
        p /= i;
        cnt++;
      }
      v.push_back({i, cnt}); // 质因数分解
    }
  }
  if(p > 1){
    v.push_back({p, 1});
  }
  flag = 0;
  for(int i = 0; i < v.size(); i++){
    if(v[i].second > 1){
      flag = 1;
      break;
    }
  }
  if(!flag){
    return v[v.size() - 1].first;
  }
  else if(v.size() == 1 && v[0].second <= v[0].first){
    return v[0].first * v[0].second;
  }
  else if(v.size() == 1){
    ll prime = v[0].first;
    for(ll i = prime; ; i += prime){
      int cnt = 0;
      pre = i;
      while(pre % prime == 0){
        pre /= prime;
        cnt++;
      }
      v[0].second -= cnt;
      if(v[0].second <= 0){
        return i;
      }
    }
  }
  else {
    ll ans = 0;
    for(int i = 0; i < v.size(); i++){
      ans = max(ans, solve(qpow(v[i].first, v[i].second)));
    }
    return ans;
  }
}
int main(){
  int n;
  cin >> n;
  pre[1] = 1;
  for(ll i = 2; i <= 20; i++){
    pre[i] = pre[i - 1] * i; 
    mp[pre[i]] = i;
  }
  while(n--){
    ll p;
    cin >> p;
    if(mp[p]){
      cout << mp[p] << "\n";
      continue;
    }
    else cout << solve(p) << "\n";
  }
  return 0;
}

Code2(待补QAQ)

C 完全图

Solution








Code

while True:
  try:
    t = int(input())
    while t > 0:
      t = t - 1
      n, m = map(int, input().split())
      left = 0
      right = n - 1
      ans = 0
      while left <= right:
        mid = (left + right) // 2
        if ((n - 1 + n - mid) * mid //  2) <= m:
          ans = mid
          left = mid + 1
        else:
          right = mid - 1
      print(ans + 1)
  except EOFError:
    break

D 病毒传染

Solution(待补QAQ)

E A+B问题

Solution

Code(python)

print('4294967296');

F 美丽的序列I

Solution(待补QAQ)

G 树上求和

Solution







Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e5 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double PI = acos(-1.0);
const double eps = 1e-12;
const ll inf = 1e18;
static auto fast_iostream = [](){
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  return 0;
}();
struct Edge{
    int v, nextz;
    ll w;
}E[N << 1];
int head[N], tot;
void init(){
    memset(head, -1, sizeof(head));
    tot = 0;
}
int n;
ll sum[N];
void add(int u, int v, ll w){
    E[tot].v = v;
    E[tot].w = w;
    E[tot].nextz = head[u];
    head[u] = tot++;
}
ll dp[N], sz[N], val[N];
ll ans = 0;
void dfs(int u, int fa) {
    sum[u] = 1;
    for (int i = head[u]; ~i; i = E[i].nextz) {
        int v = E[i].v;
        if (v == fa)
            continue;
        dfs(v, u);
        sum[u] += sum[v];
    }
}
ll cal[N];
void solve(int u, int fa) {
    for (int i = head[u]; ~i; i = E[i].nextz) {
        int v = E[i].v;
        ll w = E[i].w;
        if (v == fa)
            continue;
        cal[w] += sum[v] * (n - sum[v]);
        solve(v, u);
    }
}
bool vis[N];
int se[N];
int main(){
  init();
  cin >> n;
  for(int i = 1; i <= n - 1; i++){
    int u, v;
    cin >> u >> v;
    add(u, v, i);
    add(v, u, i);
  }
  dfs(1, -1);
  solve(1, -1);
  ll ans = 0;
  for(int i = 1; i <= n - 1; i++){
    se[i] = i;
  }
  sort(se + 1, se + n, [](int x, int y){return cal[x] < cal[y];});
  ll color = n - 1;
  for(int i = 1; i <= n - 1; i++){
    ans += color * cal[se[i]];
    color--;
  } 
  cout << ans << "\n";
  return 0;
}

H 奇怪的背包问题增加了

Solution






#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e5 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double PI = acos(-1.0);
const double eps = 1e-12;
const ll inf = 1e18;
static auto fast_iostream = [](){
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  return 0;
}();
int a[N], vis[50], num[50];
int main(){
  int t;
  cin >> t;
  while(t--){
    int n;
    cin >> n;
    memset(vis, 0, sizeof(vis));
    memset(num, 0, sizeof(num));
    for(int i = 1; i <= n; i++) cin >> a[i], vis[a[i]]++, num[a[i]]++;
    for(int i = 0; i <= 29; i++){
      vis[i + 1] += vis[i] / 2;
      vis[i] %= 2;
    }
    if(!vis[30]){
      cout << "impossible\n";
      continue;
    }
    ll need = 1;
    vector<int> v(50);
    for(int i = 30; i >= 0; i--){
      if(num[i]){
        v[i] += min(need, 1LL *num[i]);
        need -= v[i];
        if(!need) break;
      }
      need *= 2;
    }
    for(int i = 1; i <= n; i++){
      if(v[a[i]]){
        cout << 1;
        v[a[i]]--;
      }
      else cout << 0;
    }
    cout << '\n';
  }
  return 0;
} 

I 寻找子串

Solution



#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e3 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double PI = acos(-1.0);
const double eps = 1e-12;
const ll inf = 1e18;
static auto fast_iostream = [](){
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  return 0;
}();
string pre[N];
int main(){
  int n;
  string s;
  cin >> s;
  int pos = 0;
  string ans;
  string t = "";
  for(int i = s.size() - 1; i >= 0; i--){
    t = s[i] + t;
    pre[i] = t;
  }
  for(int i = 0; i < s.size(); i++){
    ans = max(ans, pre[i]);
  }
  cout << ans << "\n";
  return 0;
}

J 最大的差

Solution

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e6 + 5;
const ll mod = 998244353;
const int DEG = 30;
const double PI = acos(-1.0);
const double eps = 1e-12;
const ll inf = 1e18;
static auto fast_iostream = [](){
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  return 0;
}();
ll a[N];
int main(){
  int t;
  t = 1;
  while(t--){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
      cin >> a[i];
    }
    sort(a + 1, a + 1 + n);
    cout << a[n] - a[1] << "\n";
  }
  return 0;
}