Time of Update: 2018-12-04
題意: 求一棵樹上一條長度為L~R之間的權值最大的路徑,長度是這條路徑上的邊數,N<=100000,L<=R<=N分析: 直接樹形dp難度較大,由於是求一條樹中XX路徑,容易想到樹的分治(詳見QZC論文)演算法 這裡講一種基於點的分治,選樹的重心為根,先算出經過自己的路徑更新答案,再遞迴到子樹
Time of Update: 2018-12-04
再講題目之前,先講講ac自動機吧看到ac這麼吉利的東西,學會這什麼ac自動機的慾望便來了ac自動機全名Aho-Corasick
Time of Update: 2018-12-04
最近有點懶,很久沒寫總結了,估計今天相當差的狀態跟這有關吧(向總笑而不語)好了,廢話不多說,還是隨便記記最近做的的題目吧 pku 3657: 很有意思的題,大意是給你若干句形如a,b,c的描述,表示a~b的最小值為c,要你求第一句出現矛盾的話。
Time of Update: 2018-12-04
#include <iostream>using namespace std;const int MAX = 10000;int a[MAX];void findij(const int array[], size_t length, unsigned int& i, unsigned int& j, const int& max){int cur_max;for(i = 0; i <length; i++){cur_max = 0;for(j=i;
Time of Update: 2018-12-04
//成段更新,不必更新到底//id記錄的是節點被編號為id人的海報遮住//牆的長度很長,在建樹時,應以海報貼的最右邊為準,不然會MLE#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 10005int n,m,t,sum,p;struct TNode{ int l,r,id;} node[
Time of Update: 2018-12-04
//因為每個串的長度不超過5,最多8個串,所以最短公用母串最長為40,所以IDA*搜尋不超過40次#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,m,t;char str[9][6],dna[5]= {'A','C','G','T'};int len[9],tp[9];bool dfs(int ps[],int ds,int depth){
Time of Update: 2018-12-04
//首先把每個在能走點走出去的最小步數求出並儲存//在進行dfs時,求h()時,即是求當前存在的節點走出去的最小步數中最大者//其他地方和IDA*題一樣處理即可,此題就是多了個預先處理,首先在記憶化搜尋一遍,然後在IDA*#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define inf 12345678using namespace std;int n,
Time of Update: 2018-12-04
學校神奇地給了7天假,又可以刷一陣子題了,happy第一天嘛,就隨便做了幾道水題了 昂貴的聘禮:枚舉等級最小的點再最短路就可以了 釘子與小球:題目本身是超級水的。但有個細節需注意,給兩個分數通分相加時,要先約掉一點,不然就會爆int64 假設a/b+c/d=e/f,令k=gcd(b,d),那麼e=a*d div k+c*b div k ,f=b div
Time of Update: 2018-12-04
//不用剪枝,直接的#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int n,m,t;char str[12];int ans[10];bool fit(int mid[]){ for(int i=1;i<10;i++) { if(mid[i]!=i) return 0; } return 1;}void swap(
Time of Update: 2018-12-04
一向對資料結構不感冒,這次有所改觀盾哥對SPLAY 的崇拜使我也開始對這種感覺還比較好用的資料結構產生了興趣先分析下SPLAY的特點: 1.它能維護一個序列,動態地支援一些操作(主要是區間型操作),任意時刻它的中序遍曆都是當前序列,這棵樹其實是以位置為“序”的 2.它可以通過提根操作完成區間型操作,這裡要用到類似與線段樹的LAZY標記,更基本的操作就是旋轉 3.可擴充性非常好,支援非常多的操作,感覺上線段樹能搞定的,splay基本上都沒什麼問題
Time of Update: 2018-12-04
雖然考試時資料太水了,不過這個題目本身還是很有分析價值的題目大意: 給你四次考試的排名(4個序列),若一個選手存在另一個選手在四次排名中的至少三次在他之前,那麼我們就說這個選手不是完美的選手,要求統計完美選手的個數,n<=100000分析: n平方的樸素顯然是過不了的,那麼我們稍作分析,就可以得到這樣一個想法,把每個人某3次考試的排名抽象為一個3維空間內的點,若原點到i號人的長方體空間內有一個點,即存在j,使得a[j]<a[i],b[j]<b[i],c[j]&
Time of Update: 2018-12-04
//兩列火車入站,重新排列的車廂符不符合要求//記憶化搜尋,ans[i][j]記錄的是第一列火車的第i節和第二列火車的第j列在組合後的序列裡找不找的到//如果找的到就標記為1,因為是從前到後搜尋,所以在ans[n][m]=1時,表示符合#include <iostream>#include<stdio.h>#include<string.h>using namespace std;#define N 1005bool ans[N][N];int str1[N]
Time of Update: 2018-12-04
//很純很純的IDA*,在dfs時,要判斷當前剩下的深度和中間出現個數最大值做比較//函數fit---目標狀態是否已經存在//函數count---統計中間8個位置1、2、3出現的個數,並返回最大值//函數isok---是否之前旋轉相衝突//函數swap---旋轉#include <iostream>#include<stdio.h>#include<string.h>using namespace std;int ans[25],resf;char str[1
Time of Update: 2018-12-04
又是麻煩得要死的計算幾何題,這才發現我對計算幾何太不熟練了,考試時想到演算法沒編完,相當鬱悶題目大意: 按順序給你一個多邊形(可能為複雜多邊形),要你求這個多邊形的邊界,這所謂的邊界,就是包含原多邊形覆蓋到的面積,順著邊界走,多邊形內部在你的左手邊,而且每個邊界上的點(不一定為原多邊形的頂點)可以出現多次,邊界可以有公用點,但不自交,按順序輸出邊界上的點分析:
Time of Update: 2018-12-04
//一顆樹,邊是單向的,每個節點有一定的權值,要你從根節點走到葉子節點,走到第偶數節點時,使後面的權值和最小;走到第奇數節點時,使後面的權值和最大//邊鏈表格儲存體,並查集尋找根節點//用val[i][0]表示第i個節點是偶數節點的值和val[i][1]表示第i個節點是奇數節點的值//遞迴的計算,因為節點很多,所以要記憶化搜尋#include <iostream>#include<stdio.h>#include<string.h>using
Time of Update: 2018-12-04
//又是簡單的IDA*,注意是每一行或每一列都相等,不是某一行或某一列都相等,這個地方WA了幾次#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,m,t;int map[17];int count(int mid[],int a,int b,int c,int d){ int cnt[5]={0,0,0,0,0}; cnt[mid[a]]+
Time of Update: 2018-12-04
先說明,不是所有區間中位元都可以用左偏樹維護的,本題是有特殊性的拿到這道題,相信大部分人都想到了n^2的dp,我一開始也是笨笨地編了那個裸裸的程式,結果怎麼都得200ms+瞬間就有被第一版的0ms暴虐的感覺,忽然發現discuss裡驚現某神牛的3字帖:左偏樹這才想到05hhy論文裡ms提到了這個題,而且事實上那道題n的範圍達到了100000!哈哈,爽一把好了,進入正題,簡單講講這個進階演算法其實本題的解法是貪心,把整個序列分成若干塊,每一塊都改成那一塊的中位元,而且保證每個塊的中位元不小於前一個
Time of Update: 2018-12-04
//題目大意是,有n個人按次序插隊,第i個人會插在第f[i]個位置之後,當然隨著第i+1....n個人的插入,第i個人的位置也會發生改變//那麼我們可以從後往前插,第i個插在第f[i]位置之後,相當於第i個要在其插入的位置之前留f[i]個空位#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 20
Time of Update: 2018-12-04
在這之前我對串的全部認識就是kmp一家,應該說這次學習尾碼數組總算是讓我對串這種東西有了個基本的認識吧。之前有聽說過尾碼樹和尾碼數組,感覺上跟線段樹樹狀數組的關係差不多,不過貌似尾碼數組的應用範圍也很廣吧好了,進入正題尾碼數組,顧名思義,就是由一些尾碼組成的數組,這些尾碼就是原串中以i開頭的尾碼但單是這麼個數組沒用,我們要使他有一些性質才有用,怎麼做呢?排序?沒錯,就是排序,可以感性地想想,如果對這些尾碼按字典序排序,是不是排完序後相鄰的兩個尾碼會是最“相似”的?具體的性質稍後討論,先看看怎麼對
Time of Update: 2018-12-04
之前的那個文章寫的解方程的方法是錯誤的!之前的醜方法: 先用行列變換來消元,如果發現當前的i號元相關的所有係數都為0了,直接判其為自由元,同時跳過這個方程,完全忽略它然後接著做,最後回代判無解 X X X X X XX X XX X X X X X X X X