多校胡策 round5 by:yts1999

来源:互联网 发布:windows api 多线程 编辑:程序博客网 时间:2024/06/04 18:49

T1

显然排序扫描就可以  数据出问题了

T2

论文题 是13年集训队论文<登顶计划>的简化版本

可以做两遍凸壳 然后再按照每个点可以看到的最大深度排序 用链表维护

Orz yzy线段树差点A掉[开错数组

T3

暂时不会 数据出问题了


T1

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long longconst int INF=1e9+1;LL sum,mmin=(LL)INF*INF;int n,w=-INF,a=INF,s=INF,d=-INF;struct H{int x,y;}num[50000+10];struct J{int l,r;}S[50000+10],T[50000+10];bool cmp1(H a,H b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}bool cmp2(H a,H b){if(a.y==b.y)return a.x<b.x;return a.y<b.y;}int main(){freopen("split.in","r",stdin);freopen("split.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d %d",&num[i].x,&num[i].y),w=max(w,num[i].y),s=min(s,num[i].y),a=min(a,num[i].x),d=max(d,num[i].x);sum=((LL)w-s)*((LL)d-a);sort(num+1,num+n+1,cmp1);S[1].l=S[1].r=num[1].y;for(int i=2;i<=n;i++)  S[i].l=min(S[i-1].l,num[i].y),S[i].r=max(S[i-1].r,num[i].y);T[n].l=T[n].r=num[n].y;for(int i=n-1;i>=1;i--)T[i].l=min(T[i+1].l,num[i].y),T[i].r=max(T[i+1].r,num[i].y);for(int i=1;i<n;i++) mmin=min(mmin,((LL)S[i].r-S[i].l)*((LL)num[i].x-a)+((LL)T[i+1].r-T[i+1].l)*((LL)d-num[i+1].x));sort(num+1,num+n+1,cmp2);S[1].l=S[1].r=num[1].x;for(int i=2;i<=n;i++)  S[i].l=min(S[i-1].l,num[i].x),S[i].r=max(S[i-1].r,num[i].x);T[n].l=T[n].r=num[n].x;for(int i=n-1;i>=1;i--)T[i].l=min(T[i+1].l,num[i].x),T[i].r=max(T[i+1].r,num[i].x);for(int i=1;i<n;i++) mmin=min(mmin,((LL)S[i].r-S[i].l)*((LL)num[i].y-s)+((LL)T[i+1].r-T[i+1].l)*((LL)w-num[i+1].y));printf("%lld\n",sum-mmin);fclose(stdin);fclose(stdout);return 0;}

T2

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL long longusing namespace std;const int MAXN=2e6+10;int L[MAXN],R[MAXN],q[MAXN],top,n,to[MAXN],ans[MAXN],h[MAXN],H[MAXN],pre[MAXN],scc[MAXN];struct H{int x,y;}num[MAXN];//求茶几注意爆掉 int!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LL chacha(int x1,int y1,int x2,int y2){return (LL)x1*y2-(LL)x2*y1;}LL cha(int x,int y,int z){return chacha(num[y].x-num[x].x,num[y].y-num[x].y,num[z].x-num[y].x,num[z].y-num[y].y);}bool cmp(int x,int y){if(H[x]==H[y]) return x>y;return H[x]<H[y];}int tot,g[MAXN],nnext[MAXN],nnum[MAXN];void add(int x,int y){tot++;nnext[tot]=g[x];g[x]=tot;nnum[tot]=y;}int team[MAXN],head,tail;void bfs(int mmax){team[++tail]=mmax;while(head<tail){int x=team[++head];for(int i=g[x];i;i=nnext[i]){int tmp=nnum[i];ans[tmp]=ans[x]+abs(tmp-x);team[++tail]=tmp;}}}int main(){freopen("mountain.in","r",stdin);freopen("mountain.out","w",stdout); scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d %d",&num[i].x,&num[i].y);for(int i=1;i<=n;i++){while(top>=2&&cha(q[top-1],q[top],i)>=0ll) top--;q[++top]=i;if(top>=2) L[q[top]]=q[top-1];}top=0;for(int i=n;i>=1;i--){while(top>=2&&cha(q[top-1],q[top],i)<=0ll) top--;q[++top]=i;if(top>=2) R[q[top]]=q[top-1];}int mmax=0;h[0]=-1;for(int i=1;i<=n;i++) h[i]=num[i].y,mmax=h[mmax]>h[i]?mmax:i;for(int i=1;i<=n;i++) to[i]=h[L[i]]>h[R[i]]?L[i]:R[i];for(int i=1;i<=n;i++) H[i]=h[to[i]];H[mmax]=1e6+1;for(int i=1;i<=n;i++) pre[i]=i-1,scc[i]=i+1,q[i]=i;pre[1]=-1;scc[n]=-1;sort(q+1,q+n+1,cmp);for(int i=1;i<n;i++){int x=q[i];if(to[x]>x) add(scc[x],x),pre[scc[x]]=pre[x],scc[pre[x]]=scc[x];else add(pre[x],x),scc[pre[x]]=scc[x],pre[scc[x]]=pre[x];}bfs(mmax);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);fclose(stdin);fclose(stdout);return 0;}


0 0
原创粉丝点击