日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【arc101】比赛记录

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【arc101】比赛记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  這場還好切出了D,rt應該能漲,然而這場的題有點毒瘤,700分的D沒多少人切,更別說EF了。(暴打出題人)既然這樣,干脆就水一篇博客,做個簡單的比賽記錄。

C - Candles

  這題是一道一眼題,花了大約30s看懂題意,然后就想到做法開始敲。

  首先先把蠟燭的坐標從小到大排序,我們要點亮的蠟燭一定在一個區間里,因此若我們要點亮區間$ [i,i+k) $的蠟燭我們可以這么走:先走到蠟燭$ i $和$ i-k+1 $中較近的一根,然后再走向另一根,并把途徑的蠟燭全部點亮。這樣的花費是$?\min(|x_i|,|x_{i+k-1}|)+x_{i+k-1}-x_i $。于是掃一遍順便維護最小值答案即可。

  然而我因為括號有點多,敲錯了一個傻逼錯誤,調了快10min才調出來。。QAQ

代碼:(時間復雜度$ O(n \log(n)) $)

#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> #include<algorithm> #include<queue> #include<vector> #include<map> #define ll long long #define ull unsigned long long #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define lowbit(x) (x& -x) #define mod 1000000007 #define inf 0x3f3f3f3f #define eps 1e-18 #define maxn 1000010 inline ll read(){ll tmp=0; char c=getchar(),f=1; for(;c<'0'||'9'<c;c=getchar())if(c=='-')f=-1; for(;'0'<=c&&c<='9';c=getchar())tmp=(tmp<<3)+(tmp<<1)+c-'0'; return tmp*f;} inline ll power(ll a,ll b){ll ans=1; for(;b;b>>=1){if(b&1)ans=ans*a%mod; a=a*a%mod;} return ans;} inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;} using namespace std; int a[maxn]; int n,k; int main() {n=read(); k=read();for(int i=1;i<=n;i++)a[i]=read();sort(a+1,a+n+1); // for(int i=1;i<=n;i++)printf("%d %d\n",i,a[i]);int ans=inf;for(int i=k;i<=n;i++)ans=min(ans,min(abs(a[i]),abs(a[i-k+1]))+a[i]-a[i-k+1]);printf("%d\n",ans);return 0; } arc101C

?

D - Median of Medians

  感覺我思想江化了,總是在想怎么快速求出以某個數為中位數的區間個數,推了一堆式子也沒搞出來。最后看到hjw巨佬一句“二分答案”,方如醍醐灌頂地想出了解法。(orzhjw!!!)

  首先我們先二分最后序列的中位數。設$ tot $為中位數$>= mid $的區間個數,若中位數序列的中位數$>= mid $,則有$?tot>=\lfloor \frac{n(n+1)}{4} \rfloor $。

  那么如何求$ tot $?

  我們另外構造一個序列$ b $,當$ a_i>=mid $時$ b_i=1 $,否則?$ b_i=-1 $。那么若區間$ [l,r] $的中位數$ >= mid $,則有$ \sum_{i=l}^{r} b_i>mid $,于是我們求出序列$ b $的前綴和序列$ sum $,那么問題就變成了求滿足$ l<r $且$ sum[r]-sum[l]>=0 $的數對$ (l,r) $數量$ (0<=l,r<=n) $,這個問題可以用與求逆序對數量相似的方法解決。蒟蒻我就直接上樹狀數組了。

代碼:(時間復雜度$ O(n \log^2(n) $)

#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> #include<algorithm> #include<queue> #include<vector> #include<map> #define ll long long #define ull unsigned long long #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define lowbit(x) (x& -x) #define mod 1000000007 #define inf 0x3f3f3f3f #define eps 1e-18 #define maxn 100010 inline ll read(){ll tmp=0; char c=getchar(),f=1; for(;c<'0'||'9'<c;c=getchar())if(c=='-')f=-1; for(;'0'<=c&&c<='9';c=getchar())tmp=(tmp<<3)+(tmp<<1)+c-'0'; return tmp*f;} inline ll power(ll a,ll b){ll ans=1; for(;b;b>>=1){if(b&1)ans=ans*a%mod; a=a*a%mod;} return ans;} inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;} using namespace std; int bit[2*maxn]; int a[maxn]; int n; void add(int x,int k){for(;x<=2*n;x+=lowbit(x))bit[x]+=k;} int getsum(int x){int sum=0; for(;x;x-=lowbit(x))sum+=bit[x]; return sum;} int check(int mid) {for(int i=1;i<=2*n;i++)bit[i]=0;ll tot=0,sum=0;add(n,1);for(int i=1;i<=n;i++){sum+=(a[i]>=mid?1:-1);tot+=getsum(sum+n);add(sum+n,1);} // printf("%d %lld\n",mid,tot);return tot>=1ll*n*(n+1)/4; } int main() {n=read();int mx=-inf,mn=inf;for(int i=1;i<=n;i++){a[i]=read();mx=max(mx,a[i]); mn=min(mn,a[i]);}int l=mn,r=mx;while(l<r){int mid=(l+r+1)>>1;if(check(mid))l=mid;else r=mid-1;}printf("%d\n",l); } arc101D

?  

E - Ribbons on Tree

  以后填吧。。。

?

F - Robots and Exits

  同上。。。

轉載于:https://www.cnblogs.com/quzhizhou/p/9535597.html

總結

以上是生活随笔為你收集整理的【arc101】比赛记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。