b:美味果凍
更換一下列舉順序得到:
容易發現 i 為 [j,2j),[2j,3j)... [(t-1)*j,t*j)時後面向下取整的結果是一樣的,分塊計算即可,j 次冪通過(j-1)次冪 o(1) 得到,時間複雜度為 o(nlogn)
#include using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int maxn = 3e6+36;
ll pow[maxn];
inline ll qpow(int a,int x)
ll solve(int n)
tep += 1ll*(n-t*j+1)*(n+t*j)/2%mod*qpow(t,j)%mod; //單獨計算最後非完整的塊
res = (res + tep) % mod;
}return res;
}int main()
c:富豪凱匹配串
ac自動機是不可能的
資料範圍是支援暴力列舉文字串的,那就列舉每乙個文字串,只用把匹配串下劃線對應的位置搞成 0,然後比較二者是否一樣即可,字串只包含0,1,bitset 優化上述兩種操作即可
#include using namespace std;
const int maxn = 1e3+13;
bitsetb[maxn];
int n,m,q;
char s[maxn];
int main()
scanf("%d",&q);
while(q--)
int cnt = 0;
for(int i = 0;i < n; ++i)
printf("%d\n",cnt);
}return 0;
}
e:老瞎眼 pk 小鮮肉
區間異或值為 0,套路的算出每個位置的字首異或和,只要兩個位置的字首異或和一樣,那麼這段區間的異或值就為 0;問題就轉換為求區間內兩個最近的點對,先將詢問離線按右端點排序,依次移動掃瞄指標,求出當前位置的異或字首和,只需要更新這個值上一次出現的位置的最小值即可,因為這兩個點對一定是最近的(僅對於這個異或值作為r來說),那麼掃瞄到詢問直接查詢區間最小值即可
#include using namespace std;
const int maxn = 5e5+55;
const int inf = 0x3f3f3f3f;
int n,m,a[maxn];
struct queryq[maxn];
bool cmp(query a,query b)
int tr[maxn<<2],res[maxn];
void build(int l,int r,int x)
int mid = (l+r)>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
}void updata(int l,int r,int pos,int x,int v)
int mid = (l+r) >> 1;
if(pos > mid) updata(mid+1,r,pos,x<<1|1,v);
else updata(l,mid,pos,x<<1,v);
tr[x] = min(tr[x<<1],tr[x<<1|1]);
}void query(int l,int r,int l,int r,int x,int &ans)
int mid = (l+r) >> 1;
query(l,mid,l,r,x<<1,ans);
query(mid+1,r,l,r,x<<1|1,ans);
}mapmp;
int main()
int ans = inf; query(1,n,q[i].l,q[i].r,1,ans);
res[q[i].id] = ans > n ? -1 : ans;
}for(int i = 0;i < m; ++i) printf("%d\n",res[i]);
return 0;
}
牛客練習賽53 ABC
a 簡單dp include define ll long long using namespace std const ll mod 1e9 7 ll d 1000000 2 ll n intmain cout d n 1 d n 0 mod return0 b 分塊 include define...
牛客練習賽22題解
簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...
題解 牛客練習賽51
字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...