CSU 1813: 蓋房子 1815: Enterprising Escape 1817: Bones’s Battery 1818: Crusher’s Code
#include<set>
#include<map>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define per(i,j,k) for (int i = j; i >= k; i--)
#define loop(i,j,k) for (int i = j;i != -1; i = k[i])
#define lson x << 1, l, mid
#define rson x << 1 | 1, mid + 1, r
#define ff first
#define ss second
#define mp(i,j) make_pair(i,j)
#define pb push_back
#define pii pair<int,int>
#define in(x) scanf("%d", &x);
using namespace std;
typedef long long LL;
const int low(int x) { return x&-x; }
const double eps = 1e-9;
const int INF = 0x7FFFFFFF;
const int mod = 1e9 + 7;
const int N = 1e3 + 10;
char s[N];
int n, m;
int c[N][N], a[N][N];
LL ls[N][N], lx[N][N], rs[N][N], rx[N][N];
void GetFour()
{
memset(c, 0, sizeof(c));
rep(i, 1, n)
{
rep(j, 1, m)
{
if (a[i][j] || c[i][j]) continue;
while (c[i][j] <= n - i && !a[i + c[i][j]][j]) c[i][j]++;
rep(k, 2, c[i][j]) c[i + k - 1][j] = c[i][j] - k + 1;
}
int sum = 0; stack<pii> p;
per(j, m, 1)
{
pii now = mp(c[i][j], 1);
while (!p.empty() && p.top().ff > now.ff)
{
pii q = p.top(); sum -= q.ff * q.ss;
now.ss += q.ss; p.pop();
}
sum += now.ff * now.ss;
p.push(now);
ls[i][j] = sum;
}
sum = 0; while (!p.empty()) p.pop();
rep(j, 1, m)
{
pii now = mp(c[i][j], 1);
while (!p.empty() && p.top().ff > now.ff)
{
pii q = p.top(); sum -= q.ff * q.ss;
now.ss += q.ss; p.pop();
}
sum += now.ff * now.ss;
p.push(now);
rs[i][j] = sum;
}
}
memset(c, 0, sizeof(c));
per(i, n, 1)
{
rep(j, 1, m)
{
if (a[i][j] || c[i][j]) continue;
while (c[i][j] < i && !a[i - c[i][j]][j]) c[i][j]++;
rep(k, 2, c[i][j]) c[i - k + 1][j] = c[i][j] - k + 1;
}
int sum = 0; stack<pii> p;
per(j, m, 1)
{
pii now = mp(c[i][j], 1);
while (!p.empty() && p.top().ff > now.ff)
{
pii q = p.top(); sum -= q.ff * q.ss;
now.ss += q.ss; p.pop();
}
sum += now.ff * now.ss;
p.push(now);
lx[i][j] = sum;
}
sum = 0; while (!p.empty()) p.pop();
rep(j, 1, m)
{
pii now = mp(c[i][j], 1);
while (!p.empty() && p.top().ff > now.ff)
{
pii q = p.top(); sum -= q.ff * q.ss;
now.ss += q.ss; p.pop();
}
sum += now.ff * now.ss;
p.push(now);
rx[i][j] = sum;
}
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
rep(i, 0, n + 1) rep(j, 0, m + 1) ls[i][j] = rs[i][j] = 0;
rep(i, 1, n)
{
scanf("%s", s + 1);
rep(j, 1, m) a[i][j] = s[j] - '0';
}
GetFour();
LL L = 0, R = 0, ans = 0;
rep(i, 1, n)
{
rep(j, 1, m) (R += ls[i][j]) %= mod;
(ans += L * R) %= mod; R = 0;
rep(j, 1, m) (L += rx[i][j]) %= mod;
}
L = R = 0;
rep(j, 1, m)
{
rep(i, 1, n) (R += ls[i][j]) %= mod;
(ans += L * R) %= mod; R = 0;
rep(i, 1, n) (L += rx[i][j]) %= mod;
}
rep(i, 1, n)
{
rep(j, 1, m)
{
rx[i][j] += rx[i - 1][j] + rx[i][j - 1] - rx[i - 1][j - 1];
(ans -= rx[i][j] * ls[i + 1][j + 1]) %= mod;
}
per(j, m, 1)
{
lx[i][j] += lx[i - 1][j] + lx[i][j + 1] - lx[i - 1][j + 1];
(ans -= lx[i][j] * rs[i + 1][j - 1]) %= mod;
}
}
printf("%lld\n", (ans + mod) % mod);
}
return 0;
}
#include <iostream>
#include <cstring>
#include <stack>
#include <cstdio>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
const double eps=1e-8;
const double PI=acos(-1.0);
using namespace std;
struct st{
int x;
int y;
int step;
friend bool operator <(st a,st b){
return a.step>b.step;}
}node;
char a[1005][1005];
int v[1005][1005];
int d[][2]={{1,0},{0,1},{0,-1},{-1,0}};
int k,n,m,num;
map<char,int> s;
int bfs(int x,int y)
{
priority_queue<st>q;
node.x=x;
node.y=y;
node.step=0;
q.push(node);
v[x][y]=1;
while(!q.empty())
{
st tem=q.top();
//cout<<tem.x<<" "<<tem.y<<endl;
q.pop();
st tp;
if(tem.x>=m-1||tem.y>=n-1||tem.x<=0||tem.y<=0)
{
return tem.step;//cout<<"t:"<<e<<endl;
}
for(int i=0; i<4; i++)
{
tp.x=tem.x+d[i][0];
tp.y=tem.y+d[i][1];
if(v[tp.x][tp.y]) continue;
tp.step=tem.step+s[a[tp.x][tp.y]];
q.push(tp);
v[tp.x][tp.y]=1;
//cout<<tp<<endl;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(v,0,sizeof(v));
char c;
scanf("%d%d%d",&k,&n,&m);
getchar();
for(int i=0;i<k;i++){
scanf("%c %d",&c,&num);
getchar();
s[c]=num;
}
int x,y;
for(int i=0;i<m;i++)
scanf("%s",a[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(a[i][j]=='E'){
x=i;y=j;
}
printf("%d\n",bfs(x,y));
}
return 0;
}
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const double pi=acos(-1.0);
const int inf = 0x3f3f3f3f;
const int maxn=100005;
const double eps=1e-8;
const long long INF=10000000000;
int n,k,m;
long long dis[105][105], red[105][105];
void init(long long dis[][105]){//初始化陣列
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i==j)dis[i][j]=0;
else dis[i][j]=INF;
}
}
}
void floyd(long long dis[][105]){//folyd 求各源點間的最短距離
for(int t=0;t<n;t++){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
dis[i][j]=min(dis[i][j],dis[i][t]+dis[t][j]);
}
}
}
}
int main()
{
int t;
scanf ("%d",&t);
while (t--){
scanf ("%d%d%d",&n,&k,&m);
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i==j)dis[i][j]=0;
else dis[i][j]=INF;
}
}
int u,v,val;
for (int i=0;i<m;i++){
scanf ("%d%d%d",&u,&v,&val);
dis[u][v]=dis[v][u]=val;
}
floyd(dis);
long long lo=1,hi=INF;
long long mid;
long long ans=INF;
while (lo<=hi){//二分答案
mid=(lo+hi)/2;
init(red);
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
red[i][j]= dis[i][j]<=mid?1:INF;//如果小於mid說明i->j只需要充一次電
}
}
floyd(red);//跑floyd
long long d=0;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (red[i][j]>d)d=red[i][j];//求出充電次數最多的一條路徑
}
}
if (d<=k){//如果次數小於k說明此時的距離符合
ans=mid;//儲存
hi=mid-1;
}
else lo=mid+1;
}
printf ("%lld\n",ans);//輸出
}
return 0;
}
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
int n;
int A[10];
void init(){
int B[10], v[105], sz = 0;
memcpy(B, A, sizeof(A));
memset(v, -1, sizeof(v));
sort(B, B + n);
for (int i = 0; i<n; i++)
if (v[B[i]] == -1) v[B[i]] = sz++;
for (int i = 0; i<n; i++) {
A[i] = v[A[i]];
}
}
int get_sta(int A[]){
int ret = 0;
for (int i = 0; i<n; i++) ret = ret * 8 + A[i];
return ret;
}
void get_arr(int S, int A[]){
for (int i = n - 1; i >= 0; i--){
A[i] = S % 8;
S /= 8;
}
}
const int MX = 1e5 + 5;
map<int, int>vis;
int sz, S[MX];
void bfs(int s){
vis.clear();
queue<int>q;
q.push(s);
vis[s] = 1;
while (!q.empty()){
int u = q.front(); q.pop();
get_arr(u, A);
for (int i = 0; i<n; i++)
for (int j = i + 1; j<n; j++)
if (A[i]>A[j]){
swap(A[i], A[j]);
int SS = get_sta(A);
if (vis[SS] == 0){
q.push(SS);
vis[SS] = 1;
}
swap(A[i], A[j]);
}
}
sz = 0;
for (map<int, int>::iterator it = vis.begin(); it != vis.end(); it++) {
S[sz] = it->first;
it->second = sz++;
}
}
double dp[MX];
//遞推寫法
double DP1(){
memset(dp, 0, sizeof(dp));
for (int k = 0; k<sz; k++){
int success = 0;
int sta = S[k];
get_arr(sta, A);
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++){
int l = min(i, j), r = max(i, j);
if (A[l]>A[r]){
swap(A[l], A[r]);
int SS = get_sta(A);
success++;
dp[k] += dp[vis[SS]] / (n*n);
swap(A[l], A[r]);
}
}
if (success>0) dp[k] = (dp[k] + 1)*n*n / success;
}
return dp[sz - 1];
}
double DP2(){
memset(dp, 0, sizeof(dp));
for (int k = 0; k<sz; k++){
int success = 0;
int sta = S[k];
get_arr(sta, A);
for (int l = 0; l<n - 1; l++){
int r = l + 1;
if (A[l]>A[r]){
swap(A[l], A[r]);
int SS = get_sta(A);
success++;
dp[k] += dp[vis[SS]] / (n - 1);
swap(A[l], A[r]);
}
}
if (success>0) dp[k] = (dp[k] + 1)*(n - 1) / success;
}
return dp[sz - 1];
}
//記憶化搜尋寫法
double DP1(int u){
if (u == 0) return dp[u] = 0;
if (dp[u] >= 0) return dp[u];
int sta = S[u];
get_arr(sta, A);
int success = 0;
dp[u] = 0;
for (int i = 0; i<n; i++){
for (int j = 0; j<n; j++){
int l = min(i, j), r = max(i, j);
if (A[l]>A[r]){
swap(A[l], A[r]);
int SS = get_sta(A);
success++;
dp[u] += DP1(vis[SS]) / (n*n);
swap(A[l], A[r]);
}
}
}
if (success>0) dp[u] = (dp[u] + 1)*n*n / success;
return dp[u];
}
double DP2(int u){
if (u == 0) return dp[u] = 0;
if (dp[u] >= 0) return dp[u];
int sta = S[u];
get_arr(sta, A);
int success = 0;
dp[u] = 0;
for (int i = 0; i<n - 1; i++){
int l = i, r = i + 1;
if (A[l]>A[r]){
swap(A[l], A[r]);
int SS = get_sta(A);
success++;
dp[u] += DP2(vis[SS]) / (n - 1);
swap(A[l], A[r]);
}
}
if (success>0) dp[u] = (dp[u] + 1)*(n - 1) / success;
return dp[u];
}
int main(){
int T;
scanf("%d", &T);
while (T--){
scanf("%d", &n);
for (int i = 0; i<n; i++) scanf("%d", &A[i]);
init();
int init_sta = get_sta(A);
bfs(init_sta);
for (int i = 0; i<sz; i++) dp[i] = 0;
double ans1 = DP1();
for (int i = 0; i<sz; i++) dp[i] = 0;
double ans2 = DP2();
printf("Monty %.6f Carlos %.6f\n", ans1, ans2);
}
return 0;
}
相關推薦
CSU 1813: 蓋房子 1815: Enterprising Escape 1817: Bones’s Battery 1818: Crusher’s Code
#include<set> #include<map> #include<ctime> #include<cmath> #include<stack> #include<queue> #include&l
ECNU 2018 10月月賽 E 蓋房子 (bitset + 倍增)
get bits continue fir ble 麻煩 mes pri http 題目鏈接 ECNU Monthly 2018.10 Problem E 從開場寫到結束…… 顯然要把三角形分成上下兩部分。 把每一部分分成三部分,以上部分
蓋房子1057
描述 永恆の靈魂最近得到了面積為n*m的一大塊土地(高興ING^_^),他想在這塊土地上建造一所房子,這個房子必須是正方形的。 但是,這塊土地並非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。這些瑕疵十分噁心,以至於根本不能在上面蓋一磚一瓦。 他希望找到一塊最大的正
【題解】蓋房子
efi code 最大 輸出格式 頂點 ostream 十分 如果 space 題目描述 Farmer John最近得到了面積為m×n的一大塊土地,他想在這塊土地上建造一所房子,這個房子必須是正方形的。但是,這塊土地並非十全十美,上面有很多不
CSU 1908: The Big Escape 1909: Perfect Chocolate 1911: Card Game 1912: One Boring Problem
#include <iostream> #include<queue> #include<vector> #include<algorithm> #inc
CSU-1908 The Big Escape
mem oda ems 多個 inpu 通過 test case 給定 amp CSU-1908 The Big Escape Description There is a tree-like prison. Expect the root node, each node
復選框式查詢 例題租房子
bmi 全選 this [0 tel lod cell .org nal <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/
CSU - 1556 Jerry's trouble(高速冪取模)
click ostream algo printf 高速 ron main 取模 bit 【題目鏈接】:click here 【題目大意】:計算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 &
簡明區分escape、encodeURI和encodeURIComponent
aso 字符串 () 問題 最好 %x 空格 con %u 一、前言 講這3個方法區別的文章太多了,但是大部分寫的都很繞。本文試圖從實踐角度去講這3個方法。 二、escape和它們不是同一類 簡單來說,escape是對字符串(string)進行編碼(而另外兩種是對URL
HDU1813:Escape from Tetris(IDA)
memset onos 。。 字符 每一個 題目 push pri [1] Problem Description 因為整日整夜地對著這個棋盤,Lele最終走火入魔。每天一睡覺。他就會夢到自己會被人被扔進一個棋盤中,一直找不到出路,然後從夢中驚醒。久而久之,Lele被搞
【搜索】 HDU 3533 Escape BFS 預處理
cap 擁有 ace deque i++ const tdi code -m 要從0,0 點 跑到m,n點 路上會有k個堡壘發射子彈。有子彈的地方不能走,子彈打到別的堡壘就會消失,或者一直飛出邊界(人不能經過堡壘 能夠上下左右或者站著不動 每步都須要消耗能量 一共同
(樹形dp+LCA倍增法)CSU 1915 - John and his farm
const http 題解 def iostream clu algo farm john 題意: 有一個棵樹,現在讓你找兩個點連接起來,這樣必然成為一個環,現在要求這些環長度的期望,也就是平均值。 分析: 第一次做LCA題,做多校的時候,瞎幾把找了模板敲,敲了個八九
csu-acm 1503: 點到圓弧的距離
tdi per 註釋 -s 最短距離 txt href amp code 1503: 點到圓弧的距離 分析: 先判斷點和圓心的連線是否在圓弧範圍內,如果在,最短距離即到圓心的距離減去半徑的絕對值;反之,為到端點的最短距離。 具體看註釋 #include <
亞馬遜CEO貝佐斯財富或超比爾蓋茨
比爾蓋茨 福布斯 亞馬遜公司 財富 凈資產 TechWeb報道根據福布斯的消息,亞馬遜公司估價不斷創下歷史新高,這也使得亞馬遜公司CEO貝佐斯的凈資產不斷提升。截至周五股市收盤,貝佐斯凈資產增長28億美元至847億美元,創下歷史新高。同時他也成為了財富增長最快的億萬富翁,距離比爾蓋茨的差距
(線段樹區間賦值)CSU 1942 - Sort String
== print 字母 can right += 小寫 csu 一模一樣 題意: 一個串(串中只有26個小寫字母),選一個區間進行排序,進行100000次,輸出最後的串。 分析: 比賽的時候很懵逼,感覺這題跟之前的額大崩龍有點像,但是沒多想,也怪自己太菜了。
蓋強STOLL M1 v3.7.014 for WinXP 1CD+Grapyuoft Crchicbd 2017
STOLL M1 v3.7.014 for WinXP 1CD Grapyuoft Crchicbd 2017 nPower.PowerSurfacing.Re v2.4-4.1 for SolidWorks 2012-2017 Win64 6CD SolidWorks插件 Powe
HDU 5389 Zero Escape (MUT#8 dp優化)
etc memset rgb color 兩個 || 答案 一位數 ack 【題目鏈接】:pid=5389">click here~~ 【題目大意】: 題意: 給出n個人的id,有兩個門,每一個門有一個標號,我們記作a和b,如今我們要將n個人分成兩組,進入
Escape加解密Java版
java[java] view plain copy /** * 中文加密 * Created by geo on 2017/7/4. */ public class EscapeUtils { /** * Escape編碼 * @p
hdu 3605 Escape 二分圖的多重匹配(匈牙利算法)
aid gree to do als 技術 contain pop 解決 limit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS
張天愛蓋報紙睡機場 為新片連續工作3天無休
小時 細心 class 系列 -m 英雄 素質 騰訊 article 《父子雄兵》張天愛大鵬劇照 張天愛航班延誤滯留睡機場 騰訊娛樂訊 7月16日淩晨,剛剛結束《父子雄兵》路演的張天愛由於天氣原因滯留成都機場一夜,一夜未休息的狀態下,她仍然按原定計劃工作