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(){;}
A

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(){;}
B

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(){;}
C

 

posted @ 2017-08-10 20:21  ccc000111  阅读(146)  评论(0编辑  收藏  举报