Codeforces Round #837 (Div. 2)補題
阿新 • • 發佈:2022-12-12
Codeforces Round #837 (Div. 2)
A. Hossam and Combinatorics
知識點:簡單題
複雜度:\(O(nlogn)\)
很明顯能看出,該題與資料的位置無關,只與大小有關
所以我們可直接排序,判斷最大與最小元素個數即可
注意特判所有元素均相等情況
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++) #define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--) #define ll long long #define fi first #define se second #define endl '\n' #define pll pair<ll,ll> #define pii pair<int,int> template<class T> using vc = vector<T>; template<class T> using vvc = vc<vc<T> >; const int N = 1e5 + 5; ll n, m, k; int a[N]; void solve() { cin >> n; rep(i, 1, n) cin >> a[i]; sort(a + 1, a + n + 1); if (a[1] == a[n]) cout << n * (n - 1) << endl; else { ll x(0), y(0); rep(i, 1, n) if (a[i] == a[1]) x++; rep(i, 1, n) if (a[i] == a[n]) y++; cout << x * y * 2 << endl; } }
B. Hossam and Friends
知識點:計數,思維題
複雜度:\(O(nlogn)\)
很明顯能觀察出當一段區間內有一對互不相認的人時,該區間不合法
所以我們可以列舉區間左端點,找到每一對中不相認的較大編號的人的最小值,即可得到合法個數
顯然當一對不相認的人的較小編號在我們列舉的區間左端點左邊時,該較大編號對我們沒影響,可以刪去
分別用vector和multiset實現即可
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++) #define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--) #define ll long long #define fi first #define se second #define endl '\n' #define pll pair<ll,ll> #define pii pair<int,int> template<class T> using vc = vector<T>; template<class T> using vvc = vc<vc<T> >; const int N = 1e5 + 5; int n, m, k; vc<int> h[N]; void solve() { cin >> n >> m; rep(i, 1, n) h[i].clear(); multiset<int> s; s.insert(n + 1); rep(i, 1, m) { int x, y; cin >> x >> y; if (x > y) swap(x, y); h[x].pb(y); s.insert(y); } ll ans(0); rep(i, 1, n) { ans += *s.begin() - i; for (auto x : h[i]) s.erase(s.find(x)); } cout << ans << endl; }
C. Hossam and Trainees
知識點:質因數分解,線性篩
複雜度:\(O(n^2logn)\)
fst了,1e3*1e3==1e9,我可真是大聰明
顯然我們可以用一個set儲存所有數的質因數,如果有兩個數有相同的質因數時,輸出YES
如果直接暴力篩質因數,複雜度為\(O(1e5*\sqrt{1e9}*log(1e5*10))\),複雜度爆炸
(1e9大小的數最多有10個不同的質因子)
但是如果我們先篩出\(\sqrt{1e9}\)內的質數,
那麼負責度就降為\(O(1e5*\frac{\sqrt{1e9}}{ln\sqrt{1e9}}*log(1e6)+\sqrt{1e9})\)
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define pll pair<ll,ll>
#define pii pair<int,int>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T> >;
const int N = 1e5 + 5;
int n, m, k;
int a[N];
const int M = 4e4 + 5;
bool prime[M];
int p[M], pn = 0;
void get_prime(int n)
{
fill(prime + 2, prime + n + 1, true);
for (int i = 2; i <= n; i++)
{
if (prime[i]) p[++pn] = i;
for (int j = 1; p[j] * i <= n; j++)
{
prime[i * p[j]] = false;
if (i % p[j] == 0) break;
}
}
}
void solve()
{
cin >> n;
rep(i, 1, n) cin >> a[i];
set<int> s;
rep(i, 1, n)
{
for (int j = 1; j <= pn && p[j] <= a[i] / p[j]; j++)
{
if (a[i] % p[j] == 0)
{
if (s.count(p[j]))
{
YES;
return;
}
s.insert(p[j]);
while (a[i] % p[j] == 0) a[i] /= p[j];
}
}
if (a[i] > 1)
{
if (s.count(a[i]))
{
YES;
return;
}
s.insert(a[i]);
}
}
NO;
}
void init()
{
cin >> T_T;
get_prime(40000);
}
D. Hossam and (sub-)palindromic tree
知識點:不知道
複雜度:\(O(不知道)\)
沒做出來,有時間就補