zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    玩转Web之easyui(一)-----easy ui datagird 分页
    【JavaEE基础】在Java中如何使用jdbc连接Sql2008数据库
    Android访问服务器(TOMCAT)乱码引发的问题
    工厂方法模式--结合具体例子学习工厂方法模式
    FatMouse' Trade
    简单工厂模式--结合实例学习简单工厂模式
    栈-----括号匹配+表达式计算
    Android控件之RadioGroup与RadioButton(单选控件)
    Android控件之CheckBox(复选框控件)
    Android控件之ToggleButton(多状态按钮)
  • 原文地址:https://www.cnblogs.com/lightac/p/13729172.html
Copyright © 2011-2022 走看看