FOI冬令营 Day 3
生活随笔
收集整理的這篇文章主要介紹了
FOI冬令营 Day 3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- T1、簽到題(sort)
- 傳送門
- Code
- T2、送分題(queue)
- 傳送門
- Code
- T3、簡單題(game)
- 傳送門
- Code
- 咕咕咕
T1、簽到題(sort)
傳送門
原題:LOJ 2767
Code
//2019/2/14 //50pts #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } #define MN 1000005 int n,q,a[MN],pw2[35]; int d[MN][35];bool r[MN]; inline void solve() {register int i,j;memset(r,0,sizeof r);int ret=0;r[n]=true;for(i=30;~i;--i){int ans=-1;for(j=1;j<=n;){if(r[j]){++j;continue;}int hr=d[j][i],k;for(k=j+1;!r[k-1]&&d[k][i]==hr;++k);if(r[k-1]){j=k;continue;}int tl=d[k][i],l;for(l=k+1;!r[l-1]&&d[l][i]==tl;++l);if(!r[l-1]) {puts("-1");return;}j=l;if(hr>tl){if(ans==-1) ans=1;if(ans==0) {puts("-1");return;}}else{if(ans==-1) ans=0;if(ans==1) {puts("-1");return;}}r[k-1]=true;}if(ans==1) ret+=pw2[i]; }printf("%d\n",ret); } int main() {freopen("sort.in","r",stdin);freopen("sort.out","w",stdout);n=read();register int i,S,ans,j;pw2[0]=1;for(i=1;i<=30;++i) pw2[i]=pw2[i-1]<<1;for(i=1;i<=n;++i) a[i]=read();for(i=1;i<=n;++i) for(S=a[i],j=0;S>0;++j,S>>=1) d[i][j]=S&1;solve();q=read();register int p,val;while(q--){p=read();val=read();memset(d[p],0,sizeof d[p]);for(i=0;val>0;++i,val>>=1) d[p][i]=val&1;solve();}return 0; }T2、送分題(queue)
原題:LOJ 2734 / 洛谷 如廁計劃
傳送門
Code
/*我們先考慮怎樣的序列是滿足條件的。不難發現,對于男生=女生的情況顯然每次都是一男一女如廁,充要條件是,對于任何一個后綴,男生<=女生,這很顯然而對于男生<女生的情況顯然是無解的對于女生>男生的情況,我們可以把多出來的女生變成男生,使他滿足上面的條件我們可以從頭開始往后掃,只要當前位是女生,且往后的女生>男生,就把這個女生變成男生不難發現,滿足條件的序列就是,對于任何一個后綴,男生<=女生換言之,就是從后往前的第i個女生的位置應該在從后往前的第2i個位置之后(不包括第2i個位置)從后往前掃,如果當前第i個女生的位置不對,就把她移到第2i個位置上,這樣貪心很正確假設第i個女生和2i匹配,那么ans=max{Val_i=pos_i-2i}對每個復讀串(設當前的長度為x,女生數為y)分別處理,那么每復讀一次,每個女生的 Val值減少2y-x所以,如果2y-x>0只需考慮第一個復讀串如果2y-x<0,只需考慮最后一個復讀串當然如果已經考慮到了第n個女生,之后的女生Val<0,就不用再掃啦2019/2/14 題解寫于2019/2/15 12:43 */ #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline ll read() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } #define MN 100005 std::string s[MN]; ll n,m,l,ans,x[MN]; void solve(std::string &s,int siz) {for(int i=siz;i--;--l)if(s[i]=='F'&&n) --n,ans=max(ans,2*n+1-l); } int main() {freopen("queue.in","r",stdin);freopen("queue.out","w",stdout);register int i,j,y;n=read(),m=read();l=n<<1;for(i=1;i<=m;++i) std::cin>>s[i],x[i]=read();for(i=m;i;--i){register int siz=s[i].size();for(j=y=0;j<siz;++j) y+=s[i][j]=='F';if((y<<1)-siz>=0){solve(s[i],siz);l-=(x[i]-1)*siz;n-=(x[i]-1)*y;if(n<=0)break;}else{l-=(x[i]-1)*siz;n-=(x[i]-1)*y;solve(s[i],siz);if(n<=0) break; }}return 0*printf("%lld\n",n>0?-1:ans); }T3、簡單題(game)
傳送門
原題:LOJ 2731
Code
咕咕咕
Blog來自PaperCloud,未經允許,請勿轉載,TKS!
轉載于:https://www.cnblogs.com/PaperCloud/p/10386177.html
總結
以上是生活随笔為你收集整理的FOI冬令营 Day 3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来学习ansibie(1)
- 下一篇: 民生微医联名信用卡年费是多少?怎么免年费