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
- 2017年8月11日(模拟五 2065,2104,2115数学方法、深度搜索、后缀数组+manacher+树状数组+二分)
- 2017年 1月 15日 后缀数组 学习整理
- SSL2845 2017年11月8日提高组T2 序列操作(贪心,树状数组,差分)
- 2017年8月15日(模拟7smoj2063,2064,2065暴力、动态规划、数学方法)
- manacher&&后缀数组
- (CDOJ) UESTC 606 Palindrome Again 后缀数组二分 + Manacher + Hash
- 10月16日 树状数组(敌兵布阵)
- 最长回文(后缀数组||Manacher算法)
- URAL 1297(后缀数组/Manacher算法)
- COI2016 Palinilap(manacher+后缀数组)
- POJ 2886 Who Gets the Most Candies?(反素数+数学推导+模拟+线段树||树状数组+二分)
- 2017CCPC哈尔滨 A:Palindrome(manacher+树状数组)
- bzoj 3790(manacher+树状数组)
- 2017年8月14日(模拟6 smoj2060,2061,2062暴力模拟、数学方法求gcd(a^b,c^d)、动态规划)
- poj1743(后缀数组+二分)
- poj3261(后缀数组+二分)
- 1017(二分+树状数组)
- poj3294 二分+后缀数组
- android相对布局中@id和@+id的区别(原理)
- 关于ETCD和Zookeeper的一些简单了解(转)
- Linux下安装Elasticsearch5.5
- Jmeter运行原理
- 【拜小白opencv】11-综合示例-两幅图像融合-摄像头采集图像-滑动条
- 2017年8月11日(模拟五 2065,2104,2115数学方法、深度搜索、后缀数组+manacher+树状数组+二分)
- vi光标移动命令之一
- Java数据结构之线性表
- fl2440开发板之u-boot移植
- H5面试——在JS中typeof返回的结果有哪几种?
- Maven的安装、建立项目
- ZOJ 2996 (1+x)^n【模板题】【常用技巧】
- Android中应用程序文件缓存getCacheDir()和getExternalCacheDir()的区别
- nodejs实现文件上传