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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2.17模拟总结

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

前言

day13
期望:100+100+50=250
實際:100+50+50=200
rnk1

好耶awa
但是感覺這幾天似乎打比賽的人越來越少,好幾個霸榜怪都走了。
所以這個rnk1含金量其實也很低。

昨晚睡得比較早,雖然上午自己沒有直觀感受到,但從結果來看還是很有用的。
以后還是要做早睡的好孩子

T2是逃考原題,然而半平面交寫掛,真行。
又一次由于忘了板子掛分,看來以后的大考前復習板子還是很有必要的。

題目解析

字符匹配(string)

這個題考場上出正解出的還是挺快的,也是差不多8:30左右。
但是由于前幾天掛分給我掛怕了,明明9:00就寫完了,拍來拍去磨磨唧唧愣是到了9:40才交,有點浪費時間了,導致T2T3時間有點不足。

我的做法:
枚舉0-9,單獨考慮。若s1當前位可以匹配,則視為1,不能匹配視為0;s2當前位就是枚舉這個數字視為1,不是視為0。
那么一個區間和s1可以匹配就等價于每一位都有 s1>=s2。
換句話說,s2是1,s1必須是1,s2是0,s1可以選任意數。
于是就聯想到了通配符問題,把s2的0視為通配符,做NTT即可。
復雜度 O(Cnlog?n)O(Cn\log n)O(Cnlogn),C為字符集大小。
注意到正常乘三個多項式加起來的做法需要9次,ybt的老爺機可能會被卡常。由于每一位只有1或0,分析一下性質就能發現其實只需要乘一次就行,有一項和這個的值相等,另一個可以前綴和解決。

pdf做法:
和我的硬套模型相比,優美許多。
問題也可以看成一個區間匹配上的字符共有m個,這樣就將問題轉化為計數問題。
還是逐個數字考慮,若當前枚舉到 ccc,令 fif_ifi? 為 s1 的第 iii 位是否可以匹配 cccgi=[s2m?i+1==c]g_i=[s2_{m-i+1}==c]gi?=[s2m?i+1?==c] 。那么把這兩個函數卷起來,就可以對于每一個位置算出匹配的 ccc 字符有多少個。最后全加在一起即可。
復雜度也是 O(Cnlog?n)O(Cn\log n)O(Cnlogn)。

瞞天過海(sea)

逃考原題,但是看到原題時,我的心里卻泛不起一點的喜悅…
但是畢竟 100分也不能直接扔,還是硬著頭皮寫了。
一邊寫一邊回憶,最后少了一個彈隊首的關鍵 while 循環,淦。
其實我考場還想了想用不用,但覺得最后彈一次隊首就行了,我諤諤。

做過的題,思維含量也不太高,題解思路就不寫了。

染色任務(color)

有點科技題那種味道,沒有見過類似技巧的話可能比較難做出來。
考場上由于T1耽誤時間有點長,還剩兩個小時給T2T3,當時有點慌。
因為T2我預估至少是需要1h的,而且這個1h我若是11點開始寫一慌可能很難寫完…
于是這個題就根本沒想切,幾乎沒推什么性質,準備直接拿2-SAT拿50分走人了。
說實話這題要是讓我嘗試做的話,恐怕我就會不斷的尋找貪心之類的性質,死也不會想到正解就是2-SAT的。
沒有寫掛還不錯吧,寫的也比預想快一些。

2-SAT的瓶頸在于暴力連邊是 O(m2)O(m^2)O(m2) 的。
考慮如何優化連邊。
把邊權下放到深度大的節點上,那么一條路徑就可以看成標記了路徑上除了lca的所有節點。
而兩條路徑可以同時存在的充要條件是標記節點集合沒有交。

對于標記路徑,使用常見的樹剖+線段樹實現。
由于在線段樹上標記的節點的深度不同,因此一個選取方案合法等價于線段樹的所有返祖鏈上都至多只有一個標記點
這種:“至多只有一個成立/不成立”的問題,一個好用的技巧是前綴和優化

我們先放下線段樹,考慮一個簡單的問題,一個集合的所有點至多只有一個成立。
我們就要實現每個節點的1點都能走到其他所有節點的0點。
設點編號為 1...n1...n1...n,我們設兩排輔組點 a1...n,b1...na_{1...n},b_{1...n}a1...n?,b1...n?,然后連邊:
ai→ai+1,ai→0i,1i→ai+1a_i\to a_{i+1},a_{i}\to0_i,1_i\to a_{i+1}ai?ai+1?,ai?0i?,1i?ai+1?
bi+1→bi,bi→0i,1i→bi?1b_{i+1}\to b_{i},b_{i}\to0_i,1_i\to b_{i-1}bi+1?bi?,bi?0i?,1i?bi?1?

這樣就可以實現我們的目的。
這個方法到了樹上也是可以推廣的。只要每個兒子繼承父親節點的鏈尾即可。
標記共會下放 O(nlog?2n)O(n\log^2n)O(nlog2n) 個,邊數與其同階。
時空復雜度 O(nlog?2n)O(n\log^2n)O(nlog2n)。

代碼

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=8e5+100; const int mod=998244353; const int inf=1e9;inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res; }int n,m,k;int r[N],lim; void init(){int L=0;lim=1;while(lim<n+m+3) ++L,lim<<=1;for(int i=1;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));return; } void NTT(ll *x,int flag){for(int i=0;i<lim;i++) if(i<r[i]) swap(x[i],x[r[i]]);for(int l=1;l<lim;l<<=1){ll w=ksm(3,(mod-1)/(l<<1));if(flag==-1) w=ksm(w,mod-2);for(int st=0;st<lim;st+=(l<<1)){ll now=1;for(int i=0;i<l;i++,now=now*w%mod){ll u=x[st+i],v=now*x[st+i+l]%mod;x[st+i]=u+v>=mod?(u+v-mod):(u+v);x[st+i+l]=u-v<0?u-v+mod:u-v;}}}if(flag==-1){ll ni=ksm(lim,mod-2);for(int i=0;i<lim;i++) x[i]=x[i]*ni%mod;}return; } void mul(ll *a,ll *b,ll *c){NTT(a,1);NTT(b,1);for(int i=0;i<lim;i++) c[i]=a[i]*b[i]%mod;NTT(c,-1);return; }ll a[N],b[N],res[N],sum[N];int pre[N][10],suf[N][10],ans[N]; int s1[N],s2[N]; void work(int ch){fill(a,a+lim+1,0);fill(b,b+lim+1,0);fill(res,res+lim+1,0);for(int i=1;i<=n;i++){a[i]=(i-pre[i][ch]<=k||suf[i][ch]-i<=k);}for(int i=1;i<=m;i++){b[i]=(s2[i]==ch);}//printf("ch=%d\n",ch);//printf("a: ");for(int i=1;i<=n;i++){printf("%lld ",a[i]);}puts("");//printf("b: ");for(int i=1;i<=m;i++){printf("%lld ",b[i]);}puts("");mul(a,b,res);//printf("c: ");for(int i=1;i<=n;i++){printf("%lld ",res[i]);}puts("");for(int i=1;i<=m;i++) sum[i]=sum[i-1]+(s2[i]==ch);for(int i=1;i<=n+m;i++) res[i]=sum[min(m,i-1)]-res[i];//printf("res: ");for(int i=1;i<=n+m;i++){printf("%lld ",res[i]);}puts("");//printf("ok: ");for(int i=1;i<=n-m+1;i++){printf("%lld ",res[i+m]);}puts("");//puts("");for(int l=1;l<=n-m+1;l++) ans[l]&=(res[l+m]==0); }bool check(int l,int r){//printf("(%d %d)\n",l,r);for(int i=1;i<=m;i++){int c=s2[i],j=l+i-1;//printf(" i=%d j=%d c=%d dis=%d %d\n",i,j,c,j-pre[j][c],suf[j][c]-j);if(j-pre[j][c]>k&&suf[j][c]-j>k) return false;}//printf("%d\n",l);return true; }void bf(){int ans(0);for(int l=1,r=m;l<r;l++,r--) swap(s2[l],s2[r]);for(int l=1;l<=n-m+1;l++) ans+=check(l,l+m-1);printf("%d\n",ans);//debug("%lf ans=%d n=%d m=%d k=%d\n",1.0*clock()/CLOCKS_PER_SEC,ans,n,m,k);exit(0); }signed main(){freopen("string.in","r",stdin);freopen("string.out","w",stdout);n=read();m=read();k=read();init();for(int i=1;i<=n;i++) scanf("%1d",&s1[i]);for(int i=m;i>=1;i--) scanf("%1d",&s2[i]);for(int l=1;l<=n-m+1;l++) ans[l]=1;for(int i=0;i<=9;i++){pre[0][i]=-inf;suf[n+1][i]=inf;}for(int i=1;i<=n;i++){for(int j=0;j<=9;j++){pre[i][j]=(s1[i]==j)?i:pre[i-1][j];}}for(int i=n;i>=1;i--){for(int j=0;j<=9;j++){suf[i][j]=(s1[i]==j)?i:suf[i+1][j];}}if(1ll*m*(n-m+1)<=10000000){bf();return 0;}for(int i=0;i<=9;i++) work(i);int num(0);for(int i=1;i<=n-m+1;i++) num+=ans[i];printf("%d\n",num);//debug("%lf\n",1.0*clock()/CLOCKS_PER_SEC);return 0; } /* */

T2

#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=700; const int mod=998244353; const double eps=1e-10;int n,m,k; int w,h; bool jd=0;struct node{int to,nxt; }e[N*N]; int fi[N],cnt; inline void addline(int x,int y){e[++cnt]=(node){y,fi[x]};fi[x]=cnt;return; }struct V{double x,y; }p[N]; inline V operator + (const V &a,const V &b){return (V){a.x+b.x,a.y+b.y};} inline V operator - (const V &a,const V &b){return (V){a.x-b.x,a.y-b.y};} inline V operator * (const double &k,const V &a){return (V){k*a.x,k*a.y};} inline double operator * (const V &a,const V &b){return a.x*b.x+a.y*b.y;} inline double operator ^ (const V &a,const V &b){return a.x*b.y-b.x*a.y;} inline double len (const V &a){return sqrt(a.x*a.x+a.y*a.y);} inline V cui(const V &a){return (V){a.y,-a.x};}struct line{V a,d;int id; }; inline line build(double x,double y,double a,double b,int id){return (line){(V){x,y},(V){a,b},id}; } inline V jiaodian(const line &l1,const line &l2){double k=((l2.a-l1.a)^l2.d)/(l1.d^l2.d);return l1.a+(k*l1.d); }line l[N]; inline bool in(const line &l,const V &o){return (l.d^(o-l.a))>-eps; } bool cmp(line l1,line l2){double k1=atan2(l1.d.y,l1.d.x),k2=atan2(l2.d.y,l2.d.x);if(abs(k1-k2)>eps) return k1<k2;else return in(l2,l1.a); } void print(line l,int op=1){printf("[id=%d (%.2lf %.2lf) d=(%.2lf %.2lf)]",l.id,l.a.x,l.a.y,l.d.x,l.d.y);if(op) puts("");else putchar(' '); } V pt[N]; line q[N]; int st,ed; void halfplane(int now){int tot(0);l[++tot]=build(0,0,1,0,0);l[++tot]=build(w,0,0,1,0);l[++tot]=build(w,h,-1,0,0);l[++tot]=build(0,h,0,-1,0);for(int i=1;i<=n;i++){if(i==now) continue;l[++tot]=(line){0.5*(p[i]+p[now]),cui(p[now]-p[i]),i};if(!in(l[tot],p[now])) l[tot].d=((-1)*l[tot].d);}sort(l+1,l+1+tot,cmp);st=1;ed=0;for(int i=1;i<=tot;i++){if(i>1&&abs(l[i].d^l[i-1].d)<eps) continue;if(jd) {printf("\nadd: ");print(l[i],1);}while(st<ed&&!in(l[i],pt[ed])) --ed;while(st<ed&&!in(l[i],pt[st+1])) ++st;q[++ed]=l[i];if(st<ed) pt[ed]=jiaodian(q[ed-1],q[ed]);if(jd) for(int j=st;j<=ed;j++) print(q[j],j==ed);}while(st<ed&&!in(q[st],pt[ed])) --ed;if(jd) for(int j=st;j<=ed;j++) print(q[j],j==ed);for(int i=st;i<=ed;i++){addline(now,q[i].id);}return; } V o; int que[N],dis[N]; void bfs(){int id=1;for(int i=2;i<=n;i++){if(len(p[i]-o)<len(p[id]-o)) id=i;}if(jd) printf("id=%d\n",id);dis[id]=1;que[st=ed=1]=id;while(st<=ed){int now=que[st++];for(int i=fi[now];~i;i=e[i].nxt){int to=e[i].to;if(dis[to]) continue;dis[to]=dis[now]+1;que[++ed]=to;}}return; }signed main(){freopen("sea.in","r",stdin);freopen("sea.out","w",stdout);memset(fi,-1,sizeof(fi));cnt=-1;n=read();if(n==0){printf("0");return 0;}w=read();h=read();o.x=read();o.y=read();for(int i=1;i<=n;i++) p[i].x=read(),p[i].y=read();//halfplane(1);return 0;for(int i=1;i<=n;i++) halfplane(i);bfs();printf("%d\n",dis[0]-1);return 0; } /* */

T3

#include<bits/stdc++.h> using namespace std; #define ll 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 M=5e6+100; int inf=1e9;int n,m;vector<int>v[N]; struct node{int to,nxt; }p[M*7]; int fi[M],cnt; inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return; } int dep[N],dfn[M],pos[N],siz[N],hson[N],top[N],fa[N],tim; void dfs1(int x,int f){siz[x]=1;dep[x]=dep[f]+1;fa[x]=f;for(int to:v[x]){if(to==f) continue;dfs1(to,x);siz[x]+=siz[to];if(siz[to]>siz[hson[x]]) hson[x]=to;}return; } void dfs2(int x,int tp){top[x]=tp;dfn[++tim]=x;pos[x]=tim;if(hson[x]) dfs2(hson[x],tp);for(int to:v[x]){if(to==fa[x]||to==hson[x]) continue;dfs2(to,to);}return; } int id[N][2],tot,num,x[N],y[N];#define mid ((l+r)>>1) #define ls (k<<1) #define rs (k<<1|1) vector<int>pt[N<<2]; int a[N<<2],b[N<<2],lst[N<<2]; void add(int k,int l,int r,int x,int y,int w){if(x>y) return;//if(k==1) printf("add (%d %d) id=%d\n",x,y,w);if(x<=l&&r<=y){pt[k].push_back(w);return;}if(x<=mid) add(ls,l,mid,x,y,w);if(y>mid) add(rs,mid+1,r,x,y,w);return; } void solve(int k,int l,int r){for(int o:pt[k]){++tot;addline(tot,id[o][0]);if(a[k]) addline(a[k],tot);if(lst[k]) addline(id[lst[k]][1],tot);a[k]=tot;if(b[k]) addline(id[o][1],b[k]);++tot;addline(tot,id[o][0]);if(b[k]) addline(tot,b[k]);b[k]=tot;lst[k]=o;}if(l==r) return;lst[ls]=lst[k];a[ls]=a[k];b[ls]=b[k];solve(ls,l,mid);lst[rs]=lst[k];a[rs]=a[k];b[rs]=b[k];solve(rs,mid+1,r);return; }inline void ins(int x,int y,int id){//printf("\nins : x=%d y=%d\n",x,y);while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);add(1,1,n,pos[top[x]],pos[x],id);x=fa[top[x]];//printf("x=%d y=%d\n",x,y);}if(dep[x]<dep[y]) swap(x,y);//printf("x=%d y=%d\n",x,y);add(1,1,n,pos[y]+1,pos[x],id); }int zhan[M],low[M],col[M],tp; void tarjan(int x){zhan[++tp]=x;dfn[x]=low[x]=++tim;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(!col[to]) low[x]=min(low[x],dfn[to]);}if(low[x]==dfn[x]){col[x]=++tot;while(zhan[tp]!=x){col[zhan[tp--]]=tot;}tp--;}return; }int op[N]; signed main(){freopen("color.in","r",stdin);freopen("color.out","w",stdout);//printf("%d\n",sizeof(zhan)/1024/1024);n=read();for(int i=1;i<n;i++){int x=read(),y=read();v[x].push_back(y);v[y].push_back(x);}dfs1(1,0);dfs2(1,1);//for(int i=1;i<=n;i++) printf("i=%d top=%d pos=%d\n",i,top[i],pos[i]);//puts("");m=read();memset(fi,-1,sizeof(fi));cnt=-1;for(int i=1;i<=m;i++){++num;x[num]=read();y[num]=read();id[num][0]=++tot;id[num][1]=++tot;ins(x[num],y[num],num);++num;x[num]=read();y[num]=read();id[num][0]=++tot;id[num][1]=++tot;ins(x[num],y[num],num);addline(id[num-1][0],id[num][1]);addline(id[num][0],id[num-1][1]);addline(id[num-1][1],id[num][0]);addline(id[num][1],id[num-1][0]);}//puts("");//for(int i=1;i<=num;i++) printf("")solve(1,1,n);int S=tot;memset(dfn,0,sizeof(dfn));tim=0;for(int i=1;i<=S;i++){if(!dfn[i]) tarjan(i);}//assert(tot<N*30);//assert(cnt<N*30);for(int i=1;i<=num;i++){if(col[id[i][0]]==col[id[i][1]]){puts("NO");return 0;}op[i]=(col[id[i][1]]<col[id[i][0]]);}puts("YES");for(int i=1;i<=m;i++){if(op[2*i-1]) puts("1");else puts("2");}return 0; } /* 4 1 2 1 3 3 4 2 1 2 1 4 2 3 1 4YES 1 2 */

總結

今天還是不錯的,但是還是有掛分。
實踐告訴我們,要早睡!
明天加油awa

總結

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

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