2016年4月15日 星期五

[TIOJ 1899][IOI 2014] Holiday

原題連結
這道題我一開始以為可以用枚舉和dp去寫,但是複雜度怎麼壓都壓不下來......最後是聽了大神同學的提示才發現我枚舉錯東西了.....枚舉天數去做合併大概是沒救的......

[TIOJ 1897][IOI 2014] Gondola

原題連結
Day2當中最簡單,也是我唯一有想到的一題orz

2016年4月12日 星期二

[TIOJ 1895][IOI 2014] Wall

原題連結
題目本身並不複雜,這邊簡單的說一下。

[TIOJ 1896][IOI 2014] Game

原題連結

這道題目的思維還是有點難度的,但是code寫起來非常精簡,官方提供的構造解法甚至hasEdge裡只須要寫1行......有興趣的可以到IOI2014網站去膜拜一下。

2016年3月14日 星期一

[Codechef IOPC16Q][Math] Bat In Cage

原題連結
這道題....個人覺得比較傳統的數學分析。

[BZOJ 3295][操作分治] 動態逆序對

原題連結
這道題搞了我兩天左右....對於像我一樣沒有對操作分治感受深刻的人的確是比較難做的......
操作分治簡單的例子可以看這裡
code有參考過中國的大神,所以看到很像的code不要驚訝(?

2016年3月13日 星期日

[ZJ b417][莫隊] 區間眾數

原題連結
莫隊算法(Mo's algorithm)這幾年非常的紅啊~~
有很多需要複雜資料結構(LCT , 樹鏈剖分 , 持久化資料結構....) 的題目都可以用莫隊搭配樹壓平之類的技巧作到帶根號的複雜度。

2016年3月11日 星期五

[Wunder Fund Round 2016 pD][DP] Hamiltonian Spanning Tree

link
You can view official tutorial here.
Here I will explain some points I consider important when trying to solve the problem.
There may be some mistakes in grammar due to my poor English QAQ.
Any correction of algorithm or grammar is welcomed.

It's not hard to find that x>y and x<y are two different problem: One is to use more tree edges as possible while the other is to use less tree edges.

2016年3月10日 星期四

[TIOJ 1725][Z algorithm] Massacre at Camp Happy

原題連結
先了解一個問題:給定字串A,B,長度皆為n,要如何線性判定A和B是否只差1個字元呢?

[HDU 4605][Segment Tree] Magic Ball Game

原題連結
嗚姆....這題讓我頗開心的獲得了1A XD

[POI 21st Stage 1][Persistent Segment Tree] Couriers

原題連結
有做過第k小的同學大概對於持久化權值線段樹稍微有點感受

[TIOJ 1735] k-口吃子字串

原題連結
嗚姆....這題還算基本的趣題,我想到兩個作法。

[POI XIII Stage 1][KMP] Periods of Words

原題連結
字串的一題基礎題

2016年3月6日 星期日

[III (XIV) Volga Region Open Team Student Programming Contest pB][Treap][sqrt method] Time to read

原題連結
個人很喜歡這一題
大致上,這道題的難點在於如何「快速得知某頁的顏色」還有維護「塗色」操作。

[ONTAK 2010 Day1][Treap][Disjoint Set][Heuristic Merge] Peaks

原題連結
這道題的思路其實不難,只是同時考驗對於資料結構的信心和穩定度,寫起來code量略大,還是比較麻煩的。

[Coder-Strike 2014 - Finals (online edition, Div. 1) pD][Treap] Cup Trick

原題連結
可以想像一下,要能夠快速維護他給出的所有操作我們應該要能實做哪些事情呢?

[POJ 2104][Persistent Segment Tree] K-th Number

原題連結
本題作為經典的資料結構題,解法有非常多種。
就我能力上可作的就有持久化線段樹,線段樹套平衡樹。
這些解法各自的優點和缺點都不同。

2016年3月3日 星期四

[Codeforces Good Bye 2014 pB][Disjoint Set] New Year Permutation

原題連結
呼呼,這是並查集專題中的一題,題目本身並不難。
先對題目和並查集的聯繫做一點說明。

[POJ 1456][Max heap or Disjoint Set] Supermarket

原題連結
唉....最近bug實在是越來越蠢了

[Codeforces Round #218 (Div. 2) pD][Disjoint Set] Vessels

原題連結
一道並查集的頗直覺的題目
難點大概就只有在有沒有想到要用Disjoint Set去做吧......
對於已經滿的vessel i ,執行 fa[i] <- findset(i+1) ,直觀上就是將每個相鄰的滿vessel連接起來,已達到快速查詢可用vessel的效果。

細節上要注意水流到地上的case要做好,不然很容易WA或是TLE。

#include<cstdio>
#define LL long long
using namespace std;
const int maxn=200000+5;
int fa[maxn],cap[maxn],cur[maxn];
int findset(int x) {return x==fa[x]?x:fa[x]=findset(fa[x]);}
int main()
{
    int n,m;
    scanf("%d",&n);
    for(int i=0;i<n;i++) {fa[i]=i;scanf("%d",cap+i);}
    fa[n]=n;
    scanf("%d",&m);
    for(int i=0,type,a,b;i<m;i++)
    {
        scanf("%d",&type);
        if(type==1)
        {
            scanf("%d%d",&a,&b);a--;
            a=findset(a);
            for(;b && a!=n;)
            {
                if(cap[a]-cur[a]>b) cur[a]+=b,b=0;
                else // cap[a]-cur[a]<=b
                {
                    b-=cap[a]-cur[a];
                    cur[a]=cap[a];
                    fa[a]=findset(a+1);
                    a=findset(a);
                }
            }
        }
        else
        {
            scanf("%d",&a);a--;
            printf("%d\n",cur[a]);
        }
    }
}

[POJ 1182][Disjoint Set] 食物鏈

原題連結
yee~~~這是並查集非常非常經典的一道題。
顯然我1年多前看過,當時自然是沒想出來的XD,現在看就比較清晰了。

[POJ 3017][DP] Cut The Sequence

原題連結
嗚姆
個人頗喜歡這道題,大概是因為我做了蠻久的(?

[POJ 3709][DP] K-Anonymous Sequence

原題連結
關於斜率優化想了解的可以看這篇

2016年3月2日 星期三

[Codeforces Round #153 (Div. 1) pA][deque] Points on Line

原題連結
既然是pA當然要水水的XD

[POJ 3320][雙指針] Jessica's Reading Problem

原題連結

對於單調隊列、序列單調性不再多做討論,可以先做這題

[POJ 3061][雙指針] Subsequence

原題連結
這題也是相當經典的單調性的題目

[POJ 2823][deque] Sliding Window

原題連結

這道題的時間非常......奇妙。

原本我穩穩的寫完deque想說可以一次水過。

結果竟然T了!?

[Ural 1671][Disjoint Set][Offline] Anansi's Cobweb

原題連結
在線作法的話......不知道XD,LCT大概能做(?

離線作法的話非常經典,把所有操作讀入後反過來做,這樣刪除操作就變成了加邊操作,使用并查集就能輕鬆過~~

[HDU 1512][Heap][Heuristic Merge] Monkey Kings

原題連結
懂啟發式合併之後這題就很單純了。

2016年2月24日 星期三

[NPSC 2009 高中組決賽][TIOJ 1690][DLX] 補習班的報名熱

原題連結

這邊不對DLX做太多的講解,只說如何建模。

[POI XI Stage II][SCC] The Tournament

原題連結

我個人非常喜歡這道題,主要是因為直到我AC前的2個小時,我都完全沒想到這題是SCC的一道題XD。
最後雖然發現了和SCC的強大關聯性,還是借用了同學的code,而且想了非常久才弄出來的......

2016年2月22日 星期一

[Uva 315][articulation point] Network

原題連結
完全不解釋,就是一題裸的割點......
而且N才出到100,這題大概是在考你怎麼讀一行的數字吧......

[Codeforces Round #190 (Div. 1)][DP] Ciel and Gondolas

原題連結
這題的重點在於DP優化中決策點的單調性,有許多性質還是需要參考論文和證明才能懂的
有關於決策點的說明可以參考一下官方題解

2016年2月21日 星期日

[Codeforces Round #313 (Div. 1) pC][DP] Gerald and Giant Chess

原題連結
本來一直往dp[i][j]=dp[i-1][j]+dp[i][j-1]去想......結果不管怎麼弄都逃離不了O(n^2)XD

最後看了codeforces上的tag寫著combinatorics!


才突然想起高中數學也有教,從(0,0)走到(n,m)的捷徑方法數是C(n+m,m),這是解這題的其中一個關鍵

2016年2月5日 星期五

[Uva 1449][AC自動機] Dominating Patterns

原題連結
給出字串集合A和字串B,請找出A中出現在B最多次的字串,如果次數相同則按照出現順序輸出。

2016年2月4日 星期四

2016年1月31日 星期日

[SPOJ APIO10A][DP] Commando

題目連結
最單純的想法是1D/1D的DP,但是顯然不夠快。
這時候看看SPOJ的tag上寫著Convex Hull,然後就可以無恥的去做凸包優化了。

[POJ 1741][男人八題][樹分治] Tree

題目連結

不多說......就是樹分治的經典問題......在那個科技還不發達的年代還是挺難做的......

找重心,分治計算答案。最難的地方大概是答案的加減要想清楚,不然很容易完全寫錯。

啟發式合併貌似也挺快的,晚點補上code。

2016年1月29日 星期五

[教學][String][Data Structure] 後綴自動機(Suffix Automaton)

==========!! Warning !!==========
此文內容皆是出自自己的理解,若有與實際情況不符之處,請以論文或是大神文章為主
==========!! Warning !!==========

後綴自動機(Suffix Automaton)大概是我見過網路上最多教學資源的資料結構了,許多大陸和外國的神人都有寫教學文,包括寫過持久化資料結構介紹的clj大神。
不過有鑒於許多教學不是為了力求邏輯通順,定義複雜繁瑣,就是講解過程中,省略許多思考步驟,導致讀起來不甚順暢。
最後我還是決定自己完整的給出一篇教學文,使用最少的定義(3個),盡量簡化構造它和使用它的思考流程,對於重要的性質除非必須,否則說明點到即止,不加以證明。

2016年1月27日 星期三

[SPOJ LCS2][Suffix Automaton] LCS2 - Longest Common Substring II

題目連結

LCS 這篇的作法非常相似,基本概念就不說了
不過寫這題的時候花了頗大量的時間釐清答案的更新順序和debug(最後的bug竟然是錯在toposort寫爛了...)

難點在於要怎麼兩兩合併計算答案,這要對後綴自動機上的狀態表示感受到一定深度才能體會(?
code中的許多assert可以幫助理解一些關鍵點和常有的bug

[SPOJ LCS][Suffix Automaton] LCS - Longest Common Substring

原題連結

Suffix Automaton(後綴自動機)的初級練習題,關於Suffix Automaton的教學和介紹網路上有很多資源,我之後也會自己補上一篇的
這題會用SAM的主要原因是SPOJ會莫名的把O(nlogn)的Suffix Array解卡掉,所以能過的大概只有後綴自動機或是O(n)後綴樹、後綴陣列的構造法吧

2016年1月26日 星期二

[Codeforces 100495A][2014 KTU ACM ICPC Qualification Round][Dijkstra] Crystals

原題連結

注意到因為n很小...所以對於任何一個水晶集合都可以將狀態用一個int表示出來(點),然後將集合的變換看成狀態的轉移(邊)

那麼本題就可以套用經典的最短路算法解決O(NlogN),此時N=(2^n)

[Codeforces 100488M][2014-2015 Samara SAU ACM ICPC Quarterfinal Qualification Contest] Construct a Permutation

原題連結

題意即構造最長排列使得LIS長度為a,LDS長度為b(Longest Decreasing Subsequence)

[Codeforces 100488K][2014-2015 Samara SAU ACM ICPC Quarterfinal Qualification Contest] Two Pirates

原題連結

首先貪心顯然是要WA的,就不解釋了
困難之處在於無法知道最終兩人分別會取到什麼樣的數字集合

[Codeforces 100488C][2014-2015 Samara SAU ACM ICPC Quarterfinal Qualification Contest] Lost Temple

原題連結

題意其實就是求出所有正整數對(a,b)使得a*b=k(a+b)
化簡之後可以得到(a-k)(b-k)=k^2

2016年1月25日 星期一

[Codeforces 452E][MemSQL Start[c]UP 2.0 - Round 1][Suffix Array] Three strings

原題連結

首先老規矩,把三個字串用神秘的符號分隔後拼接起來,構造SuffixArray和Height陣列

相似的後綴會被排在一起,而且我們可以很快知道在SuffixArray的一群連續後綴的LCP(by H陣列)