手速狗從西安回來一隻渾渾噩噩,好不容易迎來一場送飯比賽體驗一把河南的優點,結果被高中生狂虐,無緣獎金。。個人獎品夢就這樣一次次被打破。。。。php
最後半小時lzq送(搶)來代碼,聽說只能翻轉一次,嗯,因而結合數據優點變成了shabi題,直接暴力模擬找最小值。函數
#define ll long long const ll inf=0x3f3f3f3f3f3f3f3f; ll a[10010]; ll solve(ll n,ll k) { ll i,j,ans=inf,len=min(k+1,n); if(!k) { ans=0; for(i=1; i<=n; i++) ans+=a[i]; return ans; } for(i=1; i<=len; i++) { ll sum=0; if((n-(i+k))%(2*k+1)>=(k+1)||(n-(i+k))%(2*k+1)<=0) { for(j=i; j<=n; j+=2*k+1) sum+=a[j]; ans=min(ans,sum); } } return ans; } int main() { ll n,k; while(scanf("%lld%lld",&n,&k)!=EOF) { ll i,j; for(i=1; i<=n; i++) scanf("%lld",&a[i]); printf("%lld\n",solve(n,k)); } return 0; }
B題dp題交給腿隊友吧。。優化
C -- 鹹魚魔法記ui
再次回想起錯失一血的痛苦,一個裸滑動窗(也稱尺取法)居然犯了個shibi錯誤T了三發,簡直石樂志。。。也許,啪,沒有也許,這不是差兩個小時的罰時錯失獎金的藉口。。spa
const int N=1e6+10; int a[N]; int main() { int n,k; while(~scanf("%d%d",&n,&k)) { a[0]=0; int x; for(int i=1; i<=n; i++) { a[i]=a[i-1]; scanf("%d",&x); if(!x) a[i]++; } int len=0,j=1;//比賽的時候把j定義在裏面,致使TLE。。石樂志 for(int i=1; i<=n; i++) { while(j<=n&&a[j]-a[i-1]<=k) j++; len=max(len,j-i); } printf("%d\n",len); } return 0; }
無奈改爲二分秒A。debug
const int N=3e5+10; int n,k,a[N]; int find(int len) { for(int i=len; i<=n; i++) if(a[i]-a[i-len]<=k) return 1; return 0; } int main() { while(~scanf("%d%d",&n,&k)) { a[0]=0; int x,len=0; for(int i=1; i<=n; i++) { scanf("%d",&x); a[i]=a[i-1]; if(!x) a[i]++; else len=1; } int l=0,r=n; while(l<=r) { int mid=(l+r)/2; if(find(mid)) { l=mid+1; len=mid; } else r=mid-1; } printf("%d\n",len); } return 0; }
D -- 鹹魚商店
code
再次膜腿隊友3s。這個題和之前作的一個01揹包+路徑打印很像,因而隊友改改我再debug一下A了。blog
推薦題: UVA624 - CD 01揹包+路徑打印ip
const int maxn=1e3+5; const double eps=1e-4; int n,m,k,a[maxn],d[maxn],v[maxn][maxn],b[maxn]; int ans; int judge(int mid) { memset(d,0,sizeof(d)); memset(v,0,sizeof(v)); for(int i=0; i<n; i++) { if(b[i]<mid) continue; for(int j=m; j>=a[i]; j--) { if(d[j]<d[j-a[i]]+b[i]) { d[j]=d[j-a[i]]+b[i]; v[i][j]=1; } } } if(d[m]>=k) { int Min=inf; for(int i=n,j=m; i>=0; i--)//找路徑中最小的價值 if(v[i][j]) { Min=min(Min,b[i]); j-=a[i];//推鍋:隊友把a[i]打成b[i]致使無腦RE。。。 } ans=max(ans,Min);//更新ans最大值 return 1; } else return 0; } int main() { while(~scanf("%d%d%d",&n,&m,&k)) { ans=-1; for(int i=0; i<n; i++) scanf("%d%d",&a[i],&b[i]); int l=0,r=1000010; while(l<=r) { int mid=(l+r)>>1; if(judge(mid)) l=mid+1; else r=mid-1; } printf("%d\n",ans); } return 0; }
E -- 鹹魚旅行
很不明白爲何不少人要用二分,也許是我沒入坑,也許是上天安排,作過相似的題,但這個題數據範圍較大,因而直接想到SPFA或者dij+堆優化。但看到邊m的範圍,加之我對SPFA的一種天生抵抗,因而直接上手dij。1A。
const int N=1e6+10; int n,m,s,t; int tot,head[N],d[N],vis[N]; struct edge { int to,next,c; }e[N]; struct node { int to,c; friend bool operator <(node a,node b) { return a.c>b.c; } }; priority_queue<node>q; void add(int u,int v,int c) { e[tot].to=v,e[tot].c=c; e[tot].next=head[u]; head[u]=tot++; } void init() { tot=0; for(int i=1;i<=n;i++) { d[i]=INF; head[i]=-1; vis[i]=0; } while(!q.empty()) q.pop(); } void dij() { q.push(node{s,d[s]}); while(!q.empty()) { node tmp=q.top(); q.pop(); int u=tmp.to; if(vis[u]) continue; vis[u]=1; for(int i=head[u];i+1;i=e[i].next) { int v=e[i].to,c=e[i].c; int tt=c; if(u!=s) tt=max(d[u],c); if(d[v]>tt) { d[v]=tt; q.push(node{v,tt}); } } } if(d[t]==INF) puts("-1"); else printf("%d\n",d[t]); } int main() { while(~scanf("%d%d",&n,&m)) { init(); int u,v,c; while(m--) { scanf("%d%d%d",&u,&v,&c); add(u,v,c); add(v,u,c); } scanf("%d%d",&s,&t); if(s==t) { puts("0"); continue; } dij(); } return 0; }
F -- 鹹魚文章
切完那幾道大衆題後因而瞄準了這道題,羣裏各類吐槽,因而發現是shabi題,上手用棧來了一發果真不負這經過率直接PE。隊友發來捷報說已經A了,因而用隊友代碼交過了,而後中場rejudge,瞬間PE一大半,無腦又rejudge結果第一發A了,第二發PE。終榜居然還有這個題的罰時,管理員你出來咱們談談。。。
char s[N];//感受是改數據了。。 int main() { while(gets(s)) { stack<char>q; while(!q.empty()) q.pop(); for(int i=0;s[i]!='\0';i++) { if(isalpha(s[i])) { while(isalpha(s[i])) { q.push(s[i]); i++; } while(!q.empty()) { printf("%c",q.top()); q.pop(); } i--; } else printf("%c",s[i]); } puts(""); } return 0; }
G -- 鹹魚拷問
這道題就是上題說過的大衆題,作完最短路那道因而瞄準了這道題,發現好像是RMQ板子,但我這隻連板子都不想敲的廢魚直接把劃分樹板子粘過來改改又A了。。。
推薦題:POJ2104 kuangbin模板不謝。
const int N=1e5+5; const double eps=1e-4; const double PI=acos(-1.0); int tree[20][N],t_l[20][N]; int a[N],b[N]; void build(int l,int r,int id) { if(l==r) return ; int mid=(l+r)/2; int same=mid-l+1; for(int i=l;i<=r;i++) if(tree[id][i]<a[mid]) same--; int lp=l,rp=mid+1; for(int i=l;i<=r;i++) { if(tree[id][i]<a[mid]) tree[id+1][lp++]=tree[id][i]; else if(tree[id][i]==a[mid]&&same>0) tree[id+1][lp++]=tree[id][i],same--; else tree[id+1][rp++]=tree[id][i]; t_l[id][i]=t_l[id][l-1]+lp-l; } build(l,mid,id+1); build(mid+1,r,id+1); } int query(int l,int r,int k,int L,int R,int id) { if(l==r) return tree[id][l]; int mid=(L+R)/2; int cnt=t_l[id][r]-t_l[id][l-1]; if(cnt>=k) { int newl=L+t_l[id][l-1]-t_l[id][L-1]; int newr=newl+cnt-1; return query(newl,newr,k,L,mid,id+1); } else { int newr=r+t_l[id][R]-t_l[id][r]; int newl=newr-(r-l-cnt); return query(newl,newr,k-cnt,mid+1,R,id+1); } } int main() { int n,m; while(~scanf("%d",&n)) { memset(tree,0,sizeof(tree)); for(int i=1;i<=n;i++) { scanf("%d",&tree[0][i]); a[i]=tree[0][i]; } for(int i=1;i<=n;i++) scanf("%d",&b[i]); sort(a+1,a+n+1); build(1,n,0); for(int i=1;i<=n;i++) { int r=i,l=i-b[i]+1; ll mi=ll(query(l,r,1,1,n,0)); ll ma=ll(query(l,r,r-l+1,1,n,0)); printf("%lld\n",mi*ma);//注意此題數據範圍 } } return 0; }
H -- 喵哈哈村的戰鬥魔法師丶壞壞い月
啊呀,石樂志!當時直接想到主席樹上去了,然而我這隻廢魚只會劃分樹板子。腿隊友說分塊能夠寫,因而這個題交給隊友寫,那我幹嗎呢,固然是打打醬油啦,有這麼強的隊友躺着都能贏。好吧,事實是隊友寫了好久樣例各類沒問題但就是WA了,咱們出的樣例簡直無腦。無奈後三個小時沒能作出來。後來看榮神用線段樹過了才恍然大悟。線段大法好哇。
很迷當時爲何直接想到主席樹上去了。。。
const int N=1e5+5; int n,m; struct node { int l,r; ll ma,add; } a[N<<2]; void pushdown(int k) { if(a[k].add) { a[k*2].add+=a[k].add; a[k*2+1].add+=a[k].add; a[k*2].ma+=a[k].add; a[k*2+1].ma+=a[k].add; a[k].add=0; } } void pushup(int k) { a[k].ma=max(a[k*2].ma,a[k*2+1].ma); } void build(int l,int r,int k) { a[k].l=l,a[k].r=r; a[k].ma=a[k].add=0; if(l==r) { scanf("%lld",&a[k].ma); return ; } int mid=(l+r)/2; build(l,mid,2*k); build(mid+1,r,2*k+1); pushup(k); } void update(int l,int r,ll c,int k) { if(l<=a[k].l&&a[k].r<=r) { a[k].add+=c; a[k].ma+=c; return ; } pushdown(k); int mid=(a[k].l+a[k].r)/2; if(l<=mid) update(l,r,c,2*k); if(r>mid) update(l,r,c,2*k+1); pushup(k); } ll query(int l,int r,ll c,int k) { if(a[k].l==l&&a[k].r==r&&a[k].l==a[k].r) { if(a[k].ma>=c) return a[k].l; return -1; } pushdown(k); int mid=(a[k].l+a[k].r)/2; if(r<=mid) return query(l,min(mid,r),c,2*k); if(l>mid) return query(max(mid+1,l),r,c,2*k+1); else { int ans=query(l,mid,c,2*k); if(ans==-1) return query(mid+1,r,c,2*k+1); return ans; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); build(1,n,1); int op,l,r; ll c; while(m--) { scanf("%d%d%d%lld",&op,&l,&r,&c); if(op==1) printf("%lld\n",query(l,r,c,1)); else update(l,r,c,1); } } return 0; }
J -- 喵哈哈村的幾何大師╰☆莣メ誋こ月
腿隊友在寫分塊的時候我和zp一直在看這個題,但D題過的人愈來愈多因而zp去讀D題,我繼續推這個題。無腦毫無思路,在做輔助線求關係的路上漸行漸遠,因而找已經退役的祥琨大神和青龍大神幫我解解。姜果真老的辣,昆神很快就給出了思路,而後我這隻廢魚磨蹭半天才出代碼,卻被卡精度了,因而絕望之際xjb改爲了用acos就過了。。。。
不過這個題卻是挺有趣的。等腰三角形 給你a,b,c,d求E。
兩幅圖簡單明瞭,不愧是我最敬佩的昆神。固然青龍大哥也很好,專門從考研自習室過來給我講解這道題,感動!
從圖中能夠看出只要知道了腰或者底邊,那麼x,y就能夠算出來,從而能夠推出橫跨邊z。然而上面已經講過WA了,由於有太多的sqrt了, 精度損失。。
因而在這種思路的基礎上能不能儘可能少用sqrt呢,因而咱們觀察到要求橫跨邊z確定要開方,而底邊b怎麼來的呢,其實咱們能夠隨便設一個值,若是設腰來求底邊的話仍是要開方的,因此直接設底邊b=10.0,不大不小恰好。因而咱們能夠算出x,y。但從角AB出發的那條邊 e 和從角CD出發的那條邊 f 都是未知的,因此咱們能夠根據餘弦定理算出來e^2,已知x,已知e^2,z^2也能夠根據頂角用餘弦定理算出來.因而用角E做餘弦定理就正好解決了,再用acos函數就能夠知道E角所對應的pi值了。
const double pi=acos(-1.0); int main() { int t; scanf("%d",&t); while(t--) { double A,B,C,D; scanf("%lf%lf%lf%lf",&A,&B,&C,&D); A=A*pi/180.0;//轉化成pi進制下的值便於計算 C=C*pi/180.0; D=D*pi/180.0; B=B*pi/180.0; double tmp=cos(pi-A-B-C-D); double b=10.0;//設底邊爲10,大小無所謂 double x=b*sin(D)/sin(pi-D-B-A); double y=b*sin(B)/sin(pi-D-B-C); double a=5.0/cos(A+B);//求出腰 double z=(a-x)*(a-x)+(a-y)*(a-y)-2*tmp*(a-x)*(a-y);//這裏的z其實是z*z,防止精度丟失 double e=y*y+100-20*y*cos(C+D);//實際上是e*e double tt=sqrt(z*e);//只開方一次,無腦AC printf("%.2f\n",acos((z+e-x*x)/(2*tt))*180.0/pi); // printf("%.2f\n",asin(x*sin(A)/z)/pi*180.0);//第一種方法WA 。。。 } return 0; }
總結:高中生也算高校?C題shabi錯誤簡直石樂志。。