和隊友打模擬賽遺憾的打鐵了,在這裡總結一下題,還是太菜了。。
題目難度由易到難的順序講解。
c題隊友wa了4發後a了,一開始題意都不太理解,但實際上就是求n個數組成的所有數中的就行了。仔細想想其實題目不是很難理解。
**如下:
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int num[45];
ll dp[45][40005];
int n;
double p;
void solve()
}}int main()
choose-=dp[n][i];}}
}
i題思路:一開始博主有乙個思路,上去寫了後發現事情並不簡單,在判斷以哪個點結束的串是否可行的時候出現了問題。看了題解之後瞬間懂了。當時也寫了hash,但沒想到可以這樣遍歷串:首先列舉起點i,算這個串之後並不是列舉i+1,而是把該串的開頭的l串刪掉,再從末尾加上乙個l串,然後在判斷。
所以列舉一開始的起點就是從0到l-1即可,後面跳的過程判斷是否可行用map的大小即可。
**如下:
#include
using
namespace
std;
typedef
unsigned
long
long ull;
const
int maxn=100005;
const ull hashsize=19560817;
ull p[maxn+10];
ull s[maxn+10];
int l,m;
string a;
void init()
ull hs(int l,int r)
mapint>themap;
void solve()
if(themap.size()==m)
ans++;
while(i+now*l+l-1
1); themap[temp]++;
temp=hs(i+l*(now-m),i+l*(now-m)+l-1);
themap[temp]--;
if(themap[temp]==0)
themap.erase(temp);
if(themap.size()==m)
ans++;
now++;}}
cout
}
g題思路:g題做不出來的就是菜啊。。。一道模板題,這題沒有解題思路,就是套模板即可,2維線段樹區間查詢單點修改求最值。
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 805 ///大小
struct seg /// 單點修改,區間查詢極值模板
void pushup(int xrt, int rt)
void buildy(int xrt, int x, int l, int r, int rt)
return;
}m = l + r >> 1;
buildy(xrt, x, lson);
buildy(xrt, x, rson);
pushup(xrt, rt);
}void buildx(int l, int r, int rt)
m = l + r >> 1;
buildx(lson);
buildx(rson);
buildy(rt, -1, 1, n, 1);
}void updatey(int xrt, int x, int l, int r, int rt)
return;
}m = (l + r) >> 1;
if (yl <= m)updatey(xrt, x, lson);
else updatey(xrt, x, rson);
pushup(xrt, rt);
}void updatex(int l, int r, int rt)
m = (l + r) >> 1;
if (xl <= m)updatex(lson);
else updatex(rson);
updatey(rt, -1, 1, n, 1);
}void queryy(int xrt, int l, int r, int rt)
m = (l + r) >> 1;
if (yl <= m)queryy(xrt, lson);
if (yr>m)queryy(xrt, rson);
}void queryx(int l, int r, int rt)
m = (l + r) >> 1;
if (xl <= m)queryx(lson);
if (xr>m)queryx(rson);
}}seg;
int main()
}}
b題思路:比賽的時候知道了乙個公式θn
=θn−
1+θn
−2然後發現所有的冪都可以寫成θ^2的表達方式,然後發現係數成斐波那契數列,結果越想越遠,寫了乙個遞迴的方法,過後突然發現係數的問題還是不是特別好解決。
看了題解後突然發現還有乙個公式: 2∗
θn=θ
n+1+
θn−2
,然後可以把乙個數」稀釋」到它的兩邊,不斷的將係數變小,再不斷的用第乙個公式將連續的兩個1合併到乙個1就行了。
#include
#include
#include
using
namespace
std;
int num[105];
int main()
}for(int i=0; i<100; i++)
}if(flag)
break;
}int begin,end=50;
for(int i=100; i>=50; i--)
if(num[i]==1)
for(int i=0; i<=49; i++)
if(num[i]==1)
for(int i=begin; i>=50; i--)
if(end!=50)
}printf("\n");
}return
0;}
總結:題目都是好題,可惜不會做,做完之後感覺豐滿了很多。繼續努力吧。 2013 ACM ICPC 長春網路賽F題
題意 兩個人輪流說數字,第乙個人可以說區間 1 k 中的乙個,之後每次每人都可以說乙個比前乙個人所說數字大一點的數字,相鄰兩次數字只差在區間 1 k 誰先 n,誰輸。問最後是第乙個人贏還是第二個人贏。第乙個人搶到n 1的方法,就是先說乙個數字與n 1的差是k 1的整數倍。因為在這之後另乙個人無論說幾...
2015 ICPC長春賽區銅牌題
題意 給出n m的空地,每個空地上給出的數字是用方塊疊起來的高度,在三維空間求出這些用立方體堆起來的表面積,底面積不算。掃三個方向就行,正檢視和側檢視算出來的值都要乘以2。如下 include include include include includeusing namespace std de...
2023年的408演算法題
思路一 使用hash對映打表,每出現一次次數加1,如果次數有超過n 2,則存在主元素,反之,則不存在。缺點 需要輔助陣列 思路二 兩兩相互抵消。如果陣列中存在大於一般的相同元素,首先假設第乙個元素為主元素的候選元素 統計個數為1 如果目前元素統計的個數大於0,遇到相同的數字 個數加1,不同的數字 個...