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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces round 1098

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

Div1 530

  • 感受到被Div1支配的恐懼了.jpg
  • 真·一個題都不會.jpg(雖然T1是我智障
  • 感受到被構造題支配的恐懼了.jpg

A

直接樹上貪心就行,是我寫錯了.jpg

B

這個構造超級神仙有沒有.jpg

給定的答案矩陣一定滿足,每一行或者每一列只有兩種不同的字符交替出現

然后枚舉+貪心即可...

C

被老K Diss了.jpg

這題給人的第一印象就是一個非常智障的構造。

然后發現它還有要求...每個節點的度數最大值最小...

然后就不會了.jpg

(開什么玩笑,怎么可能不會!

然后就可以通過枚舉這個最大值的方式解決,然后剩下的就直接連在某個點上來滿足它的要求...

具體實現看代碼吧...有點說不清

總之就是一個$K$叉樹+一條鏈...

#include <bits/stdc++.h> using namespace std; #define N 100005 #define ll long long int fa[N],n,p;ll now,a[N]; int main() {scanf("%d%lld",&n,&now);if(now*2>(ll)n*(n+1))return puts("No"),0;if(now<n*2-1)return puts("No"),0;for(p=1;p<=n;p++){long long dep=1,cnt=1,t=1,c=1;while(cnt<n)c=c*p,dep++,t+=dep*min(c,n-cnt),cnt+=c;if(t<=now)break;}puts("Yes");long long dep=1,cnt=1,t=1,c=1;a[1]=1;while(cnt<n){dep++;c=c*p;a[dep]=min(c,n-cnt);t+=dep*min(c,n-cnt),cnt+=c;}now-=t;long long now_d=dep,aft_d=dep+1;while(now){if(a[now_d]<=1)now_d--;a[now_d]--;ll tmp=min(aft_d++,now_d+now);now-=tmp-now_d;a[tmp]++;}int lst=1;for(int i=2;i<aft_d;i++){int nowp=lst-a[i-1]+1,nowk=0;// printf("%lld\n",a[i]);for(int j=lst+1;j<=lst+a[i];j++){if(nowk==p)nowp++,nowk=0;nowk++,fa[j]=nowp;}lst+=a[i];}for(int i=2;i<=n;i++)printf("%d ",fa[i]);puts(""); } //sdadasdasd

D

這個讀題殺啊...

根本讀不懂啊.jpg

讀懂了就是維護一個動態前綴和來求滿足這個式子$sum_{i-1}\times 2\le a_i$的$i$的數量.jpg

那么顯然,答案小于$30$

然后就直接樹狀數組+set即可...

每次找到$\min {a_i}$然后每次翻倍去找+樹狀數組查前綴和.jpg

就是慢了點.jpg

#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <queue> #include <iostream> #include <bitset> #include <set> using namespace std; #define N 500005 #define ll long long int w[N],p[N],n,sp;char str[10]; multiset<int >s;int siz;ll c[N]; void fix(int x,int v){for(;x<=sp;x+=x&-x)c[x]+=v;} ll find(int x){ll ret=0;for(;x;x-=x&-x)ret+=c[x];return ret;} void add(int x){siz++;s.insert(p[x]);fix(x,p[x]);} void del(int x){siz--;s.erase(s.find(p[-x]));fix(-x,-p[-x]);} int get_ans() {if(!siz)return 0;int ret=1,now=*s.begin();while(1){if(now>1e9)break;if(s.upper_bound(now<<1)!=s.end()){int t=*s.upper_bound(now<<1);t=lower_bound(p+1,p+sp+1,t)-p;if(find(t-1)*2<p[t])ret++;now=p[t]+now;}else return siz-ret;}return siz-ret; } int main() {scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%s%d",str,&p[i]),(str[0]=='+'?(w[i]=p[i]):(w[i]=-p[i]));sort(p+1,p+n+1);sp=unique(p+1,p+n+1)-p-1;for(int i=1;i<=n;i++)w[i]=(w[i]<0)?-(lower_bound(p+1,p+sp+1,-w[i])-p):lower_bound(p+1,p+sp+1,w[i])-p;for(int i=1;i<=n;i++)if(w[i]<0)del(w[i]),printf("%d\n",get_ans());else add(w[i]),printf("%d\n",get_ans()); } // dasdasd

轉載于:https://www.cnblogs.com/Winniechen/p/10352603.html

總結

以上是生活随笔為你收集整理的Codeforces round 1098的全部內容,希望文章能夠幫你解決所遇到的問題。

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