青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

oyjpArt ACM/ICPC算法程序設(shè)計(jì)空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

說(shuō)題

Posted on 2008-08-02 16:05 oyjpart 閱讀(3258) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): ACM/ICPC或其他比賽
PKU3034 Whac-a-Mole
很有意思的題目,打地鼠。
簡(jiǎn)單的記憶化搜索。trick在于你有可能移出地鼠區(qū),形成一個(gè)更優(yōu)的解。

PKU2280 Amphiphilic Carbon Molecules
首先可以證明要求的線(xiàn)一定由兩點(diǎn)確定。
基本算法:枚舉點(diǎn)+極角序+一圈掃描。
難點(diǎn)1:計(jì)較排序
難點(diǎn)2:一圈掃描時(shí)候的計(jì)數(shù)。
巧妙的轉(zhuǎn)化:枚舉一個(gè)點(diǎn)x之后將所有的黑點(diǎn)移到關(guān)于x的對(duì)稱(chēng)點(diǎn)上,這樣題目就轉(zhuǎn)化成了:
求一條線(xiàn),這條線(xiàn)上和這條線(xiàn)的一側(cè)的點(diǎn)的和最大。簡(jiǎn)單多了。
這是去年省賽A題,當(dāng)時(shí)就是用這種方法AC的。
// Solution by alpc12
#include 
<algorithm>
#include 
<math.h>
using namespace std;

#define Max(a,b)((a)>(b)?(a):(b))

struct Point{
    
int x, y;
    
bool mk;
    
    
bool operator < (const Point &a) const{
        
if (y >= 0 && a.y < 0return true;
        
else if (y < 0 && a.y >= 0return false;
        
if (y == 0 && a.y == 0){
            
if (x >= 0 && a.x < 0return true;
            
if (x < 0 && a.x >= 0return false;
            
return abs(x) < abs(a.x); 
        }
        
int t = x * a.y - y * a.x;
        
return  t == 0 ? x*+ y*< a.x*a.x + a.y*a.y : t > 0;
    };

} p[
1010], pp[1010];

int n;
int nn;
int ans;

int det(Point &a, Point &b){
    
return a.x * b.y - a.y * b.x;
}

int dot(Point &a, Point &b){
    
return a.x * b.x + a.y * b.y;
}

void solve(int x){
    
//printf("Center %d (%d, %d)\n", x, p[x].x, p[x].y);
    nn = 0;
    
int i;
    
for (i = 0; i < n; i++if (i != x){
        pp[nn].x 
= p[i].x - p[x].x;
        pp[nn].y 
= p[i].y - p[x].y;
        pp[nn].mk 
= p[i].mk;
        
if(pp[nn].mk) pp[nn].x = -pp[nn].x, pp[nn].y = -pp[nn].y;
        nn
++;
    }
    sort(pp, pp 
+ nn);
    
int a = 0, b = 0, cnt = 0;
    
for(i = 0; i < nn; ++i) {
        
if(det(pp[a], pp[i]) >= 0) {
            b 
= i;
            cnt
++;
        } 
    }
    ans 
= Max(ans, cnt);
    
while(1) {
        
int aa = a;
        
for(; det(pp[aa], pp[a]) == 0 && dot(pp[aa], pp[a]) >= 0 && aa < nn; ++aa) {
            cnt
--;
        }
        
if(aa == nn) break;
        a 
= aa;
        
int bb = (b+1)%nn;
        
for(; det(pp[aa], pp[bb]) >= 0; bb = (bb+1)%nn) {
            cnt
++;
            b 
= bb;
        }
        ans 
= Max(ans,cnt);
    }
}

int main(){

    
//freopen("t.in", "r", stdin);

    
while (scanf("%d"&n), n){
        
int t, i;
        
for (i = 0; i < n; i++){
            scanf(
"%d%d%d"&p[i].x, &p[i].y, &t);
            p[i].mk 
= (t == 1);
        }
        
if (n == 1) {printf("1\n"); continue;}
        ans 
= 0;
        
for (i = 0; i < n; i++)
            solve(i);
        printf(
"%d\n", ans + 1);
    }
    
return 0;   
}

PKU2949 Word Rings
經(jīng)典題。
首先將輸入的單詞看成一條邊。它連接的左右各2字符形成的點(diǎn)。
那么新的圖點(diǎn)為26*26個(gè)。
然后二分枚舉答案ans,將原來(lái)的圖的權(quán)w轉(zhuǎn)化為ans-w,
用Bellman Ford判負(fù)權(quán)回路。如果有負(fù)權(quán)回路,說(shuō)明
sigma(ans) + sigma(w) < 0
即 ans * cycle_length < sigma(w)
sigma(w)是原本的單詞長(zhǎng)度和,而ans * cycle_length則是枚舉答案之后那個(gè)環(huán)的單詞長(zhǎng)度和
所以 ans 可以繼續(xù)增大。 這樣就構(gòu)成了二分。
// Solution by alpc12
#include <stdio.h>
#include 
<string.h>

#define Max(a,b) ((a)>(b)?(a):(b))

const int M = 200020;
const int N = 26*26;

struct Edge
{
    
int x, y;
    
double w;
    Edge() {}
    Edge(
int xx, int yy, double ww) : x(xx), y(yy), w(ww) {
    }
};

int n, m, nv;
Edge e[M];
double dist[N];

bool bellman_ford(double ans) {
    
int i,j;
    
for(i = 0; i < nv; ++i) {
        
bool change = false;
        
for(j = 0; j < m; ++j) {
            
int &x= e[j].x, &= e[j].y;
            
double w = e[j].w;
            
if(dist[y] > dist[x] + ans - w) {
                change 
= true;
                dist[y] 
= dist[x] + ans - w;
            }
        }
        
if(!change) return true;
    }
    
return false;
}

int calc(char a, char b) {
    
return (a-'a'* 26 + b-'a';
}

int main()
{
    freopen(
"t.in""r", stdin);

    
char line[1010];
    
int i, max;
    
bool chk[N];
    
while(scanf("%d\n"&n), n) {
        memset(chk, 
0sizeof(chk));
        m 
= nv = 0;
        
for(i = 0; i < n; ++i) {
            gets(line);
            
int len;
            
if((len=strlen(line)) <= 2while(1) printf("1");
            max 
= Max(max, len);
            
int a = calc(line[0], line[1]), b = calc(line[len-2], line[len-1]);
            
if(!chk[a]) chk[a] = 1, nv++
            
if(!chk[b]) chk[b] = 1, nv++;
            e[m
++= Edge(a,b,(double)len);
        }


        
double lo = 0, hi = max;
        
while(hi > lo + 0.005) {
            
double mid = lo+(hi-lo)/2;
            
if(!bellman_ford(mid)) {
                lo 
= mid;
            } 
else hi = mid;
        }
        
if(lo < 1e-7) printf("No solution.\n");
        
else printf("%.2lf\n", lo);
    }

    
return 0;
}


PKU2793 Cactus
這個(gè)題目的要求:
1.求一個(gè)圖所有的環(huán)的長(zhǎng)度
2.判斷一個(gè)圖中任意兩個(gè)環(huán)是否共邊
3.判斷一個(gè)圖是否連通

一個(gè)圖的環(huán)的求法(DFS):
若現(xiàn)在在dfs 節(jié)點(diǎn)x,其子節(jié)點(diǎn)y是一個(gè)灰色節(jié)點(diǎn)(已經(jīng)遍歷到,但子樹(shù)沒(méi)有遍歷完的節(jié)點(diǎn)),那么就存在一個(gè)x->y->...->x的環(huán)。從x向上找一直到y(tǒng)就是環(huán)了。
// solution by alpc12 
// 注意這個(gè)代碼在pku上會(huì)runtime error,棧溢出。
// 因?yàn)閖ava的棧空間很小。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
int n;

    final 
int N = 20010;
    
    
private class Edge {
        
int x, y;
        
public boolean inCycle;
        
int other(int z) {
            
return x == z ? y : x;
        }
        
public Edge(int x, int y) {
            super();
            
this.x = x;
            
this.y = y;
            inCycle 
= false;
        }
    }

    ArrayList
<Edge>[] head = new ArrayList[N];
    
    Edge[] fa 
= new Edge[N]; 

    
int[] chk = new int[N];

    ArrayList
<Integer> Clen = new ArrayList<Integer>();
    
    BigInteger Ans 
= BigInteger.ONE;

    boolean hasSol;
    
    PrintStream 
out

    
void run() throws FileNotFoundException {
        
//Scanner cin = new Scanner(System.in);
        Scanner cin = new Scanner(new BufferedReader(new FileReader("43")));
        
out = System.out;
        
int m;
        n 
= cin.nextInt();
        
for (int i = 0; i < n; ++i) {
            head[i] 
= new ArrayList<Edge>();
        }
        m 
= cin.nextInt();
        
while (m-- != 0) {
            
int c = cin.nextInt();
            ArrayList
<Integer> ar = new ArrayList<Integer>();
            
for (int i = 0; i < c; ++i) {
                
int x = cin.nextInt();
                ar.add(x);
            }
            
for (int i = 0; i < ar.size() - 1++i) {
                
int x = ar.get(i) - 1, y = ar.get(i + 1- 1;
                head[x].add(
new Edge(x, y));
                head[y].add(
new Edge(y, x));
            }
        }

        Arrays.fill(chk, 
0);
        hasSol 
= true;
        dfs(
0new Edge(00));
        
int i;
        
for(i = 0; i < n; ++i) {
            
if(chk[i] == 0break;
        }
        
if (i < n || !hasSol) {
            
out.println("0");
            
return;
        }
        
out.println(Ans);
    }

    
private void dfs(int x, Edge e) {
        fa[x] 
= e;
        
        
int i;
        chk[x] 
= 1;
        
for(i = 0; i < head[x].size(); ++i) {
            
int y = head[x].get(i).y;
            
if(chk[y] == 0) {
                dfs(y, head[x].
get(i));
            } 
else if(chk[y] == 1 && y != e.other(x)){ // y is a ance of x
                hasSol &= !head[x].get(i).inCycle;
                head[x].
get(i).inCycle = true;
                
int c = 2;
                
for(int j = x; j != y; j = fa[j].other(j)) {
                    hasSol 
&= !fa[j].inCycle;
                    fa[j].inCycle 
= true;
                    c
++;
                }
                Ans 
= Ans.multiply(new BigInteger("" + c));
            }
        }
        chk[x] 
= 2;
    }

    
private boolean conn() {
        
int i;
        Arrays.fill(chk, 
0);
        dfs0(
0);
        
for (i = 0; i < n && chk[i] == 1++i);
        
return i == n;
    }

    
private void dfs0(int x) {
        
int i;
        chk[x] 
= 1;
        
for (i = 0; i < head[x].size(); ++i) {
            
if (chk[head[x].get(i).y] == 0) {
                dfs0(head[x].
get(i).y);
            }
        }
    }

    
public static void main(String[] args) throws FileNotFoundException {
        
new Main().run();
    }

}

PKU2117 Electricity
求一個(gè)圖(可能非聯(lián)通)去掉一個(gè)點(diǎn)之后最多的連通塊數(shù)。
做法:dfs求割。
在dfs中一個(gè)點(diǎn)x,有子節(jié)點(diǎn)y1,y2...yN.
比如y1的這棵子樹(shù)沒(méi)有一個(gè)點(diǎn)能夠有邊連到比x更淺層的點(diǎn),那么y1這棵子樹(shù)在去掉x點(diǎn)之后會(huì)是一個(gè)獨(dú)立的聯(lián)通塊。同樣的對(duì)于y2...yN.
要注意的地方:
1.單點(diǎn)。去掉個(gè)單點(diǎn)這個(gè)單點(diǎn)聯(lián)通塊就不存在了,聯(lián)通塊數(shù)量會(huì)減少
2.dfs求割的時(shí)候有根和非根兩種情況,兩種情況分成的聯(lián)通塊是不同的。           

Feedback

# re: 說(shuō)題  回復(fù)  更多評(píng)論   

2008-08-11 22:20 by Leon916
又來(lái)你的blog看答案了!

我發(fā)現(xiàn)在里面的題不好做,就是想不出來(lái)改怎么做!
請(qǐng)教一下你平時(shí)怎么練習(xí)的?

# re: 說(shuō)題  回復(fù)  更多評(píng)論   

2008-08-12 10:09 by oyjpart
現(xiàn)在暑假都是做比賽,這些題目都是比賽的題目。
比賽可以在TJU(http://acm.tju.edu.cn)上自己帖,很方便的。

# re: 說(shuō)題  回復(fù)  更多評(píng)論   

2008-10-16 20:18 by lxc0601
大牛,能講解下 PKU2117 Electricity ?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲一区二| 欧美日韩国产在线播放网站| 欧美电影免费观看高清完整版| 国内精品美女在线观看| 久久久久久有精品国产| 午夜精品福利视频| 精品动漫一区| 亚洲精品一区在线| 国产精品一区二区三区乱码| 另类专区欧美制服同性| 欧美在线资源| 午夜电影亚洲| 久久影视三级福利片| 99精品久久久| 亚洲欧美日韩系列| 91久久香蕉国产日韩欧美9色| 日韩视频永久免费| 一区二区三区无毛| 久久久精品网| 亚洲专区免费| 欧美日本中文字幕| 男女精品视频| 亚洲精品久久久一区二区三区| 欧美国产日韩精品| 久久免费精品视频| 国产一级久久| 亚洲欧美日韩爽爽影院| 一区二区三区 在线观看视频| 麻豆久久婷婷| 理论片一区二区在线| 国产精品色婷婷久久58| 999亚洲国产精| 中文欧美字幕免费| 欧美日本国产在线| 亚洲国产精品福利| 亚洲欧洲一区二区在线观看| 久久中文字幕一区| 亚洲黄色一区二区三区| 亚洲第一综合天堂另类专| 久久大香伊蕉在人线观看热2| 欧美一区二区在线看| 国产在线播精品第三| 免费观看成人鲁鲁鲁鲁鲁视频| 榴莲视频成人在线观看| 在线观看亚洲专区| 欧美成人免费播放| 亚洲午夜小视频| 欧美成人国产一区二区| 亚洲精品1区2区| 欧美日韩国产综合视频在线观看中文 | 久久久久.com| 亚洲国产另类 国产精品国产免费| 免费久久99精品国产自| 艳妇臀荡乳欲伦亚洲一区| 国产精品一卡| 欧美**字幕| 欧美在线免费观看视频| 亚洲精品免费看| 久久人体大胆视频| 亚洲综合视频1区| 亚洲国产综合在线看不卡| 国产精品久久久久秋霞鲁丝| 欧美高清hd18日本| 久久精品视频免费播放| 一区二区冒白浆视频| 免费短视频成人日韩| 欧美综合国产精品久久丁香| 一本色道婷婷久久欧美| 最新日韩欧美| 亚洲激情在线观看| 在线欧美日韩精品| 亚洲经典在线| 亚洲欧洲精品一区二区| 亚洲国产综合视频在线观看| 亚洲国产欧美精品| 亚洲欧洲日韩综合二区| 亚洲精品韩国| 日韩一区二区精品| 亚洲五月六月| 欧美在线亚洲| 免费成人av在线| 亚洲乱码国产乱码精品精| 亚洲中午字幕| 久久精品国产一区二区三| 久久久久久尹人网香蕉| 免费成人黄色| 国产精品成人观看视频免费 | 国产精品一区二区你懂得 | 亚洲小视频在线| 欧美一区二区三区电影在线观看| 久久黄色影院| 中文日韩电影网站| 欧美一级大片在线免费观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产电影| 免费久久99精品国产| 99精品国产在热久久| 亚洲自拍16p| 日韩一级大片| 久久久久99| 欧美黄色aaaa| 性伦欧美刺激片在线观看| 免费91麻豆精品国产自产在线观看| 欧美日本韩国一区| 一区二区三区在线高清| 亚洲欧美中文另类| 亚洲级视频在线观看免费1级| 亚洲在线一区二区| 欧美日韩午夜| 99精品视频免费| 亚洲破处大片| 欧美精品亚洲二区| 亚洲精品五月天| 亚洲伦理网站| 欧美日韩另类视频| 一区二区日韩精品| 日韩视频国产视频| 欧美日韩国内| 欧美一区二区三区四区夜夜大片| 亚洲精品一区二区三区99| 欧美伦理a级免费电影| 一区二区激情视频| av成人手机在线| 国产精品视频网站| 久久婷婷蜜乳一本欲蜜臀| 久久久久一区二区三区| 亚洲精品美女免费| 国产精品99久久久久久有的能看| 欧美午夜宅男影院| 久久久国产成人精品| 欧美国产精品专区| 亚洲天堂偷拍| 久久精品九九| 亚洲图片欧美一区| 亚洲欧美在线x视频| 久久久www成人免费毛片麻豆| 狂野欧美激情性xxxx| 久久国内精品自在自线400部| 亚洲国产成人久久综合| 在线视频亚洲| 亚洲激情第一页| 欧美影院成年免费版| 中文在线不卡视频| 欧美成人精品不卡视频在线观看| 欧美一区激情| 国产精品久久福利| 亚洲黑丝一区二区| 在线免费观看日韩欧美| 亚洲在线1234| 午夜精品视频| 国产精品成人观看视频免费| 亚洲精品一区二区三区99| 亚洲国产综合91精品麻豆| 久久久久久夜| 亚洲国产日韩欧美在线99| 欧美风情在线| 欧美一区二区三区在线| 欧美成人嫩草网站| 在线国产日韩| 久久se精品一区二区| 亚洲一区二区三区777| 免费在线欧美黄色| 国产日韩精品一区二区三区在线| 亚洲国产成人91精品| 亚洲精品中文字幕女同| 欧美激情四色| 国产一区二区三区在线播放免费观看| 亚洲精品国产精品乱码不99| 国产精品sm| 亚洲人成高清| 亚洲欧美变态国产另类| 国产精品羞羞答答xxdd| 亚洲影音一区| 免费欧美在线| 亚洲永久在线| 激情成人av在线| 欧美日韩国产精品一区二区亚洲| 一本一道久久综合狠狠老精东影业| 一区二区三区黄色| 国产日产欧产精品推荐色| 久久精选视频| 亚洲人在线视频| 久久青草福利网站| 亚洲免费观看在线观看| 麻豆91精品| 韩日成人av| 午夜免费电影一区在线观看| 久久最新视频| 亚洲欧美影院| 一区二区免费看| 在线播放日韩专区| 国产精品日日做人人爱| 欧美激情综合色综合啪啪| 久久国产夜色精品鲁鲁99| 一区二区久久| 亚洲精品一区二区三区婷婷月| 美女黄毛**国产精品啪啪| 久久精品视频va| 久久久久久九九九九| 欧美一区二区视频观看视频|