金
各行差動複雑さが高すぎる場合にのみ、しかし、間隔差が考えられる変更に関する。統計が二回掃引することができ、2つの差動間の差を維持することが可能で、差動フラグが(斜線横ライン)にも連続している私たちを見つけます。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 名前空間stdを使用。 typedefの長い長いLL。 const int型N = 2005; 読み取りINT() { int型のx = 0、F = 1; CHAR CH = GETCHAR()。 (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。 x * Fを返します。 } int型N、Q。 LL DIF1 [N] [N]、DIF2 [N] [N]。 INTメイン() { //freopen("dt.in","r",stdin)。 //freopen("my.out","w",stdout); N =読み取る(); Q =読み取り()。 一方、(q--) { int型、R =読み取り()、C =読み取る()、L =読み取る()、ヴァル=読み取ります(); } ための式(I = 1 int型、iが<= N; I ++) のための(INT J = 1; J <= N; J ++) DIF2 [I] [J] + = DIF2 [I-1] [J-1]、 DIF1 [I] [J] + = DIF1 [I-1]〜[J]。 LL ANS = 0。 以下のために(INT i = 1; iが<= N; iは++) { ための(int型J = 1; J <= N; J ++) DIF1 [I] [J] + = DIF1 [I]、[J-1] + DIF2 [ I] [j]を、ANS ^ = DIF1 [I] [J]。 } COUT << ANS << ENDL。 0を返します。 }
bvの
フィールドの現在の状態のボールの残りの部分についてのバイナリのような圧力は、検索することを忘れないでください。メモリの状態は直接飛ぶマッピングするハッシュテーブルTを書面で要求されています。
さらに、00110と0110が異なる問題のフォームの現在の状態では、我々は、ハッシュテーブルの長さの複数のパラメータ、最初の長さのそれぞれの挿入または再クエリ動作に同調するたびに支払うために区別することができます。
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <アルゴリズム> の#include <ベクトル> 使用して名前空間std。 const int型H = 2E7 + 5。 構造体hash_map { int型のヘッド[19260820]、NXT [H]、[H]に、TOT。 短いL [H]、LEN。 二重ヴァル[H]。 ダブル&演算子[](INTキー) { int型X = 1LLの*キー*%19260817をlenは、 (; I I = NXT [I] I =ヘッド[X] INT)のための ([I] == LEN [I] ==キー&& Lに)ヴァル[I]を返す場合。 NXT [++ TOT =頭部[X]。 ヘッド[X] = TOT。 【TOT =キーに、 L [TOT = LEN。 戻りヴァル[TOT] = - 1。 } }、H。 CONST int型N = 35。 INT、N、K。 チャーS [N]。 int型の消去(ST、int型のPOSをint型) { ST >> POS << POS-1を返す| ST&(1 << POS-1)-1; } ダブルDFS(int型のPOS、int型ST) { IF(NK == POS)戻り0; h.len = POS; int型のSST = ST; IF(H [ST]> = 0)戻りH [ST]。 H [ST] = 0; INTのREZ [N]。 以下のために(INT i = 1; iは= POSを<; I ++は、SST >> = 1) REZ [I] = SST&1。 以下のために(INT i = 1; iが<=(POS >> 1); iは++) { int型J = POS-I + 1。 int型S1 =(ST、j)は、S2 =消去(ST、i)を消去します。 二重RES1 = DFS(POS-1、S1)+ REZ [J]、RES2 = DFS(POS-1、S2)+ REZ [I]。 h.len = POS; H [ST] + = 2.0 /のPOS * maxを(RES1、RES2)。 } IF(POS&1) { 私は=(POS >> 1)+ 1、S1 =消去(ST、POS-I + 1)int型。 ダブルRES =のDFS(POS-1、S1)+ REZ [I]。 h.len = POS; H [ST] + = 1.0 / POS * RES。 } 戻りH [ST]。 } int型のmain() { scanf関数( "%D%D%s"は、&N、&K、S + 1)。 = 0になりましたint型。 以下のために(INT i = 1; iが<= N; iは++) { 今<< = 1。 もし(S [i]を== 'W')今| = 1; } のprintf( "%7LFする\ n"、今DFS(N))。 0を返します。 }
CW
フェアリーDP。もしそのような増加、特異点/ 2の数に等しいパスの数の最後の増加として見られる経路と逆の経路。
#include <cstdioを> する#include <iostreamの> する#include <CStringの> に#define PA対<整数、整数> 名前空間stdを使用。 読み取りINT() { int型のx = 0、F = 1; CHAR CH = GETCHAR()。 (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。 x * Fを返します。 } のconst int型N = 1E5 + 5、INF = 0x3f3f3f3f。 int型のn; [N << 1]、頭部[N]、NXT [N << 1]、W [N << 1]、TOTにint型。 PA DP [N] [2]。 PAのPLS(PAのX、PAのY) { 戻りmake_pair(x.first + y.first、x.second + y.second)。 } ボイド追加(int型のx、int型のY、int型Z) { [++ TOT = Yであり; NXT [TOT =頭部[X]。 W [TOT = Z。 { } ボイドDFS(int型のx、int型のF、int型E) { PAのA = make_pair(0,0)、B = make_pair(INF、INF)、C、D。 以下のために(INT I =ヘッド[X]; I; I = NXT [I]) { にINT Y = [I]。 (Yの== fは)継続する場合。 DFS(Y、X、W [I])。 C =分(PLS(DP [Y] [0])、PLS(B、DP [Y] [1]))。 D =分(PLS(DP [Y] [1])、PLS(B、DP [Y] [0])); =のC; B = D。 } IF(E == 1)DP [X] [0] = make_pair(INF、INF)。 他DP [X] [0] =分(make_pair(b.first + 1、b.second))。 IF(E == 0)DP [X] [1] = make_pair(INF、INF)。 他DP [X] [1] =分(make_pair(a.first + 1、a.second + 1)、make_pair(b.first、b.second + 1))。 } INT(メイン) N =読み取ります()。 以下のために(INT i = 1; iがn <; iは++) { int型のx =読み取る()、yは読み取ら=()、COL =読み取る()、照準=(読み取り)、Z。 もしZ(== 2 AIM)=目指します。 他のz = COL ^目指します。 (X、Y、Z)を追加し、(X、Y、Z)を追加します。 } DFS(1,1,0)。 COUT <<(DP [1] [0] 1次回>> 1)<<」「<< DP [1] [0] << .second ENDL。 0を返します。 }