對於每個強聯通分量,這些牛一定都互相喜歡,所以縮點(我也不知道怎麼想到的) 接下來就是統計答案,最後縮成了一個DAG圖,如果這個點是明星的話,其他每個點一定直接或間接的鏈接這個點 也就是說其他點一定有出度,把關係傳遞給其他點了,如果某個點沒有出度,那麼這個點沒有傳遞出他們的愛慕關係, 如果存在多個這樣的點的話自然每個點都不會傳遞出他們的愛慕關係,也就不會有某個點成為明星了 所以如果出度為0得點只有一個,那麼答案就是它的點數,不然答案為0 #include<iostream> #include&…
前言:對於這週的咕咕咕表示好像沒什麼好表示的,完全沒有靈感a......寫東西真的好難啊......於是又玩了半天鬼泣4???還挺好玩的 來源:題解 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入输出格式 输入格式: 第一行,n,m 第二行,n个整数,依次代表点权 第三至m+2行,每行两个整数u,v,表示u->v有一条有向边 输…
一道好題不出所料又抄的題解 1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹 這樣能保證選到盡量大的邊 2.跑完最大生成樹后每兩點之間就有唯一路徑了,想要知道兩點間最小邊權,可以在LCA過程中求出(我竟然不會LCA),對lca做些許改動 #include<bits/stdc++.h> using namespace std; ; ; struct node1{ int u,v,w; }e1[maxm]; struct node2{ int…
果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有更大的平均數, 求子串和最大值可以用單調隊列維護, #include<bits/stdc++.h> using namespace std; ; int n,s,t; double a[maxn],sum[maxn]; int b[maxn],q[maxn]; bool check(double…
一道好題,然而看題解做的...... floyed的實質:只經過前k個點i到j的最短路,原狀態轉移方程為 f [ k ] [ i ] [ j ]=min( f[ k-1 ] [ i ] [ j ],f[ k-1 ] [ i ] [ k ]+f [ k-1 ] [ k ] [ j ] ) 這樣壓掉一維就變成了我們熟悉的樣子 而這題發現這裡的k剛好很符合題中時間這一要求,即時間不超過k時的最短路,而題中給的詢問t又是有序的(無序也可以排序) 所以就每次就用這個點的時間去更新一遍所有點的最短路,即可達…
來源:題解 不發題面 因為 l 範圍太大,而石子數卻很少,步數也僅僅在1~10之間, 也就是說兩個石子之間很有可能間隔很大的距離,不管怎麼跳都能跳過去,那麼中間那些怎麼樣都能跳過去的區間和沒有等價, 所以讀入后就更新一遍pos和vis數組,範圍就可以縮到比較小, 至於具體多大的區間可以刪掉,可以取1~10的最小公倍數2520,(小凱的疑惑)71,(t * t-1)90,甚至可以 %t 再 +t,好像都可以 大概是一個離散化的方法吧 #include<iostream> #include<…
前言:基本上發題解的都是抄的題解所以 來源:題解 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<=2000),并已知任何两个人的身高都不同.假定最终排出的队形是A 个人站成一排,为了简化问题,小A想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原则依次将每个人插入最终棑排出的队形中: -第一个人直接插入空的当前队形中. -…
區間dp 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电.他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯.开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来…
尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时, 可以列一个二元一次方程组 R-L+1=K1 L+R=K2 解得L=(K2-K1+1)/2, R=(K1+K2-1)/2 当K1,K2一奇一偶时,L,R才有自然数解. 不过有一种特殊情况,就是L=R的情况,这种情况是不允许的 即(K2-K1+1)/2≠(K1+K2-1)/2,解得K1≠1 尺取…
P1917 -- 探险 时间限制:1000MS      内存限制:131072KB 题目描述(explore.cpp) π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品. π+e手上有 n+e的地图,所以他知道每一个宝箱的价值,但是他不喜欢走回头路,所以要按顺序拿这 N 个宝箱中的若干个. 但是拿宝箱很累的.一开始 π+e的体力是 1, 每得到一个宝箱之后, π+e得到的价值是体力 × 宝箱的价值,之后他的体力就会变为原来的 k倍 (0<k<1). π+e 不喜欢连续放过…
首先考虑最小生成树的模型,唯一不同的是第二种情形. 即“三个或三个以上的城市申请修建的公路成环” 考虑该情形,因为修路的申请是申请离它最近的城市,所以上述条件实质上为 “存在三个或三个以上的城市,他们两两间的最近城市连起来成环” 而题目保证有唯一解,所以第二种不存在 double的5000*5000開不下,所以在prim時用到哪條邊算哪條邊 寫掛了調不出來所以複製了題解......…
好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相同的木棍 4.二分查找下一根小於等於未拼木棍長度的木棍 5.因為是從小到大枚舉原木棍長度,所以第一次找到可行解就是最優的,直接停止 6.如果當前選擇木棍長度等於當前未拼木棍的長度,並且繼續搜索失敗時,就不再搜了 因為如果不用這根拼的話必然要拿更小的幾根木棍拼好當前未拼的長度, 而晚用長木棍早用短木棍…
來源:題解 一開始看不懂題目,一萬年了終於看懂 f [ i ] [ j ] 表示第i朵花放在第j個花瓶中最大美學值,(花是必須用完嗎?) 顯然放i-1朵花至少要放到前i-1個瓶子里,最多放到前j-1個瓶子里(因為這個要放到第j個瓶子) 所以就遍歷一下 (i-1,j-1)這個區間轉移一下 f [ i ] [ j ]=max( f [ i ] [ j ] , f [ i-1 ] [ k ]+w[ i ] [ j ] ) ( i-1<=k<=j-1 ) 輸出方案只要選擇 g [ i ] [ j ]記…
前言:[數據刪除] 來源:題解 不發題面了 首先我们来分析题目,“每个垃圾都可以用来吃或堆放”,浓浓的透露出一个背包气息.我们可以类比背包问题的放或不放.于是dp[i][j]dp[i][j]dp[i][j]描述为处理前i个物品的某状态j,那么状态j代表什么呢? 我们可以继续分析题目并使用排除法 分析题目,我们需要求的答案是时间,于是很自然而然的想到j描述高度或生命,而dp数组存放时间.很显然,这样状态既不完整,也写不出转移方程.而且dp数组存的是当前状态下最大或最小的价值,似乎也不满足. 这时候…
兩個都是一次函數,下取整就是整點個數,兩個函數k剛好成倒數,所以最後發現會組合成一個矩形 (為啥要考慮重複與否的問題???) 然而這樣會不會重複計算點數呢 我們發現因為取的是圖像下的整數點 所以要想重複算必須有整點的交集 然而pq互質,函數值不會有整數,把兩個函數圖像旋轉拼合以後可以發現不會重複算 但是當p和q相等的時候就會有交集了,這樣把對角線上重複算的去掉, ((p-1)/2)((p-1)/2)是矩形中的点数,后面是重复的点(有((p-1)/2)((p-1)/2)个点就有(p-1)/2)个点…
清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不選前面那個選當前這個,應該是比較好的思想 這道題還有一個就是如果最優解要你走到那個點,那麼中間的路程是不可省略的,所以貪心時大可不考慮 反正實質上是個dp,取的是最大值 #include<bits/stdc++.h> #define ll long long using namespace std…
看到最大的最小值應該想到二分答案,這樣就解決了最小點權的問題,判血量就很好說,直接比較就行, 一個點是二分點權數組,複製一份然後排序,二分下標,速度較快 這麼簡單的題我竟然寫了這麼長時間 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll long long using namespace std;…
大水題然而因為智障的錯誤调了半天......n,m别反着输入啊......內外循環和狀態數都不等價 别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可 #include<bits/stdc++.h> using namespace std; ; int n,m,tot; ][<<+],c[<<+]; ]; int main() { scanf("%d%d",&m,&n); ,a;i<=m;i++) ;j<=…
雖然是裸題但是仍然沒有看出來...... 1.每個人都對應一張床(可以的話),這樣把人和床看成點,對應關係就是邊,跑最大匹配看匹配數量夠不夠即可 2.連邊條件:如果一個學生且不回家,那麼他可以睡自己的床,向自己的床連邊 如果外來人且認識一個回家學生,那麼他可以睡學生的床,向學生的床連邊 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; int T,n; struct…
是一道歐拉路的題竟然沒看出來...... 把每種顏色看成一個點,每根木棍看成一個邊,即相同顏色在圖中接好合併成了一個點, 問題轉化為了求是否存在歐拉路 如果用map會超時,所以可以用字典樹實現離散化/哈希,unordered_map需要c++11 注意判斷圖是否聯通,用并查集即可 #include<iostream> #include<cstdio> #include<cstring> #include<unordered_map> using namesp…
今天被老師留的作業搞死了,全是裸的水題,難題就那麼兩道我還沒寫......,狗屎 1.倒序處理,每個點至多會被更新一次 2.所以要做的就是快速找到下一個不同顏色的點, 3.然而不知道怎麼就 想到用并查集維護 了?用雙向鏈錶不是更自然碼(雖然也可以) 4.其實并查集就是把相鄰的相同顏色的點并成一個,直接處理端點即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; in…
搜索:https://www.cnblogs.com/SiriusRen/p/6532506.html?tdsourcetag=s_pctim_aiomsg 來自 SiriusRen 數據範圍小,考慮直接dfs,剪枝:到達此層如果用時更長就不再搜了, 然而我有一個問題就是到達每層手柄的狀態並不一樣,怎麼能直接更新呢? 然而我用二維的寫掛了,T5個點,所以先放上一維的掛著了...... #include<iostream> #include<cstdio> #include<c…
好久沒有話多了,是覺得有點浪費時間,今天考試和一中用的一樣的題,結果反而考得不好,不過Jackpei一句知恥而後勇點醒夢中人偷偷@Jackpei 就是這樣吧 還有我極度懷疑我的鍵帽打油了......我買了假的PBT還是我的手實在是太油了...... 強制在線,因為不等關係沒有傳遞性,於是用set維護不等關係,并查集維護相等關係, 合併時把set也合併掉,具體就是直接複製合併,複雜度可以接受,雖然並不會算 於是大力瞎搞,我調了半天錯在了合併set搞錯了,it本來就是s[xx]的迭代器,怎麼能和自己…
可以發現每個點經過次數恰好等於這個點的度數,所以把點權下放邊權,跑最小生成樹,原來邊權乘二在加上兩端點權,答案再加一遍起點最小點權 #include<bits/stdc++.h> #define ll long long using namespace std; ; ; int n,m; ll ans; struct node{ int u,v,w,nxt; bool operator <(const node&a)const{ return w<a.w; } }e[max…
被入門難度的題虐...... 作者: kkksc03 吉祥物 更新时间: 2013-07-14 19:00 在Ta的博客查看    78   By lzn 数论水题一道. 首先,若可能的最大公约数为a,取出的k个数为X1,X2,……,Xk且满足X1<X2<……<Xk,那么有X1>=a,X2>=2a,……,Xk>=ka.又∵Xk<=n,∴n>=ka,∴a<=n/k,又∵a为整数,∴a<=[n/k]([]为取整符号). 另一方面,我们取[n/k],2…
首先要知道不能跑最短路,因為只有整2^k才能一秒到達,和倍增有關 所以我們想知道任意兩點間能否存在一條2^k長度的路徑,數據很小,可以考慮floyd 把倍增和floyd結合起來考慮發現如果i到k,k到j各有一條2^(k-1長的路徑,那麼i,j之間存在一條2^k長度的路徑 於是在更新一下實際時間,對時間跑一遍floyd即可 #include<bits/stdc++.h> using namespace std; int n,m; ][]; ][][];//i,j是否存在長2^k長度的路徑 int…
很簡單的水題,因為智障沒有A所以發篇博客 同樣的題:luogu_P1455 搭配購買 用并查集維護一下所有實力相等的人的size,然而你可以選多個size......,於是跑個背包就行了,只要注意一下背包空間2m就完了 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; ; int n,m,k,ans,cnt; int fa[maxn],size[maxn]; ]; i…
1.無權圖最短路邊權為1 2.如果兩個點恰好不能被更新(d[y]==d[x]+1)那麼就能通過x的所有最短路到達y,所以ans[y]+=ans[x] 3.如果兩個點不能恰好被更新(d[y]>d[x]+1)那麼到達y的最短路目前只有通過x到達,所以ans[y]=ans[x] #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std;…
簡單的區間dp,結果竟然寫掛了......還掛的很徹底......狗屎 如果區間左右端點相等,那麼不需要在多花一次去刷,對 f [ i+1 ] [ j ],f [ i ] [ j-1 ]取個min, 然後枚舉斷點k,直接就是左右區間相加,(簡單吧......) #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; ][]; int min(int a,int b){re…
关于“我读过很多书,到后来大部分都被我忘记了,那阅读的意义是什么?”的疑问,我看过最巧妙的一个回答:当我还是个孩子的时候,我吃过很多的食物,大部分已经一去不复返而且被我忘记了,但可以肯定的是,它们中的一部分已经成长为我的骨头和肉.阅读对你的思想的改变也是如此. 填充的方法: 每個點三種情況, 1)是一個豎著的1*2的長方形的上半部分,對下一行限制是必須補全該長方形,用二進制1來表示 2)是一個豎著的1*2的長方形的下半部分,對下一行無限制,用0表示 3)是一個橫著的1*2的長方形的一部分,對下一…