平時十八測

2022-05-29 04:54:07 字數 3411 閱讀 6112

今天沒有一道題想到正解,全部打的暴力,今天題思維很活啊;

第一題:主要是利用只有26個字母,往這方面想了,但失敗了;

計數排序:主要針對資料很集中的;

建26棵線段樹,記錄區間中該數有多少個,每次查詢區間中26個字母各有多少個,按順序排列;就乙個區間查詢,修改操作,此題卡常;

#includeusing

namespace

std;

const

int m = 1e5 + 5

;char

s[m];

int f[m][27], n, m, cnt[27

];int

read()

while(c<='

9'&&c>='0')

return x*=f;

}#define for(a, b, c) for(int a = b; a <= c; a++)

struct

node

void down(int lf, int

rg) }

}pool[(m * 27 )<< 2], *root[27], *tail =pool;

#define ls nd->ls, lf, mid

#define rs nd->rs, mid+1, rg node *build(int d, int lf = 1, int rg =n)

return

nd;}

void del(int l, int r, node *nd, int lf = 1, int rg =n)

else

return;}

int query(int l, int r, node *nd, int lf = 1, int rg =n)

int mid = (lf + rg) >> 1

; nd->down(lf, rg);

int ans = 0

;

if(l <= mid) ans +=query(l, r, ls);

if(r > mid) ans +=query(l, r, rs);

nd->up();

return

ans;

}int

main()

for(i,

1, 26) root[i] =build(i);

while(m--)

}else}}

for(i,

1, n)

for(j,

1, 26

)

if(query(i, i, root[j])) putchar('

a'+j-1

); putchar('\n

');}

view code

第二題:神奇的dp;

dp[i][j] 表示考慮到前i列,滿足右區間的放了j個的方案數;sl, sr,是對左右區間記錄的字首和

這個轉移=左方案*右方案;越過乙個左側區間的右端點時,從之前剩下的空列中選一列在這個左側區間放1。轉移時分在右側區間放1或不放1;

考慮右邊:可以不放dp[i-1][j], 也可以放f[i-1][j-1] * (sr[i] - (j-1));

考慮左邊:對於每個在sl[i-1]到sl[i]的行列舉右邊放了j個, 則有 (i - j - k) (k = sl[i-1] ~ sl[i] - 1) 位置可以選擇;

#includeusing

namespace

std;

#define rg register

const

int m = 3005

;#define ll long long

const ll mod=998244353

;ll f[m][m];

intsl[m], sr[m];

intmain()

for(int i = 1; i <= m; i++) sl[i] += sl[i - 1], sr[i] += sr[i - 1

]; f[

0][0] = 1

;

for(int i = 1; i <= m; i++)

}printf(

"%lld\n

", f[m][n]);

return0;

}

view code

第三題:trie樹;

對手做的是將x在二進位制下左移一位。假設在異或i個數後左移,等價於開始時先左移,然後把前i個數左移一位。(這道題其他都想到了,就是這個沒想到)

問題轉化為選乙個數,使它左移一位後,與m+1個給定數分別異或的最小值最大。

將m+1個數建立一棵字典樹,從上到下遍歷來最大化結

果:走到乙個點時,如果往下只有0,說明我們這一位取1異或後只能是1,累計結果中加上這一位的值,只有1也一樣;如果既有0又有1,說明這一位無論怎麼取最後都是0,分別往下走即可。

時間複雜度o(nm)。

#includeusing

namespace

std;

const

int m = 1e5 + 5, me =5e6;

int a[m], pre[m], lst[m], bin[32

], c[m];

int ch[me][2

];int

ans , cnt, tot, up, n;

void insert(intx)}

void dfs(int now, int dep, int

val)

if(ch[now][0] && ch[now][1

])

else

if(ch[now][1

])

else

}int

main()

up = 1

<

for(int i = m; i; i--)lst[i] = lst[i+1]^a[i];

for(int i = 0; i <= m; i++)

dfs(

0, n-1, 0

); printf(

"%d\n%d\n

", ans, cnt);

}

view code

平時十四測

第一題 藍書原題,單詞建邊,跑尤拉路 無向聯通圖 尤拉路 有2個度數為奇數的點 尤拉迴路 沒有度數為奇數的點 有向聯通圖 尤拉路 每個點入度 出度 或者 起點出度 入度 1 終點出度 入度 1,剩餘點出度 入度 includeusing namespace std const int me 2000...

學軍聯賽模擬 第十八測 題解

a.首先有個樸素的動態規劃思路 記 f 表示前 i 個位置 最後乙個位置的顏色是 j 的方案數。轉移要用到容斥原理 用總方案數減去 j 連續出現 a 1 次的方案數。記 g sum 則 f g g 1 f 1 j 注意到對於 a 相同的顏色顯然狀態相同 可以分批轉移。時間複雜度 o n 2 b.二分...

Linux學習之十八(使用選項及組合條件測試)

使用指令碼選項及組合條件測試 測試 整數測試 le 小於等於 lt 小於 ge 大於等於 gt 大於 eq 等於 ne 不等於 字元測試 等於 不等於 大於 小於 n 測試指定字串是否為空,空則真,不空為假 z 測試指定字串是否不空,空則假,不空為真 檔案測試 e 該檔名是否存在 f 該檔名是否存在...