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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2.14模拟总结

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

前言

節日快樂!

(逃)
day10
50pts
期望:10+30+20=60
實際:0+30+20=50
rnk11

徹徹底底的擺爛局了。
但是rnk竟然沒有太掉,所以我應該并不孤獨…
和KH并排坐在機房里,各自看著電腦,癡癡想著各自的心事,一坐就是三個小時。
半小時三題了屬于是
T1掛分是因為把題目描述的"連線"理解成了線段,但實際上是直線。
我不太確定還和KH統一了一下意見
個人感覺這個題意是真的很模糊,為什么不在比賽主頁強調而要在釘釘啊!誰比賽的時候還會看釘釘啊qwq
事實是我那個靠著毀天滅地的剪枝竟然能過30,我也是驚了。

題目解析

圓與連線(circle)

挺妙的題目。
其實沒有想像中那么難。
但完全沒有往這邊想過。
(而且題意都混淆不清)

考慮每個點落在圓上的兩個切點,其對應兩個旋轉角組成一個區間。兩個點可以同時存在的充要條件是其對應的區間相交且不包含。
然后就變成了線段問題,先按照左端點排序,然后暴力枚舉第一條線段,把所有與它合法相交的線段提出來,拿右端點直接做一個最長上升子序列就行了。
(好久沒寫隊列的最長上升子序列了,竟然莫名其妙的有些懷念)

轉移石子(rock)

都叫它模擬費用流,但個人感覺這更像反悔貪心吧…
其實我考場上的大方向是對的,但是這個反悔沒太整明白。
關鍵是給每配一對的權值加個-inf,這樣就自然而然的保證必然會選滿。
然后就是嘗試在LCA處合并,并將反悔元素重新插入。
討論一下幾個深度的大小關系就可以得出,配對后兩個反悔元素同時選取必然是不優的,所以不必擔心同時取式子出bug的問題。(個人認為題解這個地方的講解十分草率)

藏寶地圖(treasure)

神仙掃描線dp。
完全沒有往這方面想過…由于看到連通塊一共只有 O(k)O(k)O(k) 個,所以一直以為是數據結構題,瘋狂嘗試建 k 棵樹套樹。
這個題最妙的地方應該就是對于障礙的處理了,通過奇技淫巧避免了十分麻煩的上下轉移,確實十分巧妙。
一個細節問題是要注意障礙要先加后刪。

代碼

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; } void write(ll x){if(x>9) write(x/10);putchar('0'+x%10); } const int N=2e3+100; const double pai=acos(-1.0); const double eps=1e-10;int n,m; int r; int x[N],y[N]; struct line{double x,y;bool operator < (const line oth)const{return abs(x-oth.x)>eps?x<oth.x:y<oth.y;} }l[N]; int ans; double a[N],q[N]; int tot,num; int f=0; void calc(){num=0;for(int i=1;i<=tot;i++){if(!num||a[i]>q[num]-eps) q[++num]=a[i];else{int st=1,ed=num;while(st<ed){int mid=(st+ed)>>1;if(q[mid]>a[i]-eps) ed=mid;else st=mid+1;}q[st]=a[i];}//printf("i=%d num=%d\n",i,num);}ans=max(ans,num);if(f){for(int i=1;i<=tot;i++) printf("%lf ",a[i]);printf("\nnum=%d\n\n",num);} }signed main(){//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);n=read();r=read();for(int i=1;i<=n;i++){x[i]=read();y[i]=read();double g=atan2(y[i],x[i]),d=acos(1.0*r/sqrt(x[i]*x[i]+y[i]*y[i]));l[i].x=g-d;l[i].y=g+d;if(l[i].x<-pai) l[i].x+=2*pai;if(l[i].y>pai) l[i].y-=2*pai;if(f) printf("(%lf %lf)\n",l[i].x/pai,l[i].y/pai);if(l[i].x>l[i].y) swap(l[i].x,l[i].y);} if(f) puts("");sort(l+1,l+1+n);if(f) for(int i=1;i<=n;i++) printf("(%lf %lf)\n",l[i].x,l[i].y);for(int now=1;now<=n;now++){a[tot=1]=l[now].y;for(int i=now+1;i<=n&&l[i].x<l[now].y+eps;i++){if(l[i].y>l[now].y-eps) a[++tot]=l[i].y;}calc();}printf("%d\n",ans);return 0; } /* */

T2

#include<bits/stdc++.h> #include<ext/pb_ds/priority_queue.hpp> 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; } void write(ll x){if(x>9) write(x/10);putchar('0'+x%10); } const int N=3e5+100; const int M=2e6+100; const double pai=acos(-1.0); const ll inf=1e12;int n,m; int dis[M],ls[M],rs[M]; ll val[M],tot,rub[M],num; inline int New(ll v){int now=num?rub[num--]:++tot;val[now]=v;ls[now]=rs[now]=0;dis[now]=0;//printf(" New: now=%d v=%lld\n",now,v);return now; } int merge(int x,int y){if(!x||!y) return x|y;if(val[x]>val[y]) swap(x,y);rs[x]=merge(rs[x],y);if(dis[rs[x]]>dis[ls[x]]) swap(ls[x],rs[x]);dis[x]=dis[rs[x]]+1;return x; } inline ll top(int &x,int op=0){if(!x) return 1e18;ll res=val[x];if(op) rub[++num]=x,x=merge(ls[x],rs[x]);return res; } struct node{int to,nxt,w; }p[N<<1]; int fi[N],cnt; inline void addline(int x,int y,int w){p[++cnt]=(node){y,fi[x],w};fi[x]=cnt; } ll dep[N]; __gnu_pbds::priority_queue<ll,greater<ll>>a[N],b[N]; int xx[N],yy[N]; ll ans,S; void dfs(int x,int f){for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dep[to]=dep[x]+p[i].w;dfs(to,x);a[x].join(a[to]);b[x].join(b[to]);}//printf("\ndfs: x = %d\n",x);int o=min(xx[x],yy[x]);xx[x]-=o;yy[x]-=o;S-=o;if(xx[x]){for(int i=1;i<=xx[x];i++){//printf(" ins A: %lld\n",dep[x]);a[x].push(dep[x]);}}else if(yy[x]){//printf(" ins B: %lld\n",dep[x]-inf);for(int i=1;i<=yy[x];i++){b[x].push(dep[x]-inf);}}//printf(" a=%d topa=%lld b=%d topb=%lld\n",a[x],top(a[x]),b[x],top(b[x]));while(!a[x].empty()&&!b[x].empty()){ll u=a[x].top(),v=b[x].top();if(u+v-2*dep[x]>=0) break;ans+=u+v-2*dep[x];a[x].pop();b[x].pop();a[x].push(-v+2*dep[x]);b[x].push(-u+2*dep[x]);}return; }signed main(){//freopen("rock.in","r",stdin);//freopen("rock.out","w",stdout);memset(fi,-1,sizeof(fi));cnt=-1;dis[0]=-1;n=read();for(int i=1;i<n;i++){int x=read(),y=read(),w=read();//printf("(%d %d %d)\n",x,y,w);addline(x,y,w);addline(y,x,w);}for(int i=1;i<=n;i++) xx[i]=read(),yy[i]=read(),S+=yy[i];dfs(1,0);printf("%lld\n",ans+S*inf);return 0; } /* */

T3

#include<bits/stdc++.h> #include<ext/pb_ds/priority_queue.hpp> 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; } void write(ll x){if(x>9) write(x/10);putchar('0'+x%10); } const int N=1e6; const ll inf=1e12;int n,m; int o=1e6;#define mid ((l+r)>>1) #define ls (k<<1) #define rs (k<<1|1) int tr[N<<2],laz[N<<2]; inline void pushup(int k){tr[k]=tr[ls]+tr[rs]; } inline void tag(int k){tr[k]=0;laz[k]=0;return; } inline void pushdown(int k){if(laz[k]!=-1){laz[k]=-1;tag(ls);tag(rs);}return; } int ask(int k,int l,int r,int x,int y){if(x>y) return 0;if(x<=l&&r<=y) return tr[k];pushdown(k);int res(0);if(x<=mid) res+=ask(ls,l,mid,x,y);if(y>mid) res+=ask(rs,mid+1,r,x,y);return res; } void add(int k,int l,int r,int p,int w){if(l==r){tr[k]+=w;return;}pushdown(k);if(p<=mid) add(ls,l,mid,p,w);else add(rs,mid+1,r,p,w);pushup(k);return; } void clear(int k,int l,int r,int x,int y){if(x<=l&&r<=y){tag(k);return;}pushdown(k);if(x<=mid) clear(ls,l,mid,x,y);if(y>mid) clear(rs,mid+1,r,x,y);pushup(k); }//0:block //1:treasure //2:query struct ope{int op,f;int x,y,id;int l,r;bool operator < (const ope oth)const{if(y!=oth.y) return y>oth.y;else if(op!=oth.op) return op<oth.op;else return f>oth.f;} }q[N<<1]; int tot; int val[N],ans[N];multiset<int>s; multiset<int>::iterator it;signed main(){//freopen("treasure.in","r",stdin);//freopen("treasure.out","w",stdout); o+=2;memset(laz,-1,sizeof(laz));m=read();for(int i=1;i<=m;i++){int a=read(),b=read(),c=read(),d=read();++a;++b;++c;++d;q[++tot]=(ope){0,1,0,d,i,a,c};q[++tot]=(ope){0,-1,0,b-1,i,a,c};}m=read();for(int i=1;i<=m;i++){int x=read(),y=read();++x;++y;q[++tot]=(ope){1,0,x,y,0,0,0};}n=read();for(int i=1;i<=n;i++){int x=read(),y=read();++x;++y;q[++tot]=(ope){2,0,x,y,i,0,0};}sort(q+1,q+1+tot);s.insert(o);for(int i=1;i<=tot;i++){if(q[i].op==0){int l=q[i].l,r=q[i].r,id=q[i].id,ed=(*s.lower_bound(q[i].l));if(q[i].f==1){s.insert(l-1);s.insert(r);int res=ask(1,1,o,l,ed);val[id]=ask(1,1,o,r+1,ed);clear(1,1,o,l,r);add(1,1,o,l-1,res);}else{s.erase(s.find(l-1));s.erase(s.find(r));add(1,1,o,l-1,-val[id]);clear(1,1,o,l,r);}}else if(q[i].op==1) add(1,1,o,q[i].x,1);else{int pos=q[i].x;int ed=(*s.lower_bound(pos));ans[q[i].id]=ask(1,1,o,pos,ed);}}for(int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0; } /*1 3*/

總結

昨天:“現在大部分題目基本上考場上都能想到正確的方向了”
今天就直接兩道題完全抓瞎…
《天 高 地 厚》
就這考試也有人AK是我沒想到的。
收下我的膝蓋!

明天加油吧!awa

總結

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

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