Time of Update: 2018-12-04
/*cf - A 打表出合格一組資料 */ #include<iostream>#include<cstdio>#include<algorithm>#define manx 109 using namespace std;int d[manx];int main(){ int n; while(cin>>n){ for(int i=0;i<n;i++) cin>>d[i];
Time of Update: 2018-12-04
題目:DNA Sequence這題做了一晚上,即使大體的思路明白了,但還是糾纏與各種細節的實現#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <algorithm>using namespace std;#define mod 100000#define pb
Time of Update: 2018-12-04
Wireless Password題意:給m個串(m<=10),求長度為n且至少含k個可重疊給定串的串的數目。AC自動機+狀壓dp,i為串長,j為二進位狀態,表示當前包含哪些串,k為trie樹上一節點編號。#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=4680總體思路:初始化n棵splay樹,合并的時候需要用啟發學習法合并最佳化一下,前三個操作照做就行,第四個關於三角形的詢問需要西安判斷當前splay樹上有沒有3個節點,多餘三個的話就先枚舉最小的邊a和次小的邊b,然後尋找a+b的後繼c,找到的話答案加一,然後a =
Time of Update: 2018-12-04
考研路茫茫——單詞情結題意:這題和poj2778沒有本質區別,都是通過AC自動機得到遞推矩陣,然後矩陣快速冪。遞推的狀態都是長度和單詞結尾在trie樹上的位置(最長公用字串,trie上是首碼,在遞推的單詞上則是尾碼)。但這題會多些線性代數的技巧,例如求26^1+……+26^n要用二階矩陣,還要用長度恰好為l的矩陣去構造長度小於等於l的遞推矩陣。#include <iostream>#include <cstdio>#include
Time of Update: 2018-12-04
題目連結:http://codeforces.com/problemset/problem/337/D解題思路:顯然我們要找到這樣的點,使得這個點到所有汙染點的最遠距離小於K,某個節點到汙染點最遠距離是由此節點到這個節點子樹中的汙染點的最遠距離和父節點到兄弟子樹中汙染點的最遠距離+1取最大值得到的。我們要保留一個此節點到子樹中的最遠距離dis[i],此節點向上走的最遠距離updis[i],此節點到子樹中距離最遠的前兩個Max[i][2],然後第一遍dfs處理dis數組和Max數組,第二遍統計一下
Time of Update: 2018-12-04
Lost's revenge#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <queue>#include <algorithm>using namespace std;#define pb push_backstruct node { int
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=4676解題思路:總體上這是一個數學題加上離線與分塊處理加速。顯然對於區間內有公約數x的數來說,假設有num[x]個x的倍數,那麼答案顯然是sigma(C(num[x],2)*f(x)),根據容斥原理f(x)應該是一個小於x的數並且滿足sigma(f(d)) = x{d|x},因為有x這個約數的數對一定也有d這個約數,其中d|x,所以我在加上C(num[x],2)*f(x)之前就把C(num[d],2)
Time of Update: 2018-12-04
template<typename T>class RMQ{ T **f; int n1; int n2; bool (*cmp)(const T &a,const T &b); bool compare(const T &a,const T &b) { if(cmp==NULL) return a < b; return cmp(a,b); } void init() { for(int
Time of Update: 2018-12-04
/*A 題,方法:搜尋 。。。題意:要求(0,0)到(x,y)要拐幾個彎!! 題目lian接:http://codeforces.com/contest/279/problem/A */#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<string>using namespace std;#define manx 10000int
Time of Update: 2018-12-04
已知同一賽區的 N 只球隊,現在知道他們現有得分,還有剩下的比賽場數(包括本賽區內的,和跨賽區的),以及賽區內部的對陣表,問 1 號球隊能否獲得賽區冠軍(可以並列)。大神的建圖,我複述一遍,加深理解:首先我們貪心選擇 1 號球隊剩下的比賽全部獲勝,剩下的球隊跨賽區的比賽全部輸掉。如果這樣,還是有球隊的得分已經超過 1 號球隊,那麼就不用判斷了,直接 “NO” 了。如果一號球隊還有戲的話,我們就開始建圖:從源點連到剩餘球隊的邊(一號球隊不用管了),權值為該球隊和 1 號球隊的勝場差。如果球隊 I
Time of Update: 2018-12-04
題目:hdu_4349_Xiao_Ming's_Hope 官方題解:本題為Lucas定理推導題,我們分析一下 C(n,m)%2,那麼由lucas定理,我們可以寫成二進位的形式觀察,比如 n=1001101,m是從000000到1001101的枚舉,我們知道在該定理中C(0,1)=0,因此如果n=1001101的0對應位置的m二進位位為1那麼C(n,m) %
Time of Update: 2018-12-04
/*A 題,題意: 要你求一系列操作後,燈的最後狀態 解析:前後左右加本身的和,判斷奇偶就行了。。 */ #include<iostream>#include<cstdio>#include<algorithm>#define manx 4using namespace std;int x[manx][manx],s[manx][manx];int main(){ for(int i=1;i<=3;i++){ for(int j=1;
Time of Update: 2018-12-04
給定有向圖,每條邊只能用一次,求給定兩點間有幾條最短路。看了看人家的文,有個很巧妙的方法,首先篩選出所有最短路,用這些在最短路上的邊建圖(每條邊賦權值為一,保證只能使用一次),求一次給定點之間的最大流即可。我用的 floyd 求最短路,dinic求最大流:#include<cstdio>#include<cstring>#include<queue>#define find_min(a,b) a<b?a:busing namespace
Time of Update: 2018-12-04
題目:K-th Number雖說是第一次就AC,但到網上去搜羅更優代碼時,卻幸運的發現,我的AC代碼是錯誤的,只不過資料太水。我考慮掉一種情況,當有多個數和中位元相同時,如果從左至右一次將小於等於中位元的數劃入左子樹,可能導致區間右端的哪些比中位元小的數被劃入右子樹。例如,資料為1 2 2 2 1時,第二個2應劃入右子樹,最後一個1應劃入左子樹。#include <iostream>#include <cstdio>#include
Time of Update: 2018-12-04
/*題目意思很簡單,直接暴力就行。。。 */#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int main(){ int n; while(cin>>n){ int flag=0; for(int i=1;i<=9;i++){ for(int j=0;j<=9;j++){
Time of Update: 2018-12-04
題意是說給出一些閉區間,這些區間上整點可以選擇放一個元素或者不放,但是每個區間都有一個下限,就是說你在這個區間裡面的元素個數不能低於這個下限值。最後要求出最少需要幾個元素才能滿足每個區間的要求。建圖(參見這裡)之後可以轉化成最長路問題。另:差分約束中dist[ ]的初始化很有意思,比如你初始化的是 0 ,那麼按照最長路更新dist[ ]數組,最後得到的就是大於 0 的最小值;如果按照最短路更新dist[ ]的話,最後結果是小於 0 的最大值。
Time of Update: 2018-12-04
Ring#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <queue>using namespace std;#define pb push_back#define INF (1<<30)struct node{ int son[26],fail; int
Time of Update: 2018-12-04
/*B題,題意:給你x,y,n; a(a>=0),b(b<=n),要你找出離 x/y 最近的分數 a/b 。 如果存在多個結果,則取分母最小的,如果還有多個結果,則取分子最小的解析:從 1 到 n 的分母進行遍曆,然後對每一個分母找出最接近的分子,其中分子不需要每次從0開始算。。。 小學知識:分子相同,分母大的反而小。。。。 */#include<iostream>#include<cstdio>#include<cmath>
Time of Update: 2018-12-04
156 - Ananagrams注意一個字母的情況#include<string.h>#include<stdio.h>#include<stdlib.h> int cmp_char(const void* _a,const void* _b){ char* a= (char*)_a; char* b= (char*)_b; return *a - *b;}int cmp_string(const void* _a,const void* _