こんにちは、問題への解決策2020

新年最初のです。

2分の書き込みAを開く、そして5分Bを書いて、それから4分C.を書きました

それ以来、脳が描かれた、と明らかにコードDに始めた、それは最後まで18minを取ったと考えられています。

そして、人々のバディリストを見つけるせいぜい4つの質問をカットしないように見えるが、またプレーします。

その後E.を考え始めます

[スタート]は、点の集合がどのように何回カウントされる(3例があるでしょう)凸多角形と積分凹ポリゴンかどうかを尋ねなければなりません。

あなたは別れる気にし、3例は一度だけカウントすることができます参照してください......

5分が正当な場合は、1つが正当なものであると、起こることが判明した後、時間の束を無駄に......

そして、オープンコード。予想されるコードよりも良いです。しかし、計算幾何学のために、それはまだ1Hおそらく、長い時間がかかりました。

次にWA9。

それでもトラブルシューティング、あまりにも書きたかっない撮影するには、すべての死者をチェックしてください。

治療を放棄し、水がグループに行ってきました。

......

彼らはペナルティの送信時に長い二考えるのはその後ナイーブ、十分です。

最後に言い渡さ再建は最終的に彼は2:09で失っていた、クロス製品+象限の文言となっています。

EはまたC.よりも少ない得点しました

これは、IM上で再生するためにかなり良いに見えます。

(劇的なシーン:2分最後にカット観光GがRK1オン、予測値の表示はまだDLS 2つのリスト、FST Gの後、観光客になります)

(王位へのDLSのお祝いは、今年は初年度MiFaFaOvOです)


A

シミュレーションを取得します。


コード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=22;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,m,q;
char s[maxn][maxn],t[maxn][maxn];
int main(){
    n=read();m=read();
    FOR(i,0,n-1) scanf("%s",s[i]+1);
    FOR(i,0,m-1) scanf("%s",t[i]+1);
    q=read();
    while(q--){
        int y=read()-1;
        printf("%s%s\n",s[y%n]+1,t[y%m]+1);
    }
}

B

どのように私自身のAビットの質問と......

ターンでは、ある違法なスキームの数を、計算し、シーケンスの数は上昇しません。

選んだ考えてみましょう\(I、J \)に、その後、一緒に作品を\(私は、J \)が昇順されていないため、および\(last_i \ GEは\ first_j)

シーケンスが列挙を実行するために上昇しない\(I \)計算し、(\ルlast_i \)\です(first_j \)\どのように多くの。1~2分、それが接頭辞することができます。

時間複雑\(O(N \ Nログ )\) または\(O(N + \ MAX(A))\)


コード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=1000100;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,l,a[maxn],s[maxn],t[maxn],m,cnt[maxn];
ll ans;
int main(){
    n=read();
    FOR(i,1,n){
        l=read();
        FOR(j,1,l) a[j]=read();
        bool flag=false;
        FOR(j,2,l) flag|=a[j-1]<a[j];
        if(!flag) cnt[a[1]]++,t[++m]=a[l];
    }
    FOR(i,1,1000000) cnt[i]+=cnt[i-1];
    ans=1ll*n*n;
    FOR(i,1,m) ans-=cnt[t[i]];
    printf("%lld\n",ans);
}

C

検討([L、R] \ \ ) 連続セグメントとして出現数。

行数容易にすることができ、\((L-R&LT + 1)!\)

行の残りの数を容易にすることができ、\((N-(L-R&LT + 1))!\)

連続したセグメントの開始位置を選択し、\(N-(L-R&LT + 1)+ +1 \)

これは、同じ長さのものを発見した([L、R] \ \ ) の貢献として。列挙長、答えは\(\ DisplayStyle \ sum_ {I}。1 ^ =ニッケル!(Ni)から!ニッケル(Ni + 1)^ 2 \)

時間複雑\(O(N)\)


コード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=250025;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,mod,ans,fac[maxn];
int main(){
    n=read();mod=read();
    fac[0]=1;
    FOR(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
    FOR(i,1,n) ans=(ans+1ll*fac[n-i]*fac[i]%mod*(n-i+1)%mod*(n-i+1))%mod;
    printf("%d\n",ans); 
}

D

それだけで必要性がの大きさを検討することを見出した\(2 \)サブセットを。

サイズがある場合ため\(2 \)の条件が満たされないことが満たされていない条件の部分集合であり、サイズのすべての場合\(2 \)次に、明らかに全体も満たす条件、条件の部分集合が満たされています。

任意の2つ(ないことを確認するもの)のために、またはそれらを支払うと同時に、または同時に2つのセクションを支払う必要はありませんがあります。問題はその後になります。

そして、実践の千約10種類があります。

私のアプローチのための:(\ \ texttt {A} \ ) ポストせずに間隔を判断もの\(\ texttt {B} \ ) の間隔が支払われていない;のための\(\ texttt {B} \ ) 間隔がないポストされていないもの、が判定される(\ texttt {A} \ \ ) 間隔が支払われていません。

ここでは最初のものを言うだけです。

プレス\(\ texttt {A} \ ) の昇順に間隔左点。列挙最初に考慮すべき\(\ texttt {A} \ ) の間隔は、列挙の右端よりも小さい\(\ texttt {A} \ ) 第二のものは、できる限り、すべて左セクションポイント。

分析\(\ texttt {B} \ ) の間隔が支払われていない、それぞれの第二のものかもしれない\(\ texttt {B} \ ) 、次いで間隔プラス間隔行い、そして最初に決定\(\ texttt { B} \)間隔とするかどうか(0 \)\

時間複雑\(O(N \ N-ログ)\)


コード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=222222;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
struct seg{
    int la,ra,lb,rb;
}s1[maxn],s2[maxn];
int n,la[maxn],ra[maxn],lb[maxn],rb[maxn],tmpa[maxn],tla,tmpb[maxn],tlb;
ll b1[maxn],b2[maxn];
inline bool cmpla(const seg &x,const seg &y){return x.la<y.la;}
inline bool cmpra(const seg &x,const seg &y){return x.ra<y.ra;}
inline bool cmplb(const seg &x,const seg &y){return x.lb<y.lb;}
inline bool cmprb(const seg &x,const seg &y){return x.rb<y.rb;}
inline void update(ll *bit,int p,ll v){
    for(int i=p;i<=max(tla,tlb);i+=i&-i) bit[i]+=v;
}
inline ll query(ll *bit,int p){
    ll s=0;
    for(int i=p;i;i-=i&-i) s+=bit[i];
    return s;
}
inline void update(int p,ll v){
    update(b1,p,v);
    update(b2,p,1ll*p*v);
}
inline ll query(int p){
    return 1ll*(p+1)*query(b1,p)-query(b2,p);
}
inline void update(int l,int r,ll v){
    update(l,v);update(r+1,-v);
}
inline ll query(int l,int r){
    return query(r)-query(l-1);
}
int main(){
    n=read();
    FOR(i,1,n){
        la[i]=read();ra[i]=read();lb[i]=read();rb[i]=read();
        tmpa[++tla]=la[i];tmpa[++tla]=ra[i];
        tmpb[++tlb]=lb[i];tmpb[++tlb]=rb[i];
    }
    sort(tmpa+1,tmpa+tla+1);tla=unique(tmpa+1,tmpa+tla+1)-tmpa-1;
    sort(tmpb+1,tmpb+tlb+1);tlb=unique(tmpb+1,tmpb+tlb+1)-tmpb-1;
    FOR(i,1,n){
        la[i]=lower_bound(tmpa+1,tmpa+tla+1,la[i])-tmpa;
        ra[i]=lower_bound(tmpa+1,tmpa+tla+1,ra[i])-tmpa;
        lb[i]=lower_bound(tmpb+1,tmpb+tlb+1,lb[i])-tmpb;
        rb[i]=lower_bound(tmpb+1,tmpb+tlb+1,rb[i])-tmpb; 
        s1[i]=s2[i]=(seg){la[i],ra[i],lb[i],rb[i]};
    }
    sort(s1+1,s1+n+1,cmpla);
    sort(s2+1,s2+n+1,cmpra);
    int cur=1;
    FOR(i,1,n){
        while(cur<=n && s2[cur].ra<s1[i].la){
            update(s2[cur].lb,s2[cur].rb,1);
            cur++;
        }
        if(query(s1[i].lb,s1[i].rb)) return puts("NO"),0;
    }
    MEM(b1,0);MEM(b2,0);
    sort(s1+1,s1+n+1,cmplb);
    sort(s2+1,s2+n+1,cmprb);
    cur=1;
    FOR(i,1,n){
        while(cur<=n && s2[cur].rb<s1[i].lb){
            update(s2[cur].la,s2[cur].ra,1);
            cur++;
        }
        if(query(s1[i].la,s1[i].ra)) return puts("NO"),0;
    }
    puts("YES");
}

E

各点について計算\(P \)貢献。残りの4つの選択された点で、後の缶内のすべてのことが判明\(pは\)直線の辺の条件を満たしていません。

バック計算から、(残りの4つの選択された点で)方式、全体でエネルギーを差し引いた後の合計数\(P \)直線の側面。

\(P \)原点として、残りの順序付けられたシーケンス極角点。

列挙最も反時計回りに(それが何を意味するか知っている必要があります)ポイント、3ポイントがランダムに選択された間隔で休むことができるはずです。この間隔は、ダブルポインタで計算することができます。

時間複雑\(O(N-2 ^ \ n型ログ)\)

注意、使用しないでくださいatan2、それは好ましくは、クロス積によって決定されます。


コード

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=5050;
const long double pi=3.141592653589793238;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
inline int at(int x,int y){
    if(x>=0 && y>0) return 0;
    if(x<0 && y>=0) return 1;
    if(x<=0 && y<0) return 2;
    if(x>0 && y<=0) return 3;
    return -1;
}
struct point{
    int x,y;
    point(int xx=0,int yy=0):x(xx),y(yy){}
    point operator+(const point &p)const{return point(x+p.x,y+p.y);}
    point operator-(const point &p)const{return point(x-p.x,y-p.y);}
    point operator-()const{return point(-x,-y);}
    ll operator*(const point &p)const{return 1ll*x*p.y-1ll*y*p.x;}
    bool operator<(const point &p)const{
        if(at(x,y)!=at(p.x,p.y)) return at(x,y)<at(p.x,p.y);
        return *this*p>0;
    }
}p[maxn],q[maxn];
int n;
ll ans;
int main(){
    n=read();
    FOR(i,1,n) p[i].x=read(),p[i].y=read();
    FOR(i,1,n){
        FOR(j,1,n) if(j!=i) q[j-(j>i)]=p[j]-p[i];
        sort(q+1,q+n);
        FOR(j,1,n-1) q[j+n-1]=q[j];
        ans+=1ll*(n-1)*(n-2)*(n-3)*(n-4)/24;
        int cur=1;
        FOR(j,1,n-1){
            cur=max(cur,j);
            while(cur<2*n-2 && q[cur+1]*(-q[j])>0) cur++;
            int x=cur-j;
            ans-=1ll*x*(x-1)*(x-2)/6;
        }
    }
    printf("%lld\n",ans);
}

F / G

いいえ、クッション。

おすすめ

転載: www.cnblogs.com/1000Suns/p/12150949.html