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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2.19模拟总结

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.19模拟总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

期望:100+35+20=155
實際:0+35+20
rnk22
掛大分,哈哈。
對拍和正解一起寫掛可太行了。

題目解析

烤肉時刻(barbeque)

之前做過的題。
然而最簡單的不翻面的轉移斜掛可太行了。

序列選取(sequence)

一直以為會是雙端dfs。
然而并沒有什么思路…

正解挺神奇的。
考慮從小往大考慮元素。
iii 時,<i<i<i 的元素都是等價的了,由這些元素組成的連續段中,我們只關注每段選了幾個元素,而不關心具體選了哪些。
所以可以按照這個狀壓。轉移過程中還要重新解碼、編碼,有些惡心。
而且這樣直接寫復雜度還過不去,只有70,可能內層不能 O(段數)O(段數)O() ,必須得 O(1)O(1)O(1)
似乎也可以做到,但寫起來太太太惡心了…

序列排序(sequence)

毒瘤數據結構題。
一直以為是分塊或者珂朵莉樹,完全不是,哈哈。

考慮樹套樹,平衡樹套權值線段樹。
需要線段樹分裂、合并等。
根本寫不出來

代碼

T1

#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) #define ok debug("OK\n") inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } const int N=2e5+100; const int mod=998244353; const int inf=1e9;int n,m;int f[2][N][2],now,pre; struct node{int l,r;bool operator < (const node oth)const{return l<oth.l;} }p[N]; int q[N],st,ed;signed main(){freopen("barbecue.in","r",stdin);freopen("barbecue.out","w",stdout);n=read();m=read();for(int i=1;i<=m;i++) p[i].l=read(),p[i].r=read();p[++m]=(node){2*n,2*n};sort(p+1,p+1+m);memset(f,0x3f,sizeof(f));f[1][0][1]=0;now=1;//f[1][0][0]=0for(int k=1;k<=m;k++){//printf("\n------------\nk=%d (%d %d)\n",k,p[k].l,p[k].r);swap(now,pre);memset(f[now],0x3f,sizeof(f[now]));int d=p[k].r-p[k-1].r;for(int i=0;i<=n;i++){f[now][i][0]=f[pre][i][0];if(i+d<=n) f[now][i+d][1]=f[pre][i][1];}int l=p[k].l-p[k-1].r,r=p[k].r-p[k-1].r;st=1;ed=0;//printf("one time : 1->0 (%d %d)\n",l,r);for(int i=0;i<=n;i++){//one time : 1->0while(st<=ed&&i-q[st]>r) ++st;if(i-l>=0){int o=i-l;while(st<=ed&&f[pre][q[ed]][1]>=f[pre][o][1]) --ed;q[++ed]=o;}if(st<=ed) f[now][i][0]=min(f[now][i][0],f[pre][q[st]][1]+1);//printf(" i=%d (%d %d) j=%d f=%d pre=%d\n",i,st,ed,q[st],f[now][i][0],f[pre][q[st]][1]);}l=0,r=p[k].r-p[k].l;st=1,ed=0;for(int i=0;i<=n;i++){//one time : 0->1while(st<=ed&&i-q[st]>r) ++st;if(i-l>=0){int o=i-l;while(st<=ed&&f[pre][q[ed]][0]>=f[pre][o][0]) --ed;q[++ed]=o;}if(st<=ed) f[now][i][1]=min(f[now][i][1],f[pre][q[st]][0]+1);}l=p[k].l-p[k-1].r,r=p[k].r-p[k-1].r;st=1,ed=0;for(int i=0;i<=n;i++){//two time : 1->0->1while(st<=ed&&i-q[st]>r) ++st;if(i-l>=0){int o=i-l;while(st<=ed&&f[pre][q[ed]][1]>=f[pre][o][1]) --ed;q[++ed]=o;}if(st<=ed) f[now][i][1]=min(f[now][i][1],f[pre][q[st]][1]+2);}l=0,r=p[k].r-p[k].l;st=1,ed=0;for(int i=0;i<=n;i++){//two time : 0->1->0while(st<=ed&&i-q[st]>r) ++st;if(i-l>=0){int o=i-l;while(st<=ed&&f[pre][q[ed]][0]>=f[pre][o][0]) --ed;q[++ed]=o;}if(st<=ed) f[now][i][0]=min(f[now][i][0],f[pre][q[st]][0]+2);}//for(int i=0;i<=n;i++){//for(int o=0;o<=1;o++) printf(" i=%d op=%d f=%d\n",i,o,f[now][i][o]);//}}int ans=min(f[now][n][0],f[now][n][1]);if(ans>1e9) puts("NO");else{puts("YES");printf("%d\n",ans);}return 0; } /* #include<bits/stdc++.h> using namespace std; #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) const int N=2e6+100; const int mod=1e9+7; inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }#define r rand()int n,m;int fa[N]; int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} vector<int>v[N]; void dfs(int x,int f){fa[x]=f;for(int to:v[x]){if(to==f) continue;dfs(to,x);}return; } int tp[10]={0,10,50,100,500,1000}; set<int>s; signed main(signed int argc, char * argv[]){ #ifndef ONLINE_JUDGEfreopen("a.in","w",stdout);//freopen("a.out","w",stdout); #endifsrand(time(0)*1000);int o=tp[rand()%5+1];n=2000;m=rand()%o+1;while(m--) s.insert(rand()%(n+1));m=s.size()/2;printf("%d %d\n",n/2,m);int clo(0);for(int x:s){printf("%d ",x);++clo;if(clo%2==0) puts("");if(clo==m*2) break;}return 0; } /* 10 1 3 2 0 -2 -1 -5 4 1 -5 1 -2 3 1 1 -1 1 -2 -5 -3 3*/

T2

#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }const int N=5e6+100; const int mod=1e9+7;int n;int a[50],bel[50][50],up[50][50],len[50][50],num[50],pai[50],pos[50],pl[50]; void decode(int k,int s,int *x){for(int i=1;i<=num[k];i++){x[i]=(i==num[k])?s:s%(len[k][i]+1);s/=(len[k][i]+1);} return; } int code(int k,int *x){int res(0);for(int i=num[k];i>=1;i--) res=res*(len[k][i]+1)+x[i];return res; }int cnt[50],ncnt[50]; ll mn[2][N],tot[2][N],now,pre; inline void update(int s,int ns){if(mn[now][ns]>mn[pre][s]){mn[now][ns]=mn[pre][s];tot[now][ns]=tot[pre][s];}else if(mn[now][ns]==mn[pre][s]){tot[now][ns]+=tot[pre][s];}return; }inline int calc(int x){int res(0);while(x){++res;x-=x&-x;}return res; } int ans[55],res[55]; signed main(){freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);n=read();for(int i=1;i<=n;i++) a[i]=read();for(int k=1;k<=n+1;k++){pl[a[k]]=k;for(int i=1;i<=n;i++){if(a[i]==k) pos[k]=num[k];if(a[i]>=k) continue;if(i==1||a[i-1]>=k) ++num[k];bel[k][i]=num[k];len[k][num[k]]++;}pai[k]=1;for(int i=1;i<=num[k];i++) pai[k]*=(len[k][i]+1);//for(int i=1;i<=n;i++) printf("%d ",bel[k][i]);puts("");}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){up[k][bel[k][i]]=bel[k+1][i];}//for(int i=1;i<=num[k];i++) printf("%d ",up[k][i]);puts(""); }mn[1][0]=0;tot[1][0]=1;now=1;for(int k=0;k<n;k++){swap(now,pre);memset(mn[now],0x3f,sizeof(mn[now]));memset(tot[now],0,sizeof(tot[now]));//printf("\n--------------\nk=%d\n",k);for(int s=0;s<=pai[k+1];s++){//printf(" s=%d mn=%lld\n",s,mn[pre][s])if(mn[pre][s]>1e9) continue;decode(k+1,s,cnt);//printf("cnt: ");for(int i=1;i<=num[k+1];i++) printf("%d ",cnt[i]);puts("");for(int i=1;i<=num[k+2];i++) ncnt[i]=0;for(int i=1;i<=num[k+1];i++) ncnt[up[k+1][i]]+=cnt[i];//printf("ncnt: ");for(int i=1;i<=num[k+1];i++) printf("%d ",ncnt[i]);puts("");int ns=code(k+2,ncnt);update(s,ns);int w(0);for(int i=1;i<=pos[k+1];i++) w+=cnt[i];ncnt[bel[k+2][pl[k+1]]]++;mn[pre][s]+=w;//printf("ncnt: w=%d ",w);for(int i=1;i<=num[k+1];i++) printf("%d ",ncnt[i]);puts("");ns=code(k+2,ncnt);update(s,ns);//puts("");}}for(int i=1;i<=n;i++) printf("%lld %lld\n",mn[now][i],tot[now][i]); } /* 6 3 1 4 6 2 5 */

總結

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

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