Codeforces round 1098
生活随笔
收集整理的這篇文章主要介紹了
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(""); } //sdadasdasdD
這個讀題殺啊...
根本讀不懂啊.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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode算法题库】Day5:R
- 下一篇: DDoS攻击惯犯图鉴