2017年8月11日(模拟五 2065,2104,2115数学方法、深度搜索、后缀数组+manacher+树状数组+二分)

来源:互联网 发布:工资数据分析 编辑:程序博客网 时间:2024/05/16 18:07
#include <stdio.h>#include <algorithm>using namespace std;const int maxN=50000;struct Tnode{long long x,y;}a[maxN+maxN];long long c[maxN];int cmp(Tnode x,Tnode y){return x.x<y.x;}int A,B,n,m;int main(){freopen("2065.in","r",stdin);freopen("2065.out","w",stdout);scanf("%d%d%d%d",&A,&B,&n,&m);int nn=0;for (int i=1; i<=n; i++) scanf("%d",&c[i]);c[0]=0; c[n+1]=B;sort(c,c+n+2);for (int i=1; i<=n+1; i++){a[++nn].x=c[i]-c[i-1];a[nn].y=0; }for (int i=1; i<=m; i++) scanf("%d",&c[i]);c[0]=0; c[m+1]=A;sort(c,c+m+2);for (int i=1; i<=m+1; i++){a[++nn].x=c[i]-c[i-1];a[nn].y=1;}sort(a,a+nn+1,cmp);int h=n+1,l=m+1,h1=1,l1=1;long long ans=0;for (int i=1; i<=nn; i++)if (a[i].y==0){ans+=(long long)a[i].x*m;a[i].y=-1;break;}for (int i=1; i<=nn; i++)if (a[i].y==1){ans+=a[i].x*n;a[i].y=-1;break;}for (int i=1; i<=nn; i++){if (a[i].y==0){ans+=(long long)a[i].x*(l-l1);h1++;}if (a[i].y==1){ans+=(long long)a[i].x*(h-h1);l1++;}}printf("%lld\n",ans);return 0;}#include <stdio.h>#include <vector>#include <cstring>using namespace std;const int maxN=200010;struct Tnode{int col,num;}a[maxN];vector <int> e[maxN];int fa[maxN],last[maxN],used[maxN];long long ans[maxN];int n,m;void work1(int root){fa[root]=last[a[root].col];last[a[root].col]=root;used[root]=1;for (int i=0; i<e[root].size(); i++)if (!used[e[root][i]]) work1(e[root][i]);last[a[root].col]=fa[root];}void work2(int root){used[root]=1;for (int i=0; i<e[root].size(); i++)if (!used[e[root][i]]) work2(e[root][i]);// printf("root:%d a[root].num:%d\n",root,a[root].num);ans[root]+=a[root].num;ans[fa[root]]+=ans[root];}int main(){freopen("2104.in","r",stdin);freopen("2104.out","w",stdout);scanf("%d",&n);for (int i=1; i<=n; i++) scanf("%d%d",&a[i].num,&a[i].col);for (int i=1; i<n; i++){int x,y;scanf("%d%d",&x,&y);e[x].push_back(y);e[y].push_back(x);}memset(fa,0,sizeof fa);memset(last,0,sizeof last);memset(used,0,sizeof used);work1(1);// for (int i=1; i<=n; i++) printf("i:%d %d\n",i,fa[i]);memset(used,0,sizeof used);work2(1);for (int i=1; i<=n; i++) printf("%d ",ans[i]);return 0;}#include <stdio.h>#include <cmath>#include <algorithm>#include <cstring>using namespace std;#define maxN 600005#define ll long long#define F(i,j,n) for (int i=j; i<=n; i++)#define D(i,j,n) for (int i=j; i>=n; i--)int cnt[maxN],sa[maxN],rank[maxN],h[maxN],x[maxN],y[maxN],r[maxN],p[maxN],Log2[maxN];int f[maxN][24];char s[maxN];int n;ll ans=0;void SA(int n,int m){F(i,0,m-1) cnt[i]=0;F(i,0,n-1) cnt[x[i]=r[i]]++;F(i,1,m-1) cnt[i]+=cnt[i-1];D(i,n-1,0) sa[--cnt[x[i]]]=i;for (int j=1,p=1;p<n;j<<=1,m=p){p=0;F(i,n-j,n-1) y[p++]=i;F(i,0,n-1) if (sa[i]>=j) y[p++]=sa[i]-j;F(i,0,m-1) cnt[i]=0;F(i,0,n-1) cnt[x[y[i]]]++;F(i,0,m-1) cnt[i]+=cnt[i-1];D(i,n-1,0) sa[--cnt[x[y[i]]]]=y[i];swap(x,y);x[sa[0]]=0; p=1;F(i,0,n-1) x[sa[i]]=((y[sa[i]]==y[sa[i-1]])&&(y[sa[i]+j]==y[sa[i-1]+j]))?p-1:p++;}}void Get_h(int n){F(i,0,n) rank[sa[i]]=i;int j=0,k=0;for (int i=0; i<n; h[rank[i++]]=k)for (k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);}ll _ask(int x,int y){int k=Log2[y-x+1];if (x>y) return 0x7fffffff;return min(f[x][k],f[y-(1<<k)+1][k]);}void calc(int x,int y){x=(x+1)>>1; y=y>>1;int pos=rank[x-1],len=y-x+1;int l,r,mid,pos1=pos,pos2=pos;l=1,r=pos;while (l+1<r){int mid=(l+r)>>1;if (_ask(mid+1,pos)>=len) pos1=mid,r=mid;else l=mid+1;}l=pos,r=n;while (l+1<r){int mid=(l+r)>>1;if (_ask(pos+1,mid)>=len) pos2=mid,l=mid;else r=mid;}ans=max(ans,(ll)len*(pos2-pos1+1));}void manacher(){int mx=0,id=0;F(i,1,n){if (mx>i) p[i]=min(p[id*2-i],mx-i+1);else p[i]=0;while (s[i+p[i]+1]==s[i-p[i]-1]){p[i]++;if (i+p[i]>mx) calc(i-p[i],i+p[i]);}if (i+p[i]>mx) mx=i+p[i],id=i;}}int main(){//freopen("2115.in","r",stdin);//freopen("2115.out","w",stdout);scanf("%s",&s);n=strlen(s);F(i,0,n-1) r[i]=s[i]-'a'+1;r[n]=0;SA(n+1,28);Get_h(n);F(i,2,n) Log2[i]=Log2[i>>1]+1;F(i,1,n) f[i][0]=h[i];for (int j=1; (1<<j)<=n; j++) F(i,1,n-(1<<j)+1) f[i][j]=min(f[i][j-1],f[i+(1<<j)][j-1]);s[0]='$'; s[1]='#'; s[(n+1)<<1]='&';F(i,1,n) s[i<<1]=r[i-1]+'a'-1,s[i<<1|1]='#';n=n<<1|1;manacher();printf("%lld\n",ans);return 0;}

#include <stdio.h>#include <vector>#include <cstring>using namespace std;const int maxN=200010;struct Tnode{int col,num;}a[maxN];vector <int> e[maxN];int fa[maxN],last[maxN],used[maxN];long long ans[maxN];int n,m;void work1(int root){fa[root]=last[a[root].col];last[a[root].col]=root;used[root]=1;for (int i=0; i<e[root].size(); i++) if (!used[e[root][i]])work1(e[root][i]);last[a[root].col]=fa[root];}void work2(int root){used[root]=1;for (int i=0; i<e[root].size(); i++)if (!used[e[root][i]])work2(e[root][i]);ans[root]+=a[root].num;ans[fa[root]]+=ans[root];}int main(){freopen("2104.in","r",stdin);freopen("2104.out","w",stdout);scanf("%d",&n);for (int i=1; i<=n; i++)scanf("%d%d",&a[i].num,&a[i].col);for (int i=1; i<n; i++){int x,y;scanf("%d%d",&x,&y);e[x].push_back(y);e[y].push_back(x);}memset(fa,0,sizeof fa);memset(last,0,sizeof last);memset(used,0,sizeof used);work1(1);memset(used,0,sizeof used);work2(1);for (int i=1; i<=n; i++)printf("%d ",ans[i]);return 0;}


#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define F(i,j,n) for(int i=j;i<=n;i++)#define D(i,j,n) for(int i=j;i>=n;i--)#define ll long long#define ull unsigned long long#define maxn 600005#define inf 1000000000using namespace std;int n,r[maxn],cnt[maxn],x[maxn],y[maxn],sa[maxn],rank[maxn],h[maxn],p[maxn],f[maxn][20],lg2[maxn];ll ans;char s[maxn];void SA(int n,int m){    for(int i=0;i<m;i++) cnt[i]=0;    for(int i=0;i<n;i++) cnt[x[i]=r[i]]++;    for(int i=1;i<m;i++) cnt[i]+=cnt[i-1];    for(int i=n-1;i>=0;i--)  sa[--cnt[x[i]]]=i;    for(int j=1,p=1;p<n;j<<=1,m=p)     {            p=0;        for(int i=n-j;i<n;i++) y[p++]=i;        for(int i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;        for(int i=0;i<m;i++)   cnt[i]=0;        for(int i=0;i<n;i++)   cnt[x[y[i]]]++;        for(int i=1;i<m;i++) cnt[i]+=cnt[i-1];        for(int i=n-1;i>=0;i--) sa[--cnt[x[y[i]]]]=y[i];            swap(x,y);        x[sa[0]]=0;p=1;            for(int i=1;i<n;i++)            x[sa[i]]=((y[sa[i]]==y[sa[i-1]])&&(y[sa[i]+j]==y[sa[i-1]+j])) ? p-1:p++;        }}void get_H(int n){    for(int i=1;i<=n;i++) rank[sa[i]]=i;    int j=0,k=0;    for(int i=0;i<n;h[rank[i++]]=k)        for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);    return ;    }inline int rmq(int l,int r){    if (l>r) return inf;    int t=lg2[r-l+1];    return min(f[l][t],f[r-(1<<t)+1][t]);}inline void calc(int x,int y){    x=(x+1)>>1;y>>=1;    int pos=rank[x-1],len=y-x+1;    int l,r,mid,p1=pos,p2=pos;    l=1;r=pos;    while (l<=r)    {        mid=(l+r)>>1;        if (rmq(mid+1,pos)>=len) p1=mid,r=mid-1;        else l=mid+1;    }    l=pos;r=n;    while (l<=r)    {        mid=(l+r)>>1;        if (rmq(pos+1,mid)>=len) p2=mid,l=mid+1;        else r=mid-1;    }    ans=max(ans,(ll)len*(p2-p1+1));}inline void manacher(){    int mx=0,id=0;    F(i,1,n)    {        if (mx>i) p[i]=min(p[id*2-i],mx-i+1);        else p[i]=1;        while (s[i+p[i]]==s[i-p[i]])        {            if (i+p[i]>mx) calc(i-p[i],i+p[i]);            p[i]++;        }        if (i+p[i]-1>mx) mx=i+p[i]-1,id=i;    }}int main(){freopen("2115.in","r",stdin);freopen("2115.out","w",stdout);     scanf("%s",s);         n=strlen(s);     for(int i=0;i<n;i++)           r[i]=s[i]-'a'+1;      r[n]=0;    SA(n+1,28);    get_H(n);    F(i,2,n) lg2[i]=lg2[i>>1]+1;    F(i,1,n) f[i][0]=h[i];    for(int j=1;(1<<j)<=n;j++) F(i,1,n-(1<<j)+1) f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);    s[0]='$';s[1]='#';s[(n+1)<<1]='%';    F(i,1,n) s[i<<1]=r[i-1]+'a'-1,s[i<<1|1]='#';    n=n<<1|1;    manacher();    printf("%lld\n",ans);}




阅读全文
0 0
原创粉丝点击