因為只有包含關係和不相交關係,就可以根據包含關係\(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的那個青蛙題有點像,只不過這題加了代價。首先乙個性質是 對於乙個青蛙,如果他一心想跳到對面 即不考慮踩光石頭 最優是不花費,要不然只花一次就過去。那麼我們可以看看所有石...