今天沒有一道題想到正解,全部打的暴力,今天題思維很活啊;
第一題:主要是利用只有26個字母,往這方面想了,但失敗了;
計數排序:主要針對資料很集中的;
建26棵線段樹,記錄區間中該數有多少個,每次查詢區間中26個字母各有多少個,按順序排列;就乙個區間查詢,修改操作,此題卡常;
#includeusingview codenamespace
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
');}
第二題:神奇的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) 位置可以選擇;
#includeusingview codenamespace
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;
}
第三題:trie樹;
對手做的是將x在二進位制下左移一位。假設在異或i個數後左移,等價於開始時先左移,然後把前i個數左移一位。(這道題其他都想到了,就是這個沒想到)
問題轉化為選乙個數,使它左移一位後,與m+1個給定數分別異或的最小值最大。
將m+1個數建立一棵字典樹,從上到下遍歷來最大化結
果:走到乙個點時,如果往下只有0,說明我們這一位取1異或後只能是1,累計結果中加上這一位的值,只有1也一樣;如果既有0又有1,說明這一位無論怎麼取最後都是0,分別往下走即可。
時間複雜度o(nm)。
#includeusingview codenamespace
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);
}
平時十四測
第一題 藍書原題,單詞建邊,跑尤拉路 無向聯通圖 尤拉路 有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 該檔名是否存在...