原创 程序自動分析-----------------------------思維(並查集+離散化)

解析: 由於i,j非常大,所以我們需要離散化一下 先把相同的加入到集合中,然後再去找不同的判斷不同的兩個數是否在同一集合中 #include<bits/stdc++.h> using namespace std; const

原创 三角形-----------------------------思維(斐波那契數列)

解析: 三角形兩邊之和大於第三邊。因此我們可以用斐波那契數列來構造,並且分的段數還是最多的。 斐波那契數列:1,1,2,3,5 因爲斐波那契數列任意兩個數加起來,都不會大於第三條邊。 所以我們只要預處理出前100項即可,然後累

原创 銀河英雄傳說----------------------------------思維(並查集)

解析: 對於兩個戰艦之間的戰艦的數量用一個數組記錄,壓縮路徑的同時更新這個數組即可 #include<bits/stdc++.h> using namespace std; const int N=3e4+1000; int

原创 匹配統計----------------------------思維(二分+hash)

解析: 把A和B串哈希。然後枚舉A串的後綴,然後二分A串和B串匹配的長度即可 時間複雜度O(nlogn) #include<bits/stdc++.h> using namespace std; typedef unsigne

原创 矩陣---------------------------------------------思維(二維hash模板)

解析: 二維哈希模板 Sp[b]-hip[a*b]+h[j] #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const

原创 樹形地鐵系統-----------------------思維(樹的最小表示法)

解析: 樹的最小表示法:對於每個節點的最小表示法爲子節點的最小表示法排序連接起來 最終都是通過排序連接。0表示向下走,1表示向上走 #include<bits/stdc++.h> using namespace std; s

原创 煩人的依賴-----------------------思維(拓撲排序)

解析: 拓撲排序模板題。 我們把拓撲排序中的隊列改爲優先隊列就可以使字典序最小 對於入度爲0的點,我們加入優先隊列 然後++cnt 如果n>cnt 說明存在環輸出Impossible #pragma GCC optimize(

原创 序列卷積之和------------------------思維(前綴和)

解析: 探討一下: 當n=3的時候 l=1: a1*(3a1+2a2+a3)+a2*(2a2+a3)+a3a3 l=2: a2*(2a2+a3)+a3a3 l=3:a3a3 我們用前綴和處理一下(3a1+2a2+a3) 然後

原创 B. Orac and Models-------------------------思維(dp)

解析: 和最長上升子序列是一樣的。是不過我們要枚舉能整除i的數然後狀態轉移 狀態轉移方程:f[i]=max(f[j],f[i]+1) #include<bits/stdc++.h> using namespace std; c

原创 表達式計算4---------------------思維(棧)

#include<bits/stdc++.h> using namespace std; stack<int> num; stack<char> ops; int qmi(int b,int a) { int res=1;

原创 C. Orac and LCM-----------------------思維(數學公式)

解析: gcd(lcm(a1,a2),lcm(a1,a3),lcm(a1,a4),…,lcm(a1,an)) 因爲都有一個共同因子a1 所以 gcd1=lcm(a1,gcd(a2,a3,a4,…,an) 同理gcd2也是這樣的

原创 D. Multiset-----------------------------思維(樹狀數組+二分)

題意: 給定n個數,和k次詢問。 每次詢問如果qi<0 就刪除第|qi| 個 每次詢問如果qi>0 就把qi插入到集合中 問最後集合是否爲空,爲空輸出0,不空輸出裏面的元素 解析: 用樹狀數組維護qi>0的操作,即在對應的

原创 項鍊----------------------------------思維(最小表示法)

解析: 因爲項鍊是環形,且還要輸出字典序最小的。那麼滿足最小表示法的性質 所以我們對這兩個串求最小表示法 比較這兩個串的最小表示法是否相同即可 #include<bits/stdc++.h> using namespace s

原创 小貓爬山--------------------------思維(dfs)

#include<bits/stdc++.h> using namespace std; int cat[20],sum[20]; int n,k,w,ans=20; void dfs(int u,int k) { i

原创 城市遊戲--------------------------思維(單調隊列)

解析: 這道題是"直方圖中最大的矩形"的升級 對於這個二維數組,我們枚舉每一行。 對於每一行的每一列統計一下,從i行~1行連續的F的個數,作爲h[i][j]的高度。 就轉變成"直方圖中最大的矩形“的題目了,我們只要用單調隊列去