T1 出了个大阴间题

真就以为他出了个大阴间题就没写,打个暴力就跑了

数据范围显然摆明是状压

设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$

然后按照转移之后的集合内的最大值当前集合的最大值的关系分情况转移,(这里的最大值不是$A$的最大值,是原数的最大值)

所以预处理一个集合内最大值的数组,转移可以达到$O(2^n n)$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=19,mod=1e9+7;
15 int n,k,a[NN],smx[1<<NN];
16 struct dp{int num,B,sum;}f[1<<19][2];
17 namespace WSN{
18 inline short main(){
19 freopen("repair.in","r",stdin); freopen("repair.out","w",stdout);
20 n=read(); k=read(); int U=(1<<n)-1;
21 for(int i=1;i<=n;i++) a[i]=read();
22 for(int i=1;i<=U;i++) for(int j=1;j<=n;j++)
23 if(i&(1<<j-1)) smx[i]=max(smx[i],a[j]);
24 for(int i=0;i<n;i++) f[1<<i][0].num=1;
25 for(int i=1;i<=U;i++) for(int j=1;j<=n;j++) if(!(i&(1<<j-1))){
26 int to=i|(1<<j-1);
27 if(smx[to]==smx[i]&&smx[to]==a[j]){
28 if(f[i][0].num){
29 (f[to][1].num+=f[i][0].num)%=mod;
30 (f[to][1].B+=2*f[i][0].B%mod+f[i][0].num)%=mod;
31 (f[to][1].sum+=f[i][0].B+f[i][0].sum+f[i][0].num*k%mod*(smx[to]+1)%mod)%=mod;
32 }
33 if(f[i][1].num){
34 (f[to][1].num+=f[i][1].num)%=mod;
35 (f[to][1].B+=2*f[i][1].B%mod+f[i][1].num)%=mod;
36 (f[to][1].sum+=f[i][1].B+f[i][1].sum+f[i][1].num*k%mod*(smx[to]+1)%mod)%=mod;
37 }
38 }else if(smx[to]==smx[i]+1||smx[to]==smx[i]){
39 if(f[i][0].num){
40 (f[to][0].num+=f[i][0].num)%=mod;
41 (f[to][0].B+=2*f[i][0].B%mod+f[i][0].num)%=mod;
42 (f[to][0].sum+=f[i][0].B+f[i][0].sum+f[i][0].num*k%mod*smx[to]%mod)%=mod;
43 }
44 if(f[i][1].num){
45 (f[to][1].num+=f[i][1].num)%=mod;
46 (f[to][1].B+=2*f[i][1].B%mod+f[i][1].num)%=mod;
47 (f[to][1].sum+=f[i][1].B+f[i][1].sum+f[i][1].num*k%mod*(smx[to]+1)%mod)%=mod;
48 }
49 }
50 else{
51 if(f[i][0].num){
52 (f[to][0].num+=f[i][0].num)%=mod;
53 (f[to][0].B+=2*f[i][0].B%mod+f[i][0].num)%=mod;
54 (f[to][0].sum+=f[i][0].B+f[i][0].sum+f[i][0].num*k%mod*smx[to]%mod)%=mod;
55 }
56 if(f[i][1].num){
57 (f[to][0].num+=f[i][1].num)%=mod;
58 (f[to][0].B+=2*f[i][1].B%mod+f[i][1].num)%=mod;
59 (f[to][0].sum+=f[i][1].B+f[i][1].sum+f[i][1].num*k%mod*smx[to]%mod)%=mod;
60 }
61 }
62 }
63 if(f[U][1].num) write(smx[U]+1,' '),write(f[U][1].sum);
64 else write(smx[U],' '),write(f[U][0].sum);
65 return 0;
66 }
67 }
68 signed main(){return WSN::main();}

T2 最简单辣快来做

说的挺简单,除了$T4$这个最难

看见绝对值就给他拆开绝对错不了,然后考虑四个方向统计贡献

比较妙的按照每一个点的$x,y$把原来的图分成$(n+1)^2$个小矩形,注意离散化

然后统计前缀和,这里的前缀和是指从一个格点到另一个格点需要的代价,是$a^i , b^j$的贡献,不是单纯的加和

处理完之后每次询问就可以$log(n)$的复杂度计算了,注意不想卡常的话使用光速幂,是一种类似分块的思想

可以做到$O(1)$出解的高幂次计算方法

 1 #include<bits/stdc++.h>
2 using namespace std;
3 namespace AE86{
4 inline int read(){
5 int x=0,f=1;char ch=getchar();
6 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
8 }inline void write(int x,char opt='\n'){
9 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
10 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
11 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
12 }using namespace AE86;
13 const int NN=2005;
14 int n,q,w,h,mod,a,b,dis1[NN],dis2[NN];
15 struct sate{int h,x,y;}s[NN];
16 int sum[NN][NN][5];
17 inline int mo(int x){return x>=mod?x-mod:x;}
18 namespace gsm{
19 const int KK=1e5+5;
20 int bl,A[KK],B[KK],pwa[KK],pwb[KK],k,r,res;
21 inline void init(){
22 A[0]=B[0]=pwa[0]=pwb[0]=1;
23 bl=ceil(sqrt(1.0*max(w,h)));
24 for(int i=1;i<=bl;i++){
25 A[i]=1ll*A[i-1]*a%mod;
26 B[i]=1ll*B[i-1]*b%mod;
27 }
28 for(int i=1;i<=bl;i++){
29 pwa[i]=1ll*pwa[i-1]*A[bl]%mod;
30 pwb[i]=1ll*pwb[i-1]*B[bl]%mod;
31 }
32 }
33 inline int qmo(int x,int b){
34 // cout<<x<<" "<<b<<endl;
35 if(b<0) return 0; k=b/bl; r=b%bl;
36 if(x==a) res=1ll*pwa[k]*A[r]%mod;
37 else res=1ll*pwb[k]*B[r]%mod;
38 return res;
39 }
40 }using namespace gsm;
41 inline void discrete(){
42 sort(dis1+1,dis1+n+1); sort(dis2+1,dis2+n+1);
43 for(int i=1;i<=n;++i)s[i].x=lower_bound(dis1+1,dis1+n+1,s[i].x)-dis1;
44 for(int i=1;i<=n;++i)s[i].y=lower_bound(dis2+1,dis2+n+1,s[i].y)-dis2;
45 }
46 namespace WSN{
47 inline short main(){
48 // freopen("in.in","r",stdin); //freopen("bao.out","w",stdout);
49 freopen("satellite.in","r",stdin); freopen("satellite.out","w",stdout);
50 n=read();q=read();w=read();h=read();mod=read();a=read();b=read();
51 for(int i=1;i<=n;++i) s[i].h=read(),dis1[i]=s[i].x=read(),dis2[i]=s[i].y=read();
52 discrete(); init();
53 for(int i=1;i<=n;++i)
54 sum[s[i].x][s[i].y][1]=sum[s[i].x][s[i].y][2]=sum[s[i].x][s[i].y][3]=sum[s[i].x][s[i].y][4]=s[i].h;
55
56 for(int i=1;i<=n;++i){
57 for(int j=1;j<=n;++j) sum[i][j][1]=mo(sum[i][j][1]+1ll*sum[i][j-1][1]*qmo(b,dis2[j]-dis2[j-1])%mod);
58 for(int j=1;j<=n;++j) sum[i][j][1]=mo(sum[i][j][1]+1ll*sum[i-1][j][1]*qmo(a,dis1[i]-dis1[i-1])%mod);
59 for(int j=n;j;--j) sum[i][j][3]=mo(sum[i][j][3]+1ll*sum[i][j+1][3]*qmo(b,dis2[j+1]-dis2[j])%mod);
60 for(int j=n;j;--j) sum[i][j][3]=mo(sum[i][j][3]+1ll*sum[i-1][j][3]*qmo(a,dis1[i]-dis1[i-1])%mod);
61 }
62 for(int i=n;i;--i){
63 for(int j=1;j<=n;++j) sum[i][j][2]=mo(sum[i][j][2]+1ll*sum[i][j-1][2]*qmo(b,dis2[j]-dis2[j-1])%mod);
64 for(int j=1;j<=n;++j) sum[i][j][2]=mo(sum[i][j][2]+1ll*sum[i+1][j][2]*qmo(a,dis1[i+1]-dis1[i])%mod);
65 for(int j=n;j;--j) sum[i][j][4]=mo(sum[i][j][4]+1ll*sum[i][j+1][4]*qmo(b,dis2[j+1]-dis2[j])%mod);
66 for(int j=n;j;--j) sum[i][j][4]=mo(sum[i][j][4]+1ll*sum[i+1][j][4]*qmo(a,dis1[i+1]-dis1[i])%mod);
67 }
68 int qx,qy,X,Y,x1,x2,y1,y2,tmp;
69 for(int o=1;o<=q;++o){
70 qx=read(),qy=read(),X,Y;
71 X=lower_bound(dis1+1,dis1+n+1,qx)-dis1;
72 Y=lower_bound(dis2+1,dis2+n+1,qy)-dis2;
73 x1=X-1,x2=X,y1=Y-1,y2=Y,tmp=0;
74 tmp=mo(tmp+1ll*sum[x1][y1][1]*qmo(b,qy-dis2[y1])%mod*qmo(a,qx-dis1[x1])%mod);
75 if(x2<=n) tmp=mo(tmp+1ll*sum[x2][y1][2]*qmo(b,qy-dis2[y1])%mod*qmo(a,dis1[x2]-qx)%mod);
76 if(y2<=n) tmp=mo(tmp+1ll*sum[x1][y2][3]*qmo(b,dis2[y2]-qy)%mod*qmo(a,qx-dis1[x1])%mod);
77 if(y2<=n&&x2<=n) tmp=mo(tmp+1ll*sum[x2][y2][4]*qmo(b,dis2[y2]-qy)%mod*qmo(a,dis1[x2]-qx)%mod);
78 write(tmp);
79 }
80 return 0;
81 }
82 }
83 signed main(){return WSN::main();}

T3 是我的你不要抢

$hash$,$cao$过去就完了....

考试的时候字符串就用$hash$,别瞎搞什么$kmp$难想还难调

当时先想了个二分,非常假,我太傻。。。

后来就不知道哪里来的勇气码$kmp$,然后还是假,因为$bouder$的性质假的

其实直接拿$vector$存$hash$值然后生猛枚举匹配长度,再拿$map$存一下答案记忆化就可以水掉了

这么简单的思路,考场上沉迷看毛片无法自拔没想到,非常后悔,但是这道题的特殊性正好适应了这种无脑的暴力

造的最极限的数据不开$O2$卡到了九秒,开了$O2$就跑$1.4$,非常不懂

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 typedef unsigned long long ULL;
15 const ULL base=131;
16 const int NN=6e5+5;
17 int n,q,len[NN];
18 char ch[NN];
19 ULL pw[NN];
20 vector<ULL> ha[NN];
21 map<pair<int,int>,int> mp;
22 inline void task(){
23 scanf("%s",ch+1);int l=strlen(ch+1);
24 while(q--){int x=read(),y=read();write(l);}
25 }
26 inline ULL get(int i,int l,int r){
27 return ha[i][r]-ha[i][l-1]*pw[r-l+1];
28 }
29 namespace WSN{
30 inline short main(){
31 // freopen("in.in","r",stdin); freopen("bao.out","w",stdout);
32 freopen("string.in","r",stdin); freopen("string.out","w",stdout);
33 n=read();q=read(); if(n==1) return task(),0;
34 pw[0]=1; for(int i=1;i<NN;++i) pw[i]=pw[i-1]*base;
35 for(int i=1;i<=n;++i){
36 scanf("%s",ch+1);len[i]=strlen(ch+1);ha[i].push_back(0);
37 for(int j=1;j<=len[i];++j){
38 ULL last=ha[i].back();
39 ha[i].push_back(last*base+(ULL)(ch[j]-'a'+1));
40 }
41 }
42 for(int o=1;o<=q;++o){
43 int x=read(),y=read();
44 if(mp.find(make_pair(x,y))!=mp.end()){
45 write(mp[make_pair(x,y)]);continue;
46 }
47 bool flag=0;int l=min(len[x],len[y]);
48 for(int i=l;i;--i)
49 if(get(x,len[x]-i+1,len[x])==get(y,1,i)){
50 write(i);mp[make_pair(x,y)]=i;flag=1;break;
51 }
52 if(!flag) puts("0"),mp[make_pair(x,y)]=0;
53 }
54 return 0;
55 }
56 }
57 signed main(){return WSN::main();}

T4 显然也是我咕的

Noip模拟72 2021.10.9的更多相关文章

  1. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  2. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  3. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  4. Noip模拟81 2021.10.20

    T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...

  5. Noip模拟83 2021.10.26

    T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...

  6. Noip模拟80 2021.10.18

    预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...

  7. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  8. Noip模拟77 2021.10.15

    T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...

  9. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...

随机推荐

  1. Git--生成公钥和私钥并添加gitlab访问权限

    Git配置 打开git bash 执行以下命令 git config --global user.name 用户名 git config --global user.email 邮箱 ssh-keyg ...

  2. ysoserial CommonsColletions4分析

    ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...

  3. 剑指offer计划16( 排序简单)---java

    1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...

  4. SQL:1999基本语法

    SQL:1999基本语法 SELECT [DISTINCT] * | 列名称 [AS]别名,........ FROM 表名称1 [别名1][CROSS JOIN表名称2 别名2]| [NATURAL ...

  5. electron-vue 开发问题合集

    (一)Found 'electron' but not as a devDependency, pruning anyway 原因:对electron没有严格要求的话可以忽略,不影响打包,但会影响第三 ...

  6. 关于PHP数组Key的强制类型转换

    PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型.同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是字符串类型的Hash键值,那 ...

  7. Git(2) - git安装、本地仓库与远程仓库使用详细指南

    git版本控制工具 下载地址:https://www.git-scm.com/download/win选择对应版本的工具,下载后是一个exe执行文件: 常用git命令 命令 作用 git init(在 ...

  8. css 样式设定

    阴影: --可以同时设定多个阴影.用逗号隔开 http://www.fly63.com/article/detial/4726 div { box-shadow: 10px 10px 5px #888 ...

  9. 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 百篇博客分析OpenHarmony源码 | v18.04

    百篇博客系列篇.本篇为: v18.xx 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

  10. Hyper-V CPU设置

    前言 最近在用Hyper-V测试项目,发现在运行过程中发现项目总数崩掉,几经发现有一个共性,CPU占用率100%,分析问题发现问题出在Hyper-V CPU设置上,Hyper-V装系统就不赘述了,网上 ...