2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题
状压\(DP\),记当前状态的代价和与方案数。状态\(\Theta(2^nn)\),转移\(\Theta(n)\)。
发现每个状态的最大值只会是所选集合的\(max\)或加一。于是可以降维。(我太弱考场上没想到
\(code:\)
T1
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int p=1e9+7;
int n,U,k,tot,ans,mxa,a[20],b[20],num[50];
int f[1<<18][50],g[1<<18][50];
unordered_map<int,int>has;
auto id=[](int x)->int{
if(has[x]) return has[x];
has[x]=++tot; num[tot]=x;
return tot;
};
auto getnum=[](int x)->int{
int res=0;
for(;x;x>>=1) res+=x&1;
return res;
};
signed main(){
freopen("repair.in","r",stdin);
freopen("repair.out","w",stdout);
n=read(); k=read(); U=(1<<n)-1;
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=(b[i-1]<<1)+1;
for(int i=1;i<=n;i++)
f[1<<i-1][id(a[i])]=0,g[1<<i-1][id(a[i])]=1;
for(int tmp,rd,u=1;u<(1<<n);u++){
rd=getnum(u)-1; tmp=tot;
for(int i=1;i<=tmp;i++) if(g[u][i]){
for(int j=1;j<=n;j++) if(!(u&(1<<j-1))){
int now=id((num[i]==a[j])?(a[j]+1):max(num[i],a[j]));
int st=u|(1<<j-1);
(f[st][now]+=f[u][i]+(k*num[now]%p+b[rd])*g[u][i]%p)%=p;
(g[st][now]+=g[u][i])%=p;
}
}
}
for(int i=1;i<=tot;i++) ckmax(mxa,num[i]);
for(int i=1;i<=tot;i++)
if(mxa==num[i]) (ans+=f[U][i])%=p;
write(mxa,' '); write(ans,'\n');
return 0;
}
T2最简单辣快来做
考场上过分相信\(\Theta(1)\)光速幂,只打了个暴力,跟快速幂一个分。。
考虑用\(x=x_i\)与\(y=y_i\)将平面分为若干小矩形,那么这些矩形节点位置的代价可以通过四个二分前缀和预处理实现。
找到询问的位置所在的矩形,分别对四个矩形顶点位置不同方向的前缀和乘上矩形内部的贡献即可。
\(code:\)
T2
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=2010;
int n,q,w,d,p,a,b,res,h[NN],x[NN],y[NN];
int xx[NN],yy[NN],pre[NN][NN][5];
namespace flash_power{
const int MM=1e5;
int u,v,blo,pwa[MM],pwb[MM],pra[MM],prb[MM];
int A(int op){
u=op/blo; v=op%blo;
return pra[u]*pwa[v]%p;
}
int B(int op){
u=op/blo; v=op%blo;
return prb[u]*pwb[v]%p;
}
void init(){
pwa[0]=pwb[0]=pra[0]=prb[0]=1;
blo=ceil(sqrt(1.0*max(w,d)));
for(int i=1;i<=blo;i++){
pwa[i]=pwa[i-1]*a%p;
pwb[i]=pwb[i-1]*b%p;
}
for(int i=1;i<=blo;i++){
pra[i]=pra[i-1]*pwa[blo]%p;
prb[i]=prb[i-1]*pwb[blo]%p;
}
}
} using namespace flash_power;
void prework(){
sort(xx+1,xx+n+1); sort(yy+1,yy+n+1); xx[n+1]=xx[n]; yy[n+1]=yy[n];
for(int i=1;i<=n;i++){
int X=lower_bound(xx+1,xx+n+1,x[i])-xx;
int Y=lower_bound(yy+1,yy+n+1,y[i])-yy;
pre[X][Y][1]=pre[X][Y][2]=pre[X][Y][3]=pre[X][Y][4]=h[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) (pre[i][j][1]+=pre[i][j-1][1]*B(yy[j]-yy[j-1]))%=p;
for(int j=1;j<=n;j++) (pre[i][j][1]+=pre[i-1][j][1]*A(xx[i]-xx[i-1]))%=p;
for(int j=n;j;j--) (pre[i][j][2]+=pre[i][j+1][2]*B(yy[j+1]-yy[j]))%=p;
for(int j=n;j;j--) (pre[i][j][2]+=pre[i-1][j][2]*A(xx[i]-xx[i-1]))%=p;
}
for(int i=n;i;i--){
for(int j=1;j<=n;j++) (pre[i][j][3]+=pre[i][j-1][3]*B(yy[j]-yy[j-1]))%=p;
for(int j=1;j<=n;j++) (pre[i][j][3]+=pre[i+1][j][3]*A(xx[i+1]-xx[i]))%=p;
for(int j=n;j;j--) (pre[i][j][4]+=pre[i][j+1][4]*B(yy[j+1]-yy[j]))%=p;
for(int j=n;j;j--) (pre[i][j][4]+=pre[i+1][j][4]*A(xx[i+1]-xx[i]))%=p;
}
}
int query(int qx,int qy){
int dx=lower_bound(xx+1,xx+n+1,qx)-xx,ux=dx-1;
int dy=lower_bound(yy+1,yy+n+1,qy)-yy,uy=dy-1;
int res=0;
if(ux &&uy ) (res+=pre[ux][uy][1]*A(qx-xx[ux])%p*B(qy-yy[uy]))%=p;
if(ux &&dy<=n) (res+=pre[ux][dy][2]*A(qx-xx[ux])%p*B(yy[dy]-qy))%=p;
if(dx<=n&&uy ) (res+=pre[dx][uy][3]*A(xx[dx]-qx)%p*B(qy-yy[uy]))%=p;
if(dx<=n&&dy<=n) (res+=pre[dx][dy][4]*A(xx[dx]-qx)%p*B(yy[dy]-qy))%=p;
return res;
}
signed main(){
freopen("satellite.in","r",stdin);
freopen("satellite.out","w",stdout);
n=read(); q=read(); w=read(); d=read(); p=read(); a=read(); b=read();
for(int i=1;i<=n;i++)
h[i]=read(),xx[i]=x[i]=read(),yy[i]=y[i]=read();
init(); prework();
while(q--){
int qx=read(),qy=read();
write(query(qx,qy),'\n');
}
return 0;
}
/*
4 1 9 9 100000000 2 3
1 3 4
2 1 9
1 3 5
2 4 6
5 5
*/
T3是我的你不要抢
不会\(AC\)自动机加\(Trie\)的\(NB\)操作,整了个分块。
设块长为\(len\),那么长度大于等于\(len\)的串只有\(\frac{sum}{len}\),预处理即可。剩下的串哈希暴力跑。
最优串长为\(\frac{sum}{q}\)。复杂度\(\Theta(sum\sqrt q)\),但很松,肯定跑不满。
\(code:\)
T3
#include<bits/stdc++.h>
using namespace std;
namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=600010;
int n,q,res,sum,len[NN];
vector<int>vec;
map<pair<int,int>,int>mp;
char s[NN];
namespace Hash{
typedef unsigned long long ULL;
const ULL base=131;
ULL *has[NN],pw[NN];
ULL get(int id,int l,int r){ return has[id][r]-has[id][l-1]*pw[r-l+1]; }
void init(){
pw[0]=1;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
len[i]=strlen(s+1);
has[i]=new ULL[len[i]+5];
sum+=len[i];
for(int j=1;j<=len[i];j++)
has[i][j]=has[i][j-1]*base+(ULL)s[j];
}
for(int i=1;i<=sum;i++) pw[i]=pw[i-1]*base;
}
} using namespace Hash;
namespace blocks{
int blo;
void prework(){
blo=1.0*sum/sqrt(1.0*q);
for(int i=1;i<=n;i++)
if(len[i]>=blo) vec.push_back(i);
for(auto a:vec) for(auto b:vec) if(a!=b){
int res=0;
for(int i=min(len[a],len[b]);i;i--)
if(get(a,len[a]-i+1,len[a])==get(b,1,i)){ res=i; break; }
mp[make_pair(a,b)]=res;
}
}
int query(int x,int y){
if(len[x]>=blo&&len[y]>=blo&&x!=y)
return mp[make_pair(x,y)];
for(int i=min(len[x],len[y]);i;i--)
if(get(x,len[x]-i+1,len[x])==get(y,1,i)) return i;
return 0;
}
} using namespace blocks;
signed main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
n=read(); q=read(); init(); prework();
while(q--){
int x=read(),y=read();
write(query(x,y),'\n');
}
return 0;
}
/*
3 6
wwq
eew
qwe
1 2
2 3
1 3
2 1
3 2
3 1
*/
T4显然也是我整的
\(NB\)题,看不大懂。%战神就完了。
2021.10.9考试总结[NOIP模拟72]的更多相关文章
- 2021.10.15考试总结[NOIP模拟77]
\(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...
- 2021.10.18考试总结[NOIP模拟76]
T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...
- 2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...
- 2021.10.11考试总结[NOIP模拟74]
T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...
- 2021.10.7考试总结[NOIP模拟71]
信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.6.29考试总结[NOIP模拟10]
T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
随机推荐
- 回收Windows 10恢复分区之后的磁盘空间
我电脑上安装了Windows 10和Linux双系统,现在将Linux删除之后,准备将其磁盘空间并入到Windows 10的C盘中,但是发现C盘跟Linux空间之间还隔了一个Windows的恢复分区, ...
- k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)
目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...
- Jmeter系列(26)- 常用逻辑控制器(5) | 循环控制器Loop Controller
循环控制器(Loop Controller) 字面意思,循环该控制器下的请求 设定固定循环次数,或者一直循环 同线程组的循环是父子关系,大家可以试下,如果线程组设置了一直循环,而循环控制器设置了2次, ...
- Jmeter系列(11)- 自动化压力测试逻辑思路及例子
为什么需要进行自动化压力测试 手动逐步加压,需要人工改变并发数,还要等待.所有,我们完全可以制定好策略,让程序自动加压,自动等待,输出报告 实现思路 Jmeter脚本(.jmx文件)- 压测逻辑 Sh ...
- [转载]CentOS 7 用户怎样安装 LNMP(Nginx+PHP+MySQL)
关于 Nginx (发音 "engine x")这是一款免费.开源.高效的 HTTP 服务器,Nginx是以稳定著称,丰富的功能,结构简单,低资源消耗.本教程演示如何在CentOS ...
- P2179-[NOI2012]骑行川藏【导数,二分】
正题 题目链接:https://www.luogu.com.cn/problem/P2179 题目大意 给出\(E\)和\(n\)个\(s_i,k_i,u_i\)求一个序列\(v_i\)满足 \[\s ...
- 基于 Ubuntu 21.04 BPF 开发环境全攻略
本文地址:https://www.ebpf.top/post/ubuntu_2104_bpf_env 1. 系统安装 1.1 Vagrant Vagrant 是一款用于构建及配置虚拟开发环境的软件,基 ...
- Matrix Analysis and Application
Chap 1: Linear Equations and Matrix Linear equations Gaussian elimination Pivot; Triangularize; Back ...
- logback日志入门超级详细讲解
基本信息 日志:就是能够准确无误地把系统在运行状态中所发生的情况描述出来(连接超时.用户操作.异常抛出等等): 日志框架:就是集成能够将日志信息统一规范后输出的工具包. Logback优势 Logba ...
- Java字符串的初始化与比较
Java字符串的初始化与比较 简单的总结:直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中:使用new关键字初始化字符串时,是在堆栈区存放变量名和内容:字符 ...