省選模擬測試5

2022-09-19 09:42:13 字數 2740 閱讀 3471

因為只有包含關係和不相交關係,就可以根據包含關係\(o(n^2)\)建樹,\(o(n)\)跑樹形dp

考慮優化建樹,把乙個圓看成乙個正方形然後做掃瞄線,線段樹每個節點維護set,存縱座標在這個區間的正方形的編號

需要判四個角,暴力跳就行了

大多數情況下複雜度\(o(n\log^2n)\)

發現\(t(n,k)=nc(n-1,k-1)\)

然後繼續觀察,我們要求的是\(lcm(n-k+1,n-k+2 ...n)\)

構造乙個陣列\(g_i\),使得上式等於\(\prod_^g_i\)

考慮已經構造出 n-1 時的g陣列,先在\(g_n\)處插入 n

這樣顯然不一定合法,因為n的質因子在前面出現過,這樣會重複

將n質因數分解,計算\(p^k\),q設為k

如果之前出現了\(p^r\),若r>=q,使r減q,否則r->0,q也減r

可以給每種質數開個棧,可持久化線段樹維護即可

複雜度\(o(m\log^2m + t\log m)\)

沒改出來

**

#includeusing namespace std;

#define il inline

#define int long long

const int n=1e5+11;

const int inf=1e9;

struct pot_pot[n];

struct treetre[8*n];

bool vis[n];

int n;

int f[n];

int lsh[2*n],num;

vectorvi[2*n],vo[2*n],vct[n];

il int pd(int x)

il int min_(int x,int y)

il int max_(int x,int y)

il bool cmp(pot_ a,pot_ b)

void build(int i,int l,int r)

void insert(int i,int l,int r,int id,bool jd)

int mid=(tre[i].l+tre[i].r)>>1;

if(l<=mid) insert(i<<1,l,r,id,jd);

if(r>mid) insert(i<<1|1,l,r,id,jd);

return;

}int qry(int i,int x,int id)

} if(tre[i].l==tre[i].r) return ans;

int mid=(tre[i].l+tre[i].r)>>1;

if(x<=mid) ans=min_(qry(i<<1,x,id),ans);

else ans=min_(qry(i<<1|1,x,id),ans);

return ans;

}void get_ans(int x)

signed main()

; for(int i=1;i<=n;++i) lsh[++num]=pot[i].xl,lsh[++num]=pot[i].xr;

sort(lsh+1,lsh+num+1);

int k=unique(lsh+1,lsh+num+1)-lsh;

for(int i=1;i<=n;++i)

num=0;for(int i=1;i<=n;++i) lsh[++num]=pot[i].yd,lsh[++num]=pot[i].yp;

sort(lsh+1,lsh+num+1);

k=unique(lsh+1,lsh+num+1)-lsh;

for(int i=1;i<=n;++i)

sort(pot+1,pot+n+1,cmp);

for(int i=1;i<=n;++i) vi[pot[i].xl].push_back(i),vo[pot[i].xr].push_back(i);

build(1,1,2*n);

for(int fa,i=1;i<=2*n;++i) }

int ans=0;

for(int i=n;i;--i)if(!vis[i])get_ans(i),ans+=f[i];

cout#define int long long

#define il inline

const int n=2e5+11;

const int mod=1e9+7;

struct vct_sta[n][20];

struct treetre[8409110];

bool fp[n];

signed q,n,k,a,b,p;

signed root[n],tot;

signed pr[n],num,top[n];

int c[n],d[n];

vectorvct[n];

int fm(int x,int y)

il int read()

void pre()

int qry(signed i,int l,int r,int l,int r)

signed main()

if(now)

sta[pri][++now]=;

top[pri]=now;

} }int ans=qry(root[n],1,1e5,n-k+1,n);

printf("%lld\n",ans);

for(int i=2;i<=q;++i)

return 0;

}

省選模擬5

每塊石頭都必須要踩一次,那麼不難發現讓最便宜的青蛙踩盡量多的距離超過d的石頭,而其他青蛙盡量跳,跳不過去了直接從1跳到n一定最優。所以只要判斷出最多可以讓多少只青蛙跳過去即可,二分即可。然而沒有開long long 100 0。暴力將伯努利數代入即可。前兩天做了一道插值讓我一直以為這道題是插值,然而...

省選模擬5 題解

因為每個青蛙都可以一步跳到終點。所以二分幾個青蛙可以無消耗跳到終點,只要讓最貴的幾個青蛙跳過去。之後特判一下乙個青蛙都跳不過去的情況就好了。伯努利數練習題。不斷的把自然數冪和用伯努利數展開,順便二項式展開一下就好了。另外分析可知原式可以化為乙個多項式的形式,所以通過插值也可以求出。考慮維護sam中每...

省選模擬5 總結

改題 t3 真的改到自閉。第一眼錯覺是網路流,但是在每個石頭,站不同青蛙時跳躍的代價不同,就不太能了。這題其實和之前noip模擬16的那個青蛙題有點像,只不過這題加了代價。首先乙個性質是 對於乙個青蛙,如果他一心想跳到對面 即不考慮踩光石頭 最優是不花費,要不然只花一次就過去。那麼我們可以看看所有石...