2017/8/11 离线赛
来源:互联网 发布:演唱会抢票攻略 知乎 编辑:程序博客网 时间:2024/05/22 06:53
T1 小宝卖猪
考试的时候因为忘乘上
int n,t;int w[M],d[M],p[M];ll tmp[M];ll ans;int main(){ Rd(n);Rd(t); for(int i=1;i<=n;i++)Rd(w[i]); for(int i=1;i<=n;i++)Rd(d[i]); for(int i=1;i<=n;i++)Rd(p[i]); for(int i=1;i<=n;i++) tmp[i]=-1LL*d[i]*t+p[i]; sort(tmp+1,tmp+n+1); sort(w+1,w+n+1); for(int i=1;i<=n;i++) ans+=1LL*tmp[i]*w[i]; Pt(ans); putchar('\n'); return 0;}
T2 放书
考试的时候我没有想到怎么把前面的书取出来放到后面去,然后敲了一个只能从后往前放的
我们定义
void check(int &a,int b){ if(a==-1||a>b)a=b;}int n,K;int h[M];int bit[8];int dp[2][9][105][256];int main(){ int S=0; memset(dp,-1,sizeof(dp)); Rd(n);Rd(K); for(int i=1;i<=n;i++){ Rd(h[i]); h[i]-=25; S|=(1<<h[i]); } for(int i=0;i<8;i++) bit[i]=1<<i; bool cur=0; dp[cur][h[1]][0][bit[h[1]]]=1; dp[cur][8][1][0]=0; for(int i=2;i<=n;i++){ cur=!cur; memset(dp[cur],-1,sizeof(dp[cur])); for(int j=0;j<=8;j++) for(int k=0;k<=K;k++) for(int s=0;s<256;s++) if(~dp[!cur][j][k][s]){ if(k<K){ check(dp[cur][j][k+1][s],dp[!cur][j][k][s]); check(dp[cur][j][k+1][s|bit[h[i]]],dp[!cur][j][k][s]+1); } check(dp[cur][h[i]][k][s|bit[h[i]]],dp[!cur][j][k][s]+(j!=h[i])); } } int ans=-1; for(int i=0;i<8;i++) for(int j=0;j<=K;j++) if(~dp[cur][i][j][S])check(ans,dp[cur][i][j][S]); Pt(ans); putchar('\n'); return 0;}
T3 Crash的旅行计划
这题给了五档切分,考试的时候我敲了两档,但是第二档敲爆了,还是再敲一遍吧。
P1:
P2:因为是一条
P3:第三档是一颗完全二叉树,每个节点最多只有两个儿子,我们只要记录它往左走能得到的最大值
P4:由于深度最大只有40,因此我们可以考虑和上面二叉树类似的做法,我们用
P5:……
#include<set>#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#define M 100005using namespace std;template <class T>inline void Rd(T &res){ char c;res=0;int k=1; while(c=getchar(),c<48&&c!='-'); if(c=='-'){k=-1;c='0';} do{ res=(res<<3)+(res<<1)+(c^48); }while(c=getchar(),c>=48); res*=k;}template <class T>inline void Pt(T res){ if(res<0){ putchar('-'); res=-res; } if(res>=10)Pt(res/10); putchar(res%10+48);}struct edge{ int v,nxt;}e[M<<1];struct opr{ bool f; int u,x;}Q[M];int n,m;int A[M],head[M],edgecnt;int fa[M],dep[M],L[M],R[M],top[M],sz[M],son[M],tim;int LCA(int u,int v){ while(top[u]!=top[v]){ if(dep[top[u]]>dep[top[v]])u=fa[top[u]]; else v=fa[top[v]]; } return dep[u]<dep[v]?u:v;}struct P1{//n<=1000 int ans; void dfs(int x,int t,int res){ if(res>ans)ans=res; for(int i=head[x];~i;i=e[i].nxt) if(e[i].v!=t)dfs(e[i].v,x,res+A[e[i].v]); } void solve(){ for(int i=1;i<=m;i++) if(Q[i].f){ int u=Q[i].u; ans=A[u]; dfs(u,-1,A[u]); Pt(ans); putchar('\n'); }else A[Q[i].u]=Q[i].x; }}P1;struct P2{//链 struct Segment_Tree{ int sum[M]; struct node{ int L,R,mx,add; }tree[M<<2]; void up(int p){ tree[p].mx=max(tree[p<<1].mx,tree[p<<1|1].mx); } void down(int p){ if(!tree[p].add)return; tree[p<<1].add+=tree[p].add; tree[p<<1].mx+=tree[p].add; tree[p<<1|1].add+=tree[p].add; tree[p<<1|1].mx+=tree[p].add; tree[p].add=0; } void update(int L,int R,int a,int p){ if(tree[p].L==L&&tree[p].R==R){ tree[p].add+=a; tree[p].mx+=a; return; } down(p); int mid=(tree[p].L+tree[p].R)>>1; if(R<=mid)update(L,R,a,p<<1); else if(L>mid)update(L,R,a,p<<1|1); else{update(L,mid,a,p<<1);update(mid+1,R,a,p<<1|1);} up(p); } int query(int L,int R,int p){ if(tree[p].L==L&&tree[p].R==R)return tree[p].mx; down(p); int mid=(tree[p].L+tree[p].R)>>1; if(R<=mid)return query(L,R,p<<1); if(L>mid)return query(L,R,p<<1|1); return max(query(L,mid,p<<1),query(mid+1,R,p<<1|1)); } void build(int L,int R,int p){ tree[p]=(node){L,R,0,0}; if(L==R){ tree[p].mx=sum[L]; return; } int mid=(L+R)>>1; build(L,mid,p<<1); build(mid+1,R,p<<1|1); up(p); } }L,R; void solve(){ L.sum[0]=R.sum[n+1]=0; for(int i=1;i<=n;i++) L.sum[i]=L.sum[i-1]+A[i]; for(int i=n;i>=1;i--) R.sum[i]=R.sum[i+1]+A[i]; L.build(1,n,1);R.build(1,n,1); for(int i=1;i<=m;i++) if(Q[i].f){ int u=Q[i].u; Pt(max(L.query(u,n,1)-L.query(u-1,u-1,1),R.query(1,u,1)-R.query(u+1,u+1,1))); putchar('\n'); }else{ int u=Q[i].u,x=Q[i].x; L.update(u,n,x-A[u],1); R.update(1,u,x-A[u],1); A[u]=x; } }}P2;struct P3{//二叉树 int l[M],r[M],ans; void Init(int x){ int L=x<<1,R=L|1; if(L<=n){ Init(L); l[x]=max(max(l[L],r[L])+A[L],0); } if(R<=n){ Init(R); r[x]=max(max(l[R],r[R])+A[R],0); } } void calc(int x,int t,int res){ if((x<<1)==t)ans=max(ans,res+A[x]+r[x]); else ans=max(ans,res+A[x]+l[x]); if(x>>1)calc(x>>1,x,res+A[x]); } void up(int x){ int L=x<<1,R=L|1; if(L<=n)l[x]=max(max(l[L],r[L])+A[L],0); if(R<=n)r[x]=max(max(l[R],r[R])+A[R],0); if(x>>1)up(x>>1); } void solve(){ Init(1); for(int i=1;i<=m;i++) if(Q[i].f){ int u=Q[i].u; ans=max(l[u],r[u])+A[u]; if(u>>1)calc(u>>1,u,A[u]); Pt(ans); putchar('\n'); }else{ int u=Q[i].u,x=Q[i].x; A[u]=x; if(u>>1)up(u>>1); } }}P3;struct P4{ typedef pair<int,int> P; multiset<P>G[M]; multiset<P>::iterator it; int ans; void dfs(int x,int t){ G[x].insert(P(0,0)); for(int i=head[x];~i;i=e[i].nxt){ int v=e[i].v; if(v==t)continue; dfs(v,x); G[x].insert(P((*--G[v].end()).first+A[v],v)); } } void calc(int x,int t,int res){ it=--G[x].end(); if((*it).second==t)--it; ans=max(ans,(*it).first+res+A[x]); if(x!=1)calc(fa[x],x,res+A[x]); } void del(int x,int t){ if(x!=1)del(fa[x],x); G[x].erase(G[x].find(P((*--G[t].end()).first+A[t],t))); } void up(int x,int t){ G[x].insert(P((*--G[t].end()).first+A[t],t)); if(x!=1)up(fa[x],x); } void solve(){ dfs(1,-1); for(int i=1;i<=m;i++) if(Q[i].f){ int u=Q[i].u; ans=(*--G[u].end()).first+A[u]; if(u!=1)calc(fa[u],u,A[u]); Pt(ans); putchar('\n'); }else{ int u=Q[i].u,x=Q[i].x; if(u!=1){ del(fa[u],u); A[u]=x; up(fa[u],u); } } }}P4;struct P5{ void solve(){ }}P5;char s[10];int degree[M];void add_edge(int u,int v){ e[++edgecnt]=(edge){v,head[u]};head[u]=edgecnt;}bool chk1(){ int cnt=0; for(int i=1;i<=n;i++) if(degree[i]==1)cnt++; return cnt==2;};bool chk2(){ for(int i=2;i<=n;i++) if(fa[i]!=(i>>1))return false; return true;};bool chk3(){ for(int i=1;i<=n;i++) if(dep[i]>40)return false; return true;};void dfs(int x,int t){ sz[x]=1; fa[x]=t; L[x]=++tim; if(~t)dep[x]=dep[t]+1; for(int i=head[x];~i;i=e[i].nxt){ int v=e[i].v; if(v==t)continue; dfs(v,x); sz[x]+=sz[v]; if(sz[v]>sz[son[x]])son[x]=v; } R[x]=tim;}void rdfs(int x,int t,int tp){ top[x]=tp; if(son[x])rdfs(son[x],x,tp); for(int i=head[x];~i;i=e[i].nxt){ int v=e[i].v; if(v==t||v==son[x])continue; rdfs(v,x,v); }}int main(){ memset(head,-1,sizeof(head)); int a,b; Rd(n); for(int i=1;i<=n;i++)Rd(A[i]); for(int i=1;i<n;i++){ Rd(a);Rd(b); add_edge(a,b); add_edge(b,a); degree[a]++; degree[b]++; } dfs(1,-1); rdfs(1,-1,1); while(1){ scanf("%s",s); if(s[0]=='C'){ Rd(a);Rd(b); Q[++m]=(opr){0,a,b}; }else if(s[0]=='Q'){ Rd(a); Q[++m]=(opr){1,a,0}; }else break; } if(n<=1000)P1.solve(); if(chk1())P2.solve(); else if(chk2())P3.solve(); else if(chk3())P4.solve(); else P5.solve(); return 0;}
有时候不能顺着题目意思来,要跳出来看问题,不然容易陷进去,把简单的东西想难了。
- 2017/8/11 离线赛
- 2017-11-8离线赛总结
- 2017/8/5 离线赛
- 2017/8/7 离线赛
- 2017/8/9 离线赛
- 2017/8/14 离线赛
- 2017/8/19 离线赛
- 2017/8/20 离线赛
- 2017/8/26 离线赛
- 2017-11-8离线赛总结 (NOIP七连测第六场)
- 2017-11-3离线赛总结
- 2017-11-3离线赛总结
- 2017-11-4离线赛总结
- 2017-11-5离线赛总结
- 2017-11-6离线赛总结
- 2017-11-7离线赛总结
- 2017-11-9离线赛总结
- 2017-10-8离线赛总结
- SQLite3性能深入分析
- leetcode --19. Remove Nth Node From End of List
- linux 修改文件权限
- 计算机网络
- UVA
- 2017/8/11 离线赛
- Hibernate与JPA
- Spring学习笔记—基础知识
- Linux 小记
- 数据结构实验之排序六:希尔排序
- LA4329 Ping pong(树状数组)
- javaScript内置对象Date
- Android数据库高手秘籍(二)——创建表和LitePal的基本用法
- Catalan数—卡特兰数