atcoder abc 409 A~G

A

点击查看代码
#include <bits/stdc++.h>
using namespace std;
string s,t;
int main(){

	int n,i;
	cin>>n>>s>>t;
	for(i=0;i<n;i++)
	{
		if(s[i]=='o'&&t[i]=='o')
		{
			cout<<"Yes\n";
			return 0;
		}
	}
	cout<<"No\n";
	return 0;
}
B
点击查看代码
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define N    1000010
#define int  long long
#define i128 __int128
#define ull  unsigned long long
#define db   long double
#define pii  pair<int,int>
#define st   first
#define ed   second
#define mkp  make_pair
#define pb   push_back
#define eps  1e-9
#define mod  998244353
#define mod2 1000000007
#define bs   13131
#define bs2  131
#define INF  0x3f3f3f3f3f3f3f3f
#define il   inline
#define vi   vector<int>
#define ins  insert
#define umap unordered_map
#define uset unordered_set
#define R(x) x.begin(),x.end()
#define B(x) x.begin()
#define E(x) x.end()
#define lb   lower_bound
#define ub   upper_bound
#define prq  priority_queue
#define rd(l,r) (rnd()%(r-l+1)+l)
#define lowbit(x) ((x)&(-(x)))
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());
il int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
int T=1,n,m,q,k;
int s[N];
char c[N];
vector<int> v[N];
il void solve(){
	n=read();
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++)s[i]=read();
	int l=0,r=INF,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		int cnt=0;
		for(int i=1;i<=n;i++)if(s[i]>=mid)cnt++;
		if(cnt>=mid)ans=mid,l=mid+1;
		else r=mid-1;
	}
	printf("%lld",ans);
	return 0;
}
C 点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int d[1000005];
signed main() {
    int N,L;
    cin>>N>>L;
    int a=L;
    L*=3;
    int dis=0;
    d[0]++;
    for(int i=1;i<=N-1;i++) {
        int x;
        cin>>x;
        dis+=x*3;
        dis%=L;
        d[dis]++;
    }
    int sum=0;
    for(int i=0;i<a;i++) {
        sum+=d[i]*d[i+a]*d[i+2*a];
    }
    cout<<sum;
    return 0;
}
D
点击查看代码
#pragma GCC optimize("O3,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int MOD = 1e9 + 7;  // 998244353;
const int MX = 2e5 + 5, INF = 1e9;
const ll INFLL = 1e18;

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORE(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, a, b) for (int i = (a); i >= (b); --i)
#define trav(a, x) for (auto& a : x)
#define sz(x) (int)x.size()
#define make_unique(v) \
  sort(all(v));        \
  v.erase(unique(all(v)), v.end())

template <class T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template <class T>
int lwb(const vector<T>& a, const T& b) {
  return int(lower_bound(all(a), b) - a.begin());
}
template <class T>
int upb(const vector<T>& a, const T& b) {
  return int(upper_bound(all(a), b) - a.begin());
}
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
template <int D, typename T>
struct vt : public vector<vt<D - 1, T>> {
  template <typename... Args>
  vt(int n = 0, Args... args)
      : vector<vt<D - 1, T>>(n, vt<D - 1, T>(args...)) {}
};
template <typename T>
struct vt<1, T> : public vector<T> {
  vt(int n = 0, const T& val = T()) : vector<T>(n, val) {}
};
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (auto& x : a) in >> x;
  return in;
};
template <typename T>
ostream& operator<<(ostream& out, vector<T>& a) {
  for (auto& x : a) out << x << ' ';
  return out;
};

void solve() {
  int N; cin >> N;
  string S; cin >> S;
  ll l = -1;
  FOR(i,0,N-1){
    if (S[i] > S[i+1]) {
      l = i; break;
    }
  }
  if (l == -1) {
    cout << S << endl;
    return;
  }
  char U = S[l];
  ll j = l + 1;
  while (j < N && S[j] <= U){
    j++;
  }
  ll r = (j < N? j-1 : N-1);
  string T; T.reserve(N);
  T.append(S,0,l);
  T.append(S,l+1,r-l);
  T.pb(U);
  if (r + 1 < N){
    T.append(S,r+1,N-(r+1));
  }
  cout << T << endl;
    
}

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int t = 1;
  cin >> t; 
  for (int test = 1; test <= t; test++) {
    solve();
  }
}
E
点击查看代码
#pragma GCC optimize("O3,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int MOD = 1e9 + 7;  // 998244353;
const int MX = 2e5 + 5, INF = 1e9;
const ll INFLL = 1e18;

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORE(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, a, b) for (int i = (a); i >= (b); --i)
#define trav(a, x) for (auto& a : x)
#define sz(x) (int)x.size()
#define make_unique(v) \
  sort(all(v));        \
  v.erase(unique(all(v)), v.end())

template <class T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template <class T>
int lwb(const vector<T>& a, const T& b) {
  return int(lower_bound(all(a), b) - a.begin());
}
template <class T>
int upb(const vector<T>& a, const T& b) {
  return int(upper_bound(all(a), b) - a.begin());
}
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
template <int D, typename T>
struct vt : public vector<vt<D - 1, T>> {
  template <typename... Args>
  vt(int n = 0, Args... args)
      : vector<vt<D - 1, T>>(n, vt<D - 1, T>(args...)) {}
};
template <typename T>
struct vt<1, T> : public vector<T> {
  vt(int n = 0, const T& val = T()) : vector<T>(n, val) {}
};
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (auto& x : a) in >> x;
  return in;
};
template <typename T>
ostream& operator<<(ostream& out, vector<T>& a) {
  for (auto& x : a) out << x << ' ';
  return out;
};

void solve() {
  int N; cin >> N;
  vt<1,ll> net(N+1);
  FORE(i,1,N){
    cin >> net[i];
  }
  vector<vector<pair<ll,ll>>> adj(N+1);
  FORE(i,1,N-1){
    ll u,v,w; cin >> u >> v >> w;
    adj[u].emplace_back(v,w);
    adj[v].emplace_back(u,w);
  }
    vector<int> parent(N+1, 0);
    vector<ll> edge_w(N+1, 0);
    vector<int> st1;
    st1.reserve(N);
    vector<int> st2;
    st2.reserve(N);

    parent[1] = 0;
    st1.push_back(1);
    while (!st1.empty()) {
        int u = st1.back();
        st1.pop_back();
        st2.push_back(u);
        for (auto &pr : adj[u]) {
            int v = pr.first;
            int w = pr.second;
            if (v == parent[u]) continue;
            parent[v] = u;
            edge_w[v] = w;
            st1.push_back(v);
        }
    }

    ll answer = 0;
    for (int idx = int(st2.size()) - 1; idx >= 0; --idx) {
        int u = st2[idx];
        if (u == 1) continue;
        answer += llabs(net[u]) * edge_w[u];
        net[parent[u]] += net[u];
    }

    cout << answer << "\n";
    
}

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int t = 1;
  // cin >> t; 
  for (int test = 1; test <= t; test++) {
    solve();
  }
}
F
点击查看代码
#pragma GCC optimize("O3,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int MOD = 1e9 + 7;  // 998244353;
const int MX = 2e5 + 5, INF = 1e9;
const ll INFLL = 1e18;

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORE(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, a, b) for (int i = (a); i >= (b); --i)
#define trav(a, x) for (auto& a : x)
#define sz(x) (int)x.size()
#define make_unique(v) \
  sort(all(v));        \
  v.erase(unique(all(v)), v.end())

template <class T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template <class T>
int lwb(const vector<T>& a, const T& b) {
  return int(lower_bound(all(a), b) - a.begin());
}
template <class T>
int upb(const vector<T>& a, const T& b) {
  return int(upper_bound(all(a), b) - a.begin());
}
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
template <int D, typename T>
struct vt : public vector<vt<D - 1, T>> {
  template <typename... Args>
  vt(int n = 0, Args... args)
      : vector<vt<D - 1, T>>(n, vt<D - 1, T>(args...)) {}
};
template <typename T>
struct vt<1, T> : public vector<T> {
  vt(int n = 0, const T& val = T()) : vector<T>(n, val) {}
};
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (auto& x : a) in >> x;
  return in;
};
template <typename T>
ostream& operator<<(ostream& out, vector<T>& a) {
  for (auto& x : a) out << x << ' ';
  return out;
};
struct DSU {
    vector<int> p, r;
    int comp_count;
    DSU(int n = 0) {
        p.resize(n+1);
        r.assign(n+1, 1);
        iota(p.begin(), p.end(), 0);
        comp_count = n;
    }
    int find(int x) {
        return p[x] == x ? x : p[x] = find(p[x]);
    }
    bool unite(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) return false;
        if (r[a] < r[b]) swap(a, b);
        p[b] = a;
        r[a] += r[b];
        --comp_count;
        return true;
    }
};
void solve() {
  int N, Q;
  cin >> N >> Q;

  int maxVertices = N + Q; 
  vt<1,ll> X(maxVertices + 1), Y(maxVertices + 1);
  FORE(i,1,N) {
      cin >> X[i] >> Y[i];
  }
  size_t reserve_edges = size_t(maxVertices) * (maxVertices - 1) / 2;
  vector<tuple<int,int,int>> initialEdges;
  initialEdges.reserve(reserve_edges);

  for (int u = 1; u <= N; u++) {
      for (int v = u + 1; v <= N; v++) {
          int w = int(llabs(X[u] - X[v]) + llabs(Y[u] - Y[v]));
          initialEdges.emplace_back(w, u, v);
      }
  }

  priority_queue<
      tuple<int,int,int>,
      vector<tuple<int,int,int>>,
      greater<tuple<int,int,int>>
  > pq(greater<tuple<int,int,int>>(), std::move(initialEdges));

  DSU dsu(maxVertices);
  dsu.comp_count = N;  
  int curr_n = N;

  while (Q--) {
      int type;
      cin >> type;
      if (type == 1) {
          // Add a new vertex
          long long a, b;
          cin >> a >> b;
          ++curr_n;
          X[curr_n] = a;
          Y[curr_n] = b;
          dsu.comp_count++;

          for (int u = 1; u < curr_n; u++) {
              int w = int(llabs(X[u] - X[curr_n]) + llabs(Y[u] - Y[curr_n]));
              pq.emplace(w, u, curr_n);
          }
      }
      else if (type == 2) {
          if (dsu.comp_count <= 1) {
              cout << -1 << "\n";
          } else {
              int k;
              int u, v;
              while (true) {
                  if (pq.empty()) {
                      k = -1;
                      break;
                  }
                  tie(k, u, v) = pq.top();
                  pq.pop();
                  if (dsu.find(u) != dsu.find(v)) {
                      break;
                  }
              }
              if (k < 0) {
                  cout << -1 << "\n";
              } else {
                 dsu.unite(u, v);
                  while (!pq.empty() && get<0>(pq.top()) == k) {
                      tie(std::ignore, u, v) = pq.top();
                      pq.pop();
                      dsu.unite(u, v);
                  }
                  cout << k << "\n";
              }
          }
      }
      else if (type == 3) {
          int u, v;
          cin >> u >> v;
          cout << (dsu.find(u) == dsu.find(v) ? "Yes\n" : "No\n");
      }
  } 
}

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int t = 1;
  // cin >> t; 
  for (int test = 1; test <= t; test++) {
    solve();
  }
}
G
点击查看代码
#pragma GCC optimize("O3,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int MOD =  998244353;
const int MX = 2e5 + 5, INF = 1e9;
const ll INFLL = 1e18;

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORE(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, a, b) for (int i = (a); i >= (b); --i)
#define trav(a, x) for (auto& a : x)
#define sz(x) (int)x.size()
#define make_unique(v) \
  sort(all(v));        \
  v.erase(unique(all(v)), v.end())

template <class T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template <class T>
int lwb(const vector<T>& a, const T& b) {
  return int(lower_bound(all(a), b) - a.begin());
}
template <class T>
int upb(const vector<T>& a, const T& b) {
  return int(upper_bound(all(a), b) - a.begin());
}
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
template <int D, typename T>
struct vt : public vector<vt<D - 1, T>> {
  template <typename... Args>
  vt(int n = 0, Args... args)
      : vector<vt<D - 1, T>>(n, vt<D - 1, T>(args...)) {}
};
template <typename T>
struct vt<1, T> : public vector<T> {
  vt(int n = 0, const T& val = T()) : vector<T>(n, val) {}
};
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (auto& x : a) in >> x;
  return in;
};
template <typename T>
ostream& operator<<(ostream& out, vector<T>& a) {
  for (auto& x : a) out << x << ' ';
  return out;
};
static const int G   = 3; 
 
int modexp(int a, int e=MOD-2) {
    long long res=1, base=a;
    while(e>0){
        if(e&1) res=res*base%MOD;
        base=base*base%MOD;
        e>>=1;
    }
    return int(res);
}
void ntt(vector<int> & a, bool invert) {
    int n = a.size();
    static vector<int> rev;
    static vector<int> roots{0,1};
    if ((int)rev.size() != n) {
        int k = __builtin_ctz(n);
        rev.assign(n,0);
        for(int i=0;i<n;i++)
            rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));
    }
    for(int i=0;i<n;i++){
        if (i<rev[i]) swap(a[i],a[rev[i]]);
    }
    if ((int)roots.size() < n) {
        // compute roots up to size n
        int k = __builtin_ctz(roots.size());
        roots.resize(n);
        while ((1<<k) < n) {
            int e = modexp(G, (MOD-1)>>(k+1));
            for(int i=1<<(k-1); i<(1<<k); i++){
                roots[2*i]   = roots[i];
                roots[2*i+1] = int((long long)roots[i]*e % MOD);
            }
            k++;
        }
    }
    for (int len=1; len<n; len<<=1) {
        for (int i=0; i<n; i+=2*len) {
            for (int j=0; j<len; j++){
                int u = a[i+j];
                int v = int((long long)a[i+j+len] * roots[len+j] % MOD);
                a[i+j]      = u+v<MOD ? u+v : u+v-MOD;
                a[i+j+len]  = u-v>=0 ? u-v : u-v+MOD;
            }
        }
    }
    if(invert) {
        reverse(a.begin()+1, a.end());
        int inv_n = modexp(n, MOD-2);
        for (int &x : a)
            x = int((long long)x * inv_n % MOD);
    }
}
 
vector<int> convolution(const vector<int>& A, const vector<int>& B) {
    int n = 1, tot = (int)A.size() + (int)B.size() - 1;
    while (n < tot) n <<= 1;
    vector<int> a(A.begin(), A.end()), b(B.begin(), B.end());
    a.resize(n);  b.resize(n);
    ntt(a, false);
    ntt(b, false);
    for(int i=0;i<n;i++)
        a[i] = int((long long)a[i] * b[i] % MOD);
    ntt(a, true);
    a.resize(tot);
    return a;
}
void solve() {
  int N, P;
  cin >> N >> P;

  if (P == 0) {
      cout << N << "\n";
      for (int k = 2; k <= N; k++)
          cout << 0 << "\n";
      return ;
  }
  if (P == 100) {
      for(int k=1;k<=N;k++)
          cout << 1 << "\n";
      return ;
  }

  int inv100 = modexp(100);
  int p      = int((long long)P * inv100 % MOD);
  int c      = (1 - p + MOD) % MOD;  // 1-p
  
  vector<int> inv(N+1), fact(N+1), invfact(N+1);
  inv[1] = 1;
  for(int i=2; i<=N; i++)
      inv[i] = int((long long)(MOD - MOD/i) * inv[MOD % i] % MOD);
  fact[0]=1;
  for(int i=1;i<=N;i++)
      fact[i] = int((long long)fact[i-1]*i % MOD);
  invfact[N] = modexp(fact[N]);
  for(int i=N;i>0;i--)
      invfact[i-1] = int((long long)invfact[i]*i % MOD);

  vector<int> g(N+2);
  g[N] = 1;
  for(int s=N-1; s>=1; s--) {
      int num = ( (s+1) - (long long)p + MOD ) % MOD;
      g[s] = int((long long)g[s+1] * num % MOD * inv[s] % MOD);
  }

  int n0 = N-2;  
  vector<int> d(n0+1);
  long long cpow = 1;
  for(int j=0;j<=n0;j++){
      d[j] = int(cpow * g[j+2] % MOD);
      cpow = cpow * c % MOD;
  }

  vector<int> A1(n0+1), A2(n0+1);
  for(int i=0;i<=n0;i++){
      A1[i] = int( (long long)d[n0 - i] * fact[n0 - i] % MOD );
      A2[i] = invfact[i];
  }
  auto C = convolution(A1, A2);  
  vector<int> h(n0+1);
  for(int r=0;r<=n0;r++){
      h[r] = int((long long)C[n0 - r] * invfact[r] % MOD);
  }

  vector<int> ans(N+1);
  ans[1] = g[1];
  vector<int> p_pows(n0+1), icpows(n0+1);
  p_pows[0] = p;
  for(int r=1;r<=n0;r++)
      p_pows[r] = int((long long)p_pows[r-1] * p % MOD);
  int invc = modexp(c);
  icpows[0] = 1;
  for(int r=1;r<=n0;r++)
      icpows[r] = int((long long)icpows[r-1] * invc % MOD);

  for(int k=2; k<=N; k++){
      int r = k-2;  
      long long v = h[r];
      v = v * p_pows[r] % MOD;
      v = v * icpows[r] % MOD;
      ans[k] = int(v);
  }

  for(int k=1;k<=N;k++){
      cout << ans[k] << "\n";
  }
}

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int t = 1;
  // cin >> t;  
  for (int test = 1; test <= t; test++) {
    solve();
  }
}
posted @ 2025-06-08 19:12  烈空坐  阅读(27)  评论(1)    收藏  举报