2015 上海網賽 HDU5469 樹分治

2021-07-05 13:27:41 字數 2314 閱讀 3712

/*

*rainto96

*beijing university of posts and telecommunications school of software engineering

*題意:10000個節點的一顆樹

每個節點有個字母

給出目標字串

求是否存在點對u,v使得u到v的路徑上的字母正好組成這個字串

解法:就那麼搞,字首記一下,字尾記一下,然後查查缺的部分有沒有

查很有講究

如果用map存hash值的話,常數太大(自己寫的也過不了)很難過

其實可以用bool值存遍歷過的狀態,是這樣的,如果發現當前結點到根的字串恰好是某個字首或者某個字尾,則把那裡的開關開啟

查詢的話也是查對應的缺的部分開關有沒有開啟,於是就從帶常數的o(1)變為了樸素的o(1)

這裡有一些小細節要注意,多測幾組樣例就好了

*/#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define pb push_back

#define all(x) x.begin(),x.end()

#define vint vector#define pii pair#define mp(x,y) make_pair((x),(y))

#define ll long long

#define ull unsigned ll

#define mem0(x) memset(x,0,sizeof(x))

#define mem(x,val) memset((x),val,sizeof(x))

#define scan(x) scanf("%d",&(x))

#define scan2(x,y) scanf("%d%d",&(x),&(y))

#define scan3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))

#define scan4(x,y,z,k) scanf("%d%d%d%d",&(x),&(y),&(z),&(k))

#define max(a,b) a=max(a,b)

#define min(a,b) a=min(a,b)

using namespace std;

const int maxn = 10111;

int head[maxn];//

struct edgeed[maxn*2];

int n;

bool del[maxn];//

int wt[maxn];

int newroot;

int maxn=0x3f3f3f3f;

int dfs(int now,int fa,int all,int& newroot , int dep)

max(mx,all-wt[now]);

if(mx < maxn) maxn=mx ,newroot=now;

return wt[now];

}int searchit(int root,int all)

int ednum=0;//

bool found=false;//

int len;//

void init()

const ull magic = 33;

ull mi[maxn];//

char node[maxn] , s[maxn];//

ull hsv;

pairque[maxn*3];//

int tail;//

bool st1[maxn],st2[maxn];//suf , pre

ull pre[maxn],suf[maxn];

//setst1,st2;//

#define p(x) ((x)-'a'+1)

bool gao(int now,int fa,ull hs,ull ant,int len,int root)

for(int i = head[now];i!=-1;i=ed[i].nxt)

return false;

}pii sque[22111];

int shead=0,stail=0;

void solve(int rt,int sz)

solve(1 ,n );

if(found) puts("find");

else puts("impossible");

} return 0;

}

HDU 5242 GAME 2015上海邀請賽G題

題意 給定一顆以1號節點為根節點的有向樹,每個節點有乙個權值,問從1號節點出發k次,能到達的所有節點的和的最大值。思路 貪心的把樹的鏈按照權值和從大到小剖分成若干條鏈 過程可以根據上交書上的熟練剖分模版做細小改動 然後根據每條鏈的權值排序取最大的k個就是答案。include include incl...

hdu5047(上海網賽1006)Sawtooth

題意 乙個矩形畫布。在上面畫 m 問畫n個m,最多把畫布分為幾部分。思路 找規律,研究畫第二個m的時候,在第乙個的基礎上增加了多少區域。可以得出公式 16 n n 1 2 2 n 1。然後因為結果爆long long,高精度搞超時,所以砍半來計算。include include include in...

HDU 5045 狀壓DP 上海網賽

比賽的時候想的是把n個n個的題目進行狀壓 但這樣不能講究順序,當時精神面貌也不好,真是挫死了 其實此題的另乙個角度就是乙個n個數的排列,如果我對n個人進行狀壓,外面套乙個按題目循序漸進的大迴圈,那麼,在當前做第i個題目,前i 1個題目已經做完,然後做完的人的狀態為j,j可能是1110 1101 10...