2017/8/10 考试吐槽
2017 8 10 成绩:70
不想吐槽什么了……没心情……感觉自己快要炸没了……
A、Evensgn剪树枝
题意:节点分为两种,求将整个树分为几部分,每部分有且仅有一个第二种节点方案数。
树归……$f[n][0/1]$表示这个节点所在部分没有/有第二种节点……
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<vector> 6 using namespace std; 7 const long long mod=1e9+7,maxn=100005; 8 int n,val[maxn],fa[maxn]; 9 long long f[maxn][2]; 10 vector<int>son[maxn]; 11 long long qpow(int val,int tim) 12 { 13 long long x=val,tmp=1; 14 for(;tim;tim>>=1,x=x*x%mod) 15 if(tim&1)tmp=tmp*x%mod; 16 return tmp; 17 } 18 void dfs(int root) 19 { 20 if(val[root])f[root][0]=0,f[root][1]=1; 21 else f[root][0]=1,f[root][1]=0; 22 for(int i=0;i<son[root].size();i++) 23 { 24 dfs(son[root][i]); 25 f[son[root][i]][0]+=f[son[root][i]][1];f[son[root][i]][0]%=mod; 26 if(!val[root])f[root][0]=(f[root][0]*f[son[root][i]][0])%mod; 27 else f[root][1]=(f[root][1]*f[son[root][i]][0])%mod; 28 } 29 if(!val[root]) 30 for(int i=0;i<son[root].size();i++) 31 if(f[son[root][i]][0])f[root][1]=(f[root][1]+(f[root][0]*qpow(f[son[root][i]][0],mod-2)%mod*f[son[root][i]][1])%mod)%mod; 32 else f[root][1]=(f[root][1]+f[root][0]*f[son[root][i]][1]%mod)%mod; 33 } 34 int haha() 35 { 36 //freopen("tree7.in","r",stdin); 37 //freopen("tree.out","w",stdout); 38 scanf("%d",&n); 39 for(int i=2;i<=n;i++) 40 { 41 scanf("%d",&fa[i]);fa[i]++; 42 son[fa[i]].push_back(i); 43 } 44 for(int i=1;i<=n;i++)scanf("%d",&val[i]); 45 dfs(1); 46 printf("%lld\n",f[1][1]); 47 } 48 int sb=haha(); 49 int main(){;}
B、公主的朋友
题意:区间动态查询有几个某种元素,动态修改。
线(fen)段(kuai)树(luan)可(gao)以(jiu)通(neng)过
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=100005,maxk=320; 8 int belong[maxn],st[maxk],en[maxk],sm[maxk][305],se[maxk],a[maxn],n,m,t,size,cnt; 9 int query(int l,int r) 10 { 11 int reli=se[belong[l]]>0?se[belong[l]]:a[l]; 12 int ans=0; 13 if(belong[r]-belong[l]>=2) 14 for(int i=belong[l]+1;i<=belong[r]-1;i++) 15 if(se[i])ans+=((se[i]==reli)?size:0); 16 else ans+=sm[i][reli]; 17 if(se[belong[l]])ans+=min(en[belong[l]],r)-l; 18 else for(int i=l+1;i<=min(en[belong[l]],r);i++)ans+=(a[i]==reli); 19 if(belong[l]==belong[r])return ans; 20 if(se[belong[r]])ans+=((se[belong[r]]==reli)?r-st[belong[r]]+1:0); 21 else for(int i=st[belong[r]];i<=r;i++)ans+=(a[i]==reli); 22 return ans; 23 } 24 void modify(int l,int r) 25 { 26 int reli=(se[belong[l]]>0?se[belong[l]]:a[l]); 27 for(int i=belong[l]+1;i<=belong[r]-1;i++)se[i]=reli; 28 if(!se[belong[l]]) 29 for(int i=l+1;i<=min(en[belong[l]],r);i++) 30 { 31 sm[belong[l]][a[i]]--; 32 a[i]=reli; 33 sm[belong[l]][reli]++; 34 } 35 if(belong[l]==belong[r])return; 36 if(!se[belong[r]]) 37 for(int i=st[belong[r]];i<=r;i++) 38 { 39 sm[belong[r]][a[i]]--; 40 a[i]=reli; 41 sm[belong[r]][reli]++; 42 } 43 if(se[belong[r]]&&se[belong[r]]!=reli) 44 { 45 for(int i=1;i<=m;i++)sm[belong[r]][i]=((i==se[belong[r]])?en[belong[r]]-st[belong[r]]+1:0); 46 for(int i=st[belong[r]];i<=en[belong[r]];i++)a[i]=se[belong[r]]; 47 se[belong[r]]=0; 48 for(int i=st[belong[r]];i<=r;i++) 49 { 50 sm[belong[r]][a[i]]--; 51 a[i]=reli; 52 sm[belong[r]][reli]++; 53 } 54 } 55 } 56 int haha() 57 { 58 //freopen("friend1.in","r",stdin); 59 //freopen("friend.out","w",stdout); 60 scanf("%d%d",&n,&m); 61 size=(int)sqrt(n);cnt=n/size+(n%size?1:0); 62 for(int i=1;i<=n;i++) 63 { 64 belong[i]=(i-1)/size+1; 65 scanf("%d",&a[i]);sm[belong[i]][a[i]]++; 66 } 67 for(int i=1;i<=cnt;i++)st[i]=(i-1)*size+1,en[i]=min(i*size,n); 68 scanf("%d",&t); 69 for(int i=1;i<=t;i++) 70 { 71 int x,y;scanf("%d%d",&x,&y); 72 printf("%d\n",query(x,y)); 73 modify(x,y); 74 } 75 } 76 int sb=haha(); 77 int main(){;}
C、Function
题意:求出不同位置上多个二次函数最大值。
扫(li)描(xian)线(gao)可过
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn=1005,maxk=2e5+5; 7 long long a[maxn],b[maxn],c[maxn],n,q; 8 long long f(long long x) 9 { 10 long long fa=a[1]*x*x+b[1]*x+c[1]; 11 for(int i=2;i<=n;i++) 12 fa=max(fa,1ll*a[i]*x*x+b[i]*x+c[i]); 13 return fa; 14 } 15 int tim[maxk*5];long long fa[maxk]; 16 int haha() 17 { 18 //freopen("function3.in","r",stdin); 19 //freopen("function.out","w",stdout); 20 scanf("%d%d",&n,&q); 21 for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&a[i],&b[i],&c[i]); 22 for(int i=1;i<=q;i++) 23 { 24 int x;scanf("%d",&x); 25 tim[i]=x; 26 } 27 for(int i=-1e5;i<=1e5;i++)fa[i+(int)1e5]=f(1ll*i); 28 for(int i=1;i<=q;i++)printf("%lld\n",fa[tim[i]+(int)1e5]); 29 } 30 int sb=haha(); 31 int main(){;}
只要是活着的东西,就算是神我也杀给你看。