日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

topcoder srm 490 div1

發(fā)布時(shí)間:2025/3/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 topcoder srm 490 div1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

problem1 link

首先每$n*m$一定是一個(gè)循環(huán),所以只需要考慮時(shí)間$[0,n*m-1]$即可。這個(gè)期間一共出現(xiàn)了$n$個(gè),第i個(gè)的出現(xiàn)時(shí)間為$m*i$,離開的時(shí)間為$\left \lceil \frac{mi}{n} \right \rceil*n$,所有答案為:

ans=$\frac{\sum_{i=0}^{n-1}(\left \lceil \frac{mi}{n} \right \rceil*n-mi)}{n}$

=$\frac{n\sum_{i=0}^{n-1}\left \lceil \frac{mi}{n} \right \rceil-\sum_{i=0}^{n-1}mi}{n}$

=$\sum_{i=0}^{n-1}\left \lceil \frac{mi}{n} \right \rceil-\frac{(n-1)m}{2}$

設(shè)$A=\sum_{i=0}^{n-1}\left \lceil \frac{mi}{n} \right \rceil=\sum_{i=0}^{n-1}\left \lfloor \frac{mi}{n} \right \rfloor+n-X$?

其中$X$是那些$mi$正好是$n$的倍數(shù)因此不需要加1的個(gè)數(shù)。

現(xiàn)在的問(wèn)題是計(jì)算$B=\sum_{i=0}^{n-1}\left \lfloor \frac{mi}{n} \right \rfloor$

它等于$\sum_{i=0}^{n-1}\left \lfloor \frac{mi}{n} \right \rfloor=\frac{(n-1)(m-1)}{2}-\frac{gcd(n,m)-1}{2}$

這個(gè)的證明在具體數(shù)學(xué)中文版第二版第77頁(yè)到第78頁(yè)。

problem2 link

首先將所有的前綴編號(hào),預(yù)處理轉(zhuǎn)換表$T[id][k]$表示前綴id在輸入$k$時(shí)轉(zhuǎn)換到的狀態(tài),其中$k$表示數(shù)字以及星號(hào)。

然后設(shè)$f[i][id]$表示當(dāng)前“fix”部分為$word$的前$i$個(gè),且"unfix"部分的標(biāo)號(hào)為id的最小操作次數(shù)。然后進(jìn)行dp即可。

problem3 link

首先,在$n*m$個(gè)一個(gè)pattern中(n為高度,m為寬度),位置$(x_{1},y_{1})$到位置$(x_{2},y_{2})$的最短路徑可能會(huì)經(jīng)過(guò)其他重復(fù)的pattern。可以證明,如果經(jīng)過(guò)該patern上面的pattern,最多只需要考慮$\left \lceil \frac{m}{2} \right \rceil^{2}$個(gè)

假設(shè)每次進(jìn)入上面一個(gè)pattern是進(jìn)入是第$i$列,出來(lái)時(shí)是第$j$列,$i \ne j$。那么不會(huì)出現(xiàn)兩個(gè)pattern進(jìn)入出來(lái)時(shí)的$i,j$一模一樣,否則可以省略中間的一些pattern。這樣考慮的話不同的$i,j$對(duì)有$\frac{m(m-1)}{2}$個(gè),所以至多向上考慮這么多即可。

進(jìn)一步考慮。將pattern的最后一行按照連續(xù)的空列分成若干組,那么很明顯最多有$\left \lceil \frac{m}{2} \right \rceil$組(每隔一個(gè)空列有一個(gè)障礙格子)。跟上面同樣的考慮方法,進(jìn)入的組和出來(lái)的組不會(huì)有兩個(gè)pattern是完全一樣的,否則可以省略(因?yàn)橐粋€(gè)組是聯(lián)通的)。所以向上最多需要考慮$\left \lceil \frac{m}{2} \right \rceil^{2}$個(gè)pattern即可。

這樣就可以處理出一個(gè)$m*m$的矩陣$A[i][j]$,表示從pattern的第一行的第 $i$ 列格子到達(dá)下一個(gè)pattern的第一行的第$j$列格子的最短路徑。

這樣的話,對(duì)于那么$r_{1},r_{2}$中間有很多pattern的情況,可以進(jìn)行類似矩陣冪的優(yōu)化。

?

code for problem1

import java.util.*; import java.math.*; import static java.lang.Math.*;public class Starport {public double getExpectedTime(int N, int M) {long t = (long)(N - 1) * M;long r = upper(N, M) - t / 2;if (t % 2 == 0) {return r;}return r - 0.5;}long upper(long n, long d) {if (n == 1) {return 0;}long nn = n / gcd(n, d);long p = (n - 1) / nn + 1;return lower(n, d) + n - p;}long gcd(long x, long y) {if (y == 0) {return x;}return gcd(y, x % y);}long lower(long n, long m) {return ((n - 1) * (m - 1) + gcd(n, m) - 1) / 2;}}

  

code for problem2

import java.util.*; import java.math.*; import static java.lang.Math.*;public class QuickT9 {static int[] D = new int[]{3, 3, 3, 3, 3, 4, 3, 4};int prefixIndex = 0;Map<String, Integer> map = new HashMap<>(); //串對(duì)應(yīng)編號(hào)Map<Integer, String> mapRev = new HashMap<>(); //編號(hào)對(duì)應(yīng)串Map<String, List<String>> mapForNext = new HashMap<>(); //數(shù)字串對(duì)應(yīng)的串Map<String, String> mapToDigit = new HashMap<>(); //串對(duì)應(yīng)的數(shù)字串List<String> allWords = new ArrayList<>();String word;int[][] g = null;int[][] f = null;public int minimumPressings(String[] t9, String word) {init(t9);this.word = word;final int n = word.length();f = new int[n + 1][prefixIndex];for (int i = 0; i <= n; ++ i) {Arrays.fill(f[i], -1);}f[0][0] = 0;for (int i = 0; i < n; ++ i) {bfs(i);}return f[n][0];}Queue<Integer> queue = new LinkedList<>();boolean[] inq = null;void bfs(int len) {if (inq == null) {inq = new boolean[prefixIndex + 1];}if (f[len][0] != -1) {queue.offer(0);}while (!queue.isEmpty()) {int st = queue.poll();inq[st] = false;for (int i = 0; i < 11; ++ i) {if (i < 9) {int nxt = g[st][i];int c = f[len][st] + 1;if (f[len][nxt] == -1 || f[len][nxt] > c) {f[len][nxt] = c;if (!inq[nxt]) {queue.offer(nxt);inq[nxt] = true;}}}else {int[] result = check(st, len, i == 10);int t = result[0];int c = result[1];if (t > 0) {if (f[len + t][0] == -1 || f[len + t][0] > f[len][st] + 1 + c) {f[len + t][0] = f[len][st] + 1 + c;}}}}}}void init(String[] all) {for (int i = 0; i < all.length; ++ i) {String[] t= all[i].split("\\W+");for (String p : t) {String x = p.trim();if (x.length() > 0) {allWords.add(x);}}}addPrefix("", "");for (int i = 0; i < allWords.size(); ++ i) {String originStr = "";String digitStr = "";String s = allWords.get(i);for (int j = 0; j < s.length(); ++ j) {digitStr += getDigit(s.charAt(j));originStr += s.charAt(j);addPrefix(originStr, digitStr);}}for (String s: mapForNext.keySet()) {Collections.sort(mapForNext.get(s));}g = new int[prefixIndex][9];for (int i = 0; i < prefixIndex; ++ i) {for (int j = 0; j < 9; ++ j) {if (j == 0) {g[i][j] = getNext(i);}else {g[i][j] = getAddDigit(i, j + 1);}}}}int[] check(int id, int preIndex, boolean isStar) {if (id == 0) {return new int[]{0,0};}String s = mapRev.get(id);String sub = word.substring(preIndex);if (isStar) {s = s.substring(0, s.length() - 1);}int comPre = 0;for (int i = 0; i < sub.length() && i < s.length(); ++ i) {if (sub.charAt(i) == s.charAt(i)) {++comPre;}else {break;}}return new int[]{comPre, s.length() - comPre};}int getNext(int id) {if (id == 0) {return 0;}String s = mapRev.get(id);String digitStr = mapToDigit.get(s);List<String> list = mapForNext.get(digitStr);int index = list.indexOf(s);String nextOriginStr = list.get((index + 1) % list.size());return map.get(nextOriginStr);}int getAddDigit(int id, int d) {String s = mapRev.get(id);String digitStr0 = mapToDigit.get(s);String digitStr1 = digitStr0 + (char)('0' + d);if (!mapForNext.containsKey(digitStr1)) {return id;}List<String> list = mapForNext.get(digitStr1);return map.get(list.get(0));}void addPrefix(String originStr, String digitStr) {if (!map.containsKey(originStr)) {map.put(originStr, prefixIndex);mapRev.put(prefixIndex, originStr);++ prefixIndex;}if (!mapForNext.containsKey(digitStr)) {mapForNext.put(digitStr, new ArrayList<>());}if (!mapForNext.get(digitStr).contains(originStr)) {mapForNext.get(digitStr).add(originStr);}mapToDigit.put(originStr, digitStr);}static char getDigit(char c) {int t = c - 'a' + 1;for (int i = 0; i < D.length; ++ i) {if (t > D[i]) {t -= D[i];}else {return (char)('2' + i);}}return 0;} }

  

code for problem3

import java.util.*;public class InfiniteLab {final static int[] dx = {0, 0, 1, -1};final static int[] dy = {1, -1, 0, 0};final static int MAX_EXTENDED = 100;int n, m;String[] map;int[][] T;int[][][][] d;public long getDistance(String[] map, long r1, int c1, long r2, int c2) {if (r1 > r2) {return getDistance(map, r2, c2, r1, c1);}if (r1 < 0 || r1 >= map.length) {long det = r2 - r1;long b = (Math.abs(r1) / map.length + 1) * map.length;r1 = (r1 + b) % map.length;return getDistance(map, r1, c1 , r1 + det, c2);}this.map = map;n = map.length;m = map[0].length();T = new int[n][2];for (int i = 0; i < n; ++ i) {T[i][0] = T[i][1] = -1;for (int j = 0; j < m; ++ j) {if (map[i].charAt(j) == 'T') {if (T[i][0] == -1) {T[i][0] = j;}else {T[i][1] = j;}}}}d = new int[m][n][m][n + 1];cal();if (r2 <= n) {int t = d[c1][(int)r1][c2][(int)r2];if (t == Integer.MAX_VALUE) {t = -1;}return t;}long[][] a = new long[m][m];long[][] b = new long[m][m];for (int i = 0; i < m; ++ i) {for (int j = 0; j < m; ++ j) {a[i][j] = -1;if (d[i][0][j][n] != Integer.MAX_VALUE) {a[i][j] = d[i][0][j][n];}if (i == j) {b[i][j] = 0;}else {b[i][j] = -1;}}}long p = r2 / n - r1 / n - 1;while (p > 0) {if ((p & 1) == 1) {b = multipy(b, a);}a = multipy(a, a);p >>= 1;}long result = -1;for (int i = 0; i < m; ++ i) {for (int j = 0; j < m; ++ j) {if (d[c1][(int)r1][i][n] != Integer.MAX_VALUE&& b[i][j] != -1&& d[j][0][c2][(int)(r2 % n)] != Integer.MAX_VALUE) {long w = d[c1][(int)r1][i][n] + b[i][j] + d[j][0][c2][(int)(r2 % n)];if (result == -1 || result > w) {result = w;}}}}return result;}long[][] multipy(long[][] A, long[][] B) {long[][] result = new long[m][m];for (int i = 0; i < m; ++ i) {for (int j = 0; j < m; ++ j) {result[i][j] = -1;for (int k = 0; k < m; ++ k) {if (A[i][k] != -1 && B[k][j] != -1) {long t = A[i][k] + B[k][j];if (result[i][j] == -1 || result[i][j] > t) {result[i][j] = t;}}}}}return result;}int trans(int x, int y) {x %= n;if (map[x].charAt(y) == 'T') {return T[x][0] + T[x][1] - y;}return -1;}boolean empty(int x, int y) {return map[x % n].charAt(y) != '#';}void cal() {final int N = (2 * MAX_EXTENDED + 1) * n;int[][] f = new int[N][m];Queue<Integer> queue = new LinkedList<>();for (int sx = 0; sx < n; ++ sx) {for (int sy = 0; sy < m ; ++ sy) {final int startX =sx + MAX_EXTENDED * n;final int startY = sy;while (!queue.isEmpty()) {queue.poll();}for (int i = 0; i < N; ++ i) {Arrays.fill(f[i], Integer.MAX_VALUE);}f[startX][startY] = 0;queue.offer(startX * 100 + startY);while (!queue.isEmpty()) {int x = queue.peek() / 100;int y = queue.poll() % 100;int nxtCost = f[x][y] + 1;for (int i = 0; i < 4; ++ i) {int xx = x + dx[i];int yy = y + dy[i];if (xx >= 0 && xx < N && yy >= 0 && yy < m && empty(xx, yy) && f[xx][yy] > nxtCost) {f[xx][yy] = nxtCost;queue.offer(xx * 100 + yy);}}if (trans(x, y) != -1) {int y1 = trans(x, y);if (f[x][y1] > nxtCost) {f[x][y1] = nxtCost;queue.offer(x * 100 + y1);}}}for (int i = 0; i <= n; ++ i) {for (int j = 0; j < m; ++ j) {d[sy][sx][j][i] = f[i + MAX_EXTENDED * n][j];}}}}}}

  

轉(zhuǎn)載于:https://www.cnblogs.com/jianglangcaijin/p/7856365.html

總結(jié)

以上是生活随笔為你收集整理的topcoder srm 490 div1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久免费免熟 | 我要色综合天天 | 黄色录像毛片 | 国产精品成人免费精品自在线观看 | 免费人成年激情视频在线观看 | 永久免费54看片 | 少妇特殊按摩高潮惨叫无码 | 自拍偷拍18p | 精品少妇theporn | 深夜影院深a | 欧美日韩在线视频 | 亚洲人 女学生 打屁股 得到 | 精品国产精品国产偷麻豆 | 女性生殖扒开酷刑vk | 亚洲精品天堂成人片av在线播放 | 日韩一区二区三区久久 | 日本精品视频在线播放 | 亚州av网站 | 国产我不卡 | 中文字幕在线观看网站 | 国产一区二区综合 | 欧美xxxx非洲 | 久久综合久色欧美综合狠狠 | 日本欧美色图 | 另类欧美尿交 | 免看黄大片aa | 免费无码毛片一区二区app | 夜夜爽网站| avwww| 日本不卡在线观看 | 久久久久区 | 免费一区二区在线观看 | 亚色在线观看 | 香蕉久久一区二区三区 | 中文字幕av高清片 | 欧美在线 | 亚洲 | 久久久精品人妻一区二区三区色秀 | 色花av| 99精品一级欧美片免费播放 | 一区二区视频免费观看 | 黄床大片 | 激情在线观看视频 | 曰本丰满熟妇xxxx性 | 96亚洲精品久久久蜜桃 | 催眠调教后宫乱淫校园 | 亚洲乱乱 | 国产精品一区二区久久久 | 熟妇高潮一区二区三区 | 亚洲视频久久久 | 欧美 亚洲 另类 激情 另类 | 中文字幕在线视频播放 | 日日夜夜草 | 97国产精品久久久 | 国产亚洲色婷婷久久 | www日本免费 | 91爱爱视频 | jizzjizz8| 国产96在线 | 亚洲 | 婷婷综合久久 | 黄色一级大片 | 久久久久久艹 | 国产一卡二卡 | 永久免费看片在线播放 | 亚洲一区二区不卡在线观看 | 亚洲乱强伦 | 91porn破解版 | 亚洲图色在线 | 欧美区国产区 | 黄色网战入口 | 黄色一级在线视频 | av免费黄色| 久久精品tv| 亚洲无限码 | 久久久午夜精品福利内容 | 一区二区三区色 | 人人妻人人澡人人爽精品日本 | 中文字幕永久免费 | 日韩精品一区二区免费视频 | 欧美91视频 | 精品一区在线 | xxsm.com| 中文字幕av网 | 一区二区免费视频 | 日本美女视频一区 | 亚洲自拍偷拍av | 男人在线视频 | 亚洲国产视频一区二区三区 | 淫久久| 国产视频精品久久 | 在线成人中文字幕 | 69xx免费视频 | 北岛玲av | 超碰在线观看99 | 欧美国产成人精品一区二区三区 | 国产成人免费av | 国产69精品久久久久久久久久 | 欧美视频色 | 久久精品日| 日韩精品一区二区三区免费视频 |