[AtCoder] AtCoderグランドコンテスト040問題解決レポート

競争を入力するにはここをクリック

\(A \):> <(表面タイトルを見るにはここをクリックしてください

一般的な問題の意味:あなたの長さを与えるために(。\ 1-N-)\\(<\)\(> \)最初の文字列\(I \)文字のビットを表すI(\ \ )数および\(I + 1 \)の大小関係の数、非負整数及び最小のアレイによって必要な要素。

私は実際に早期警告を引退、それを実行する前に、数分間のサブテーマを送りたい......

もちろん、数は少ないすべての側面よりもであり、我々はそれを値与える\(0 \) その後側に側からそれらに延長します。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 500000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,H=1,T=0,a[N+5],q[N+5],vis[N+5];string s;
int main()
{
    RI i,k;cin>>s,n=s.length()+1,s="%"+s+"%",s[1]=='<'&&(q[++T]=1),s[n-1]=='>'&&(q[++T]=n);
    for(i=2;i^n;++i) s[i-1]=='>'&&s[i]=='<'&&(q[++T]=i);W(H<=T) k=q[H++],
        s[k-1]=='>'&&(Gmax(a[k-1],a[k]+1),!vis[k-1]&&(vis[q[++T]=k-1]=1)),//向左扩展
        s[k]=='<'&&(Gmax(a[k+1],a[k]+1),!vis[k+1]&&(vis[q[++T]=k+1]=1));//向右扩展
    long long ans=0;for(i=1;i<=n;++i) ans+=a[i];return printf("%lld",ans),0;//统计答案
}

\(B \) 二つのコンテスト(問題の表面を見るにはここをクリックしてください

大雑把な質問の意味:そこ\(N \)間隔で、その間隔と最大の交差点の大きさの2つの部分つまり、あなたが空でない二つの部分にそれを置くようにします。

まず、我々はいくつかの間隔のために、知っておく必要があります\([L_iを、R_iと] \) その交差点のサイズ\( -最大\ {L_iを\} + 1,0)\最大(最小\ {R_iと\})

従って、第1の左の端部を選別し、左の点の前記最大値の範囲の列挙\(L_iを\) 左最大間隔の、他の点\(L_n \)を

右の点については、2つの可能性があります。

設けられた第(1 \ SIM I \)\線分最小を\(R&LT \)\(R_ {分} \)の最大\(R_ \ {最大}) 最初の\(I + 1 \シムN- \)最小\(R&LT \)\(MN \)

次いで、最適の場合、二組の(分\ {R_iを\} \ \) またはである\(分R_ {}、Mnは\) またはであり、\(R_ {最大}、最小 (R_ {分} 、Mn)は\)

左ポイントと右ポイントを決定し、それゆえ我々は答えを更新することができます。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n;set<int> p,q;
struct Il {int x,y;I bool operator < (Con Il& o) Con {return x<o.x;}}s[N+5];
class FastIO
{
    private:
        #define FS 100000
        #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
        #define tn (x<<3)+(x<<1)
        #define D isdigit(c=tc())
        char c,*A,*B,FI[FS];
    public:
        I FastIO() {A=B=FI;}
        Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
}F;
int main()
{
    RI i,j,t,ans=0;for(F.read(n),i=1;i<=n;++i) F.read(s[i].x),F.read(s[i].y);
    for(sort(s+1,s+n+1),i=1;i<=n;++i) q.insert(s[i].y);//排序,一开始默认所有线段在第二个集合
    for(i=1;i<=n;++i) q.erase(s[i].y),p.insert(s[i].y),t=0,//枚举一个区间的左端点最大值,把对应右端点移入第一个集合中
        Gmax(t,max(*--p.end()-s[i].x+1,0)+max(min(*p.begin(),*q.begin())-s[n].x+1,0)),//第一种情况
        Gmax(t,max(*p.begin()-s[i].x+1,0)+max(*q.begin()-s[n].x+1,0)),Gmax(ans,t);//第二种情况,更新ans
    return printf("%d",ans),0;
}

\(C \):AB NOR BA(どちらも問題の表面を見るにはここをクリックしてください

一般的な問題の意味:の一つは\(A、B、C \ ) 文字の3種類の文字列を、それぞれ2連続していない削除されABたりBA、文字、必要な長さの数を\(N- \)文字あなたは空の文字列を削除することができます。

まず、我々は何もありません考える\(C \)の状況は。

この場合、我々は奇数ビットの上に置けば(A \)\となり\(B \)、\ (B \)\(A \) 場合にのみ、見つけることができます(A \)\\ (B \)同じ数は、この空の文字列を削除することができます。

同時にによる変更後の元の文字列の対応限り、変更後の文字列の数の文字列に、あなたは答えを見つけることができます。

存在を考える\(C \)ので、(C \)\とみなすことができる\(A \)または\(B \)限り、一方のいずれかを(A \)\\(B \)のより小さいまたは等しい数の数との差\(C \)数は、空削除してもよいです。

答えが包含と排除、即ち取得考慮することができる\(A \)\(B \)の差が数より多い(C \)は\プログラムの数を与え、その後総数スキームを差し引きます。

この時点で存在しなければならない\(A \)または\(B \)がある種の\(I \)番目(\(I> \ FRAC N2 \) 、)残り\ニッケル(Ni \)できる位置他の文字を記入し、\(C \)

すなわち、この場合、プログラムの数は以下のとおりです。

\ [C_N ^ I \回2 ^ {NI} \]

したがって、プリ階乗階乗逆、\(O(N)\)列挙\(I \) 統計は答えることができます。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 10000000
#define X 998244353
#define C(x,y) (1LL*Fac[x]*IFac[y]%X*IFac[(x)-(y)]%X)
using namespace std;
int n,Fac[N+5],IFac[N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
int main()
{
    RI i,t=0;for(scanf("%d",&n),Fac[0]=i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;//预处理阶乘
    for(IFac[n]=Qpow(Fac[n],X-2),i=n-1;~i;--i) IFac[i]=1LL*IFac[i+1]*(i+1)%X;//预处理阶乘逆元
    for(i=n/2+1;i<=n;++i) t=(1LL*C(n,i)*Qpow(2,n-i)+t)%X;//计算答案
    return printf("%d",(Qpow(3,n)-2*t%X+X)%X),0;//容斥,注意乘2
}

\(D \) バランスビーム(ピットを充填するの会計処理)

\(E \) プレフィックスサフィックスの追加(充填するピットを占めます)

\(F \) :(充填するピットを占める)2個

おすすめ

転載: www.cnblogs.com/chenxiaoran666/p/AtCoderAGC040.html
おすすめ