CF-1163

CF-1163

ポータル

ペナルティ A B1 B2 C1 C2 D E F
3(483) 464 0 0時06分 1午前1時13分 3 1時12分 + 1時57 + 1時56分

A

増加していない最初の人を離れるときは、ときに、第2の人は離れてコンパートメントを残すために

m = 0で、答えが0である場合

場合Nでも、2メートル<= nの場合、答えはそうでなければ、NM、Mであります

nが奇数の場合2メートル<= N次いで答えは同じパリティであることが見出されたM、さもなければNM、あります

int n,m;
int main() 
{
    cin>>n>>m;
    if(m == 0){
        cout<<1<<endl;return 0;
    }
    else if(n == 1){
        cout<<1<<endl;return 0;
    }
    else if(2 * m <= n){
        cout<<m<<endl;
    }
    else cout<<n-m<<endl;
    return 0;
}

B

Bは、姿勢の問題の崩壊を行い、これは確かにハックするフィールドであり、

ケースはあまりないですが、我々は慎重に検討する必要があります

  • 全1色
  • 1のすべての色の発生
  • 他は同じ大きさの一定数のため、発生数が1色です
  • 色の数がX + 1としてそこに表示されている、xは他の色の出現回数であります
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <ctime>
#include <vector>
#include <fstream>
#include <list>
#include <iomanip>
#include <numeric>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(s) memset(s, 0, sizeof(s))
const int inf = 0x3f3f3f3f;
const int N = 1e5+10;
int n,u[N],c[N],num[N],cnt;
int main() 
{
    cin>>n;
    int res = 1;
    for(int i=1;i<=n;i++){
        scanf("%d",&u[i]);
        if(c[u[i]] == 0){
            c[u[i]] ++;
            num[1]++;
            cnt++;
        }
        else{
            num[c[u[i]]] --;
            c[u[i]]++;
            num[c[u[i]]] ++;
        }
        if(num[c[u[i]]] == i)res = i;//case1
        if(num[1] == i)res = i;//case2
        if(i > 1 && c[u[i]] == 1 && (i-1) % (cnt-1) == 0 && num[(i-1)/(cnt-1)] == cnt-1)//case3.1
            res = i;
        if(num[c[u[i]]] * c[u[i]] == i-1){//case3.2
            res = i;
        }
        if(num[c[u[i]]] == 1 && num[c[u[i]]-1] == cnt-1)res = i;
        if(num[c[u[i]]] == cnt - 1 && num[c[u[i]]+1] == 1)res = i;
    }
    cout<<res<<endl;
    return 0;
}

C

各ラインではなく、計算の答えに平行な直線を保存することができ

const int N = 1010;
int n;
int x[N],y[N];
map<pair<int,int> ,set<int > > mp;
int main() 
{
    cin>>n;
    ll res = 0;
    ll tot = 0;//直线总数
    for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i == j)continue;
            int x1 = x[i], x2 = x[j];
            int y1 = y[i], y2 = y[j];
            int dx = x[i] - x[j];
            int dy = y[i] - y[j];
            int g = __gcd(dx,dy);
            dx /= g;dy /= g;
            if(dx < 0 || (dx == 0 && dy < 0)){
                dx = -dx;
                dy = -dy;
            }
            int c = dx * y1 - dy * x1;//求解直线dx*y = dy * x + c 
            if(!mp[{dx,dy}].count(c)){//如果直线没有记录过
                tot++;
                mp[{dx,dy}].insert(c);
                res += tot - mp[{dx,dy}].size();//tot要减去与它平行的直线
            }
        }
    }
    cout<<res<<endl;
    return 0;
}

D

滞在ピット

E

滞在ピット

おすすめ

転載: www.cnblogs.com/1625--H/p/11361241.html