Codeforces Round #672 (Div. 2)

A题

 容易题。只有严格单调递减情况是NO因为需要n*(n-1)/2次。其余都行

#include <bits/stdc++.h>
using namespace std;
int main () {
	int t;
	cin >> t;
	while(t--) {
		int n;
		cin >> n;
		vector<int> v;
		bool ok = 0;
		for(int i = 0; i < n; ++i) {
			int temp;
			cin >> temp;
			v.push_back(temp);
		}
		for(int i = 1; i < n; ++i) {
			if(v[i - 1] <= v[i]) {
				ok = 1;
			}
		}
		if(ok) {
			cout << "YES" << endl; 
		}
		else {
			cout << "NO" << endl;
		}
	}
}

 B题

记得开long long!!!!!!!!!!!!!!!!!!!!!!!!!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
	int t;
	cin >> t;
	while(t--) {
		int n;
		cin >> n;
		vector<ll> v(100);
		for(int i = 0; i < n; ++i) {
			ll temp;
			cin >> temp;
			int circle = 0;
			for(circle = 0; temp; temp >>= 1) {
				circle++;
			}
			v[circle]++;
		}
		ll ans = 0;
		for(int i = 0; i < v.size(); ++i) {
			if(v[i]) {
				ans += 	(v[i] - 1) * v[i] / 2; 
			} 
		}
		cout << ans << endl; 
	} 
}

 C题

 思维题

用两个数组进行记录

一定要注意这种思想

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin >> t;
	while(t--) {
		int n, q;
		cin >> n >> q;
		vector<ll> a(n + 1);
		for(int i = 1; i <= n; ++i) {
			cin >> a[i];
		}
		vector<ll> mx(n + 1);
		vector<ll> mn(n + 1);
//		for(int i = n - 1; i >= 0; --i) {
//			mx[i] = max(mx[i + 1], a[i] - mn[i + 1]);
//			mn[i] = min(mn[i + 1], a[i] - mx[i + 1]);
//		}
//		cout << mx[0] << endl;
		for(int i = 1; i <= n; ++i) {
			mx[i] = max(mx[i - 1], a[i] - mn[i - 1]);
			mn[i] = min(mn[i - 1], a[i] - mx[i - 1]);
		}
		cout << mx[n] << endl;
	}
}

 D题

组合数问题 用优先队列解决。本质上来讲是求几个区间公共情况的组合情况

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MODE = 998244353;
const int N = 3e5 + 10;
typedef pair<int, int> P; 
ll pre[N];
ll qpow(ll a, ll b) {
	ll res = 1;
	while(b) {
		if(b & 1)
			res = (res * a) % MODE;
		b >>= 1;
		a = (a * a) % MODE;
	}
	return res % MODE;
}
ll C(ll n, ll k) {
	if(k == 0) {
		return 1;
	}
	return(pre[n] % MODE * qpow((pre[k] * pre[n - k]) % MODE, MODE - 2) % MODE) % MODE;
}
int main () {
	ll n, k;
	cin >> n >> k;
	pre[0] = 1;
	for(int i = 1; i < N; ++i) {
		pre[i] = (pre[i - 1] * i) % MODE;
	}
	vector<P> v(n);
	for(int i = 0; i < n; ++i) {
		cin >> v[i].first >> v[i].second;
	}
	sort(v.begin(), v.end());
//	for(int i = 0; i < v.size(); ++i) {
//		cout << v[i].first << " " << v[i].second << endl;
//	}
	ll ans = 0;
//	priority_queue<int, vector<int>, greater<int>> pq;
	priority_queue<int, vector<int>, greater<int> > pq;
	for(int i = 0; i < n; ++i) {
		while(pq.size() && v[i].first > pq.top()) {
			pq.pop();
		}
		if(pq.size() >= k - 1) {
			ans += C(pq.size(), k - 1);
		}
		pq.push(v[i].second);
	}
	cout << ans % MODE << endl;
}
作者:LightAc
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/lightac/p/13729172.html