NOIp2018集训test-9-7(pm) (联考一day1)

又被辉神吊打了。今天不仅被辉神李巨吊打,还给基本上给全班垫底了。

看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推。

Orz lyc BM直接水过,Orz wys六个for循环出递推,Orz辉神手推n^2递推。

不敢说话,我去背BM板子了。

这样下去大概NOIp继续被辉神李巨吊打,可以退役回去学常规了。

1 餐馆 (restaurant)

完全背包裸题。

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=5007; 
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 int T,n,m,S,t[N],w[N];
20 LL f[N],ans;
21 
22 template<typename T>void read(T &x)  {
23     char ch=getchar(); x=0; T f=1;
24     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
25     if(ch=='-') f=-1,ch=getchar();
26     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
27 }
28 
29 #define ANS
30 int main() {
31 #ifdef ANS
32     freopen("restaurant.in","r",stdin);
33     freopen("restaurant.out","w",stdout);
34 #endif
35     read(T);
36     while(T--) {
37         memset(f,0,sizeof(f));
38         read(n); read(m); read(S);
39         For(i,1,n) {
40             read(t[i]); read(w[i]);
41         }
42         For(i,1,m) { read(t[n+i]); read(w[n+i]); } 
43         For(i,1,m) For(j,1,n) {
44             int x; read(x);
45             if(x>0) t[n+i]+=x*t[j];
46         }
47         For(i,1,n+m) For(j,t[i],S) 
48             f[j]=max(f[j],f[j-t[i]]+w[i]);
49         ans=0;
50         For(j,0,S) ans=max(ans,f[j]);
51         printf("%lld\n",ans);
52     }
53     Formylove;
54 }
View Code

 

2 烯烃 (olefin)

树形dp裸题,最最基础的换根操作。

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=1e5+7;
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 int id,T,n,m,tag[N],ans[N];
20 
21 template<typename T>void read(T &x)  {
22     char ch=getchar(); x=0; T f=1;
23     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
24     if(ch=='-') f=-1,ch=getchar();
25     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
26 }
27 
28 int ecnt,fir[N],nxt[N<<1],to[N<<1],fa[N];
29 void add(int u,int v) {
30     nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
31 }
32 
33 int f[N];
34 void dfs(int x) {
35     f[x]=0;
36     for(int i=fir[x];i;i=nxt[i]) {
37         dfs(to[i]);
38         f[x]=max(f[x],f[to[i]]+1);
39     }
40 }
41 
42 void get_max(int &a,int b) { if(b>a) a=b; }
43 
44 void dfs2(int x,int ff) {
45     int se=0,fi=x==1?0:ff+1;
46     for(int i=fir[x];i;i=nxt[i]) {
47         se=max(se,f[to[i]]+1);
48         if(se>fi) swap(fi,se); 
49     }
50     for(int i=fir[x];i;i=nxt[i]) if(tag[to[i]]) {
51         if(fi==f[to[i]]+1) get_max(ans[tag[to[i]]],se+f[to[i]]+1);
52         else get_max(ans[tag[to[i]]],fi+f[to[i]]+1);
53     }
54     for(int i=fir[x];i;i=nxt[i]) {
55         if(f[to[i]]+1==fi) dfs2(to[i],se);
56         else dfs2(to[i],fi);
57     }
58 }
59 
60 void init() {
61     ecnt=0;
62     memset(ans,0,sizeof(ans));
63     memset(fir,0,sizeof(fir));
64     memset(tag,0,sizeof(tag));
65 }
66 
67 #define ANS
68 int main() {
69 #ifdef ANS
70     freopen("olefin.in","r",stdin);
71     freopen("olefin.out","w",stdout);
72 #endif
73     read(id);
74     read(T);
75     while(T--) {
76         init();
77         read(n); read(m);
78         For(i,2,n) {
79             read(fa[i]);
80             add(fa[i],i);
81         }
82         For(i,1,m) {
83             int x;
84             read(x);
85             tag[x]=i;
86         }
87         dfs(1);
88         dfs2(1,0);
89         For(i,1,m-1) printf("%d ",ans[i]);
90         if(m) printf("%d\n",ans[m]);
91     }
92     Formylove;
93 }
View Code

 

3 三米诺 (tromino)

十进制快速幂,我不会找递推,只能用背BM板子然后水过去。

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<vector>
 7 #include<cstdio>
 8 #include<queue>
 9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=40007,p=998244353;
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 char s[N];
20 LL n,f[15]={0,1,3,10,23,62,170,441,1173,3127,8266};
21 
22 template<typename T>void read(T &x)  {
23     char ch=getchar(); x=0; T f=1;
24     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
25     if(ch=='-') f=-1,ch=getchar();
26     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
27 }
28 
29 struct jz {
30     LL a[6][6];
31     friend jz operator *(const jz&A,const jz&B) {
32         jz rs;
33         For(i,0,5) For(j,0,5) {
34             rs.a[i][j]=0;
35             For(k,0,5) 
36                 (rs.a[i][j]+=A.a[i][k]*B.a[k][j]%p)%=p;
37         }
38         return rs;
39     }
40 }bs,rs;
41 
42 void ksm() {
43     int len=strlen(s);
44     int ok=0;
45     Rep(i,len-1,0) {
46         int c;
47         c=s[i]-'0';
48         if(!ok) {
49             c--; 
50             if(c<0) c+=10;
51             else ok=1;
52         }
53         For(i,1,c) rs=rs*bs;
54         jz pr=bs;
55         For(i,1,9) bs=bs*pr;
56     }  
57 }
58 
59 #define ANS
60 int main() {
61 #ifdef ANS
62     freopen("tromino.in","r",stdin);
63     freopen("tromino.out","w",stdout);
64 #endif
65     scanf("%s",s);
66     For(i,0,5) For(j,0,5) rs.a[i][j]=bs.a[i][j]=0;
67     For(i,0,5) {
68         rs.a[i][i]=1;
69         if(i<5) bs.a[i+1][i]=1;
70     }
71     bs.a[5][5]=1;
72     bs.a[4][5]=2;
73     bs.a[3][5]=6;
74     bs.a[2][5]=1;
75     bs.a[0][5]=p-1;
76     ksm();
77     LL ans=0;
78     For(i,0,5) 
79         (ans+=rs.a[i][0]*f[i+1]%p)%=p;
80     printf("%lld\n",ans);
81     Formylove;
82 }
View Code

 

posted @ 2018-09-08 07:57  啊宸  阅读(193)  评论(0编辑  收藏  举报