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 ...
随机推荐
- python库--pandas--文本文件读取
.read_table() / read_csv() filepath_or_buffer 文件路径 sep='\t' 分隔符. 设置为N, 将尝试自动确定 delimiter=N sep的备 ...
- java版gRPC实战之三:服务端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ysoserial payloads/JRMPClient
ysoserial payloads/JRMPClient 环境:JDK8u102 payloads/JRMPClient可以配合exploit/JRMPListener模块来使用 1.在自己服务器上 ...
- 【第二十篇】-Maven IntelliJ之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven IntelliJ IntelliJ IDEA 已经内建了对 Maven 的支持.我们在此例中使用的是 IntelliJ IDEA 社区版 11.1. IntelliJ IDEA 的一些特性 ...
- 【转】.net core开发windows服务
.net core开发windows服务 文建Blog
- Android实现自动登录和记住密码
效果图: 在勾选自动登录后下次打开软件会直接跳过登录界面 代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate ...
- 我爬取交通学博士付费的GIS资源,每年被动收入2w很简单?
目录 1.背景介绍 2.技术路线 3.数据结果 4.数据分析 5.总结 6.后记 1.背景介绍 某周末闲来无事,顺手打开了CSDN,看到了一个人发布的收费GIS资源,售价是¥19.9,POI数据也有人 ...
- 【小程序】微信小程序iOS苹果报错“协议错误”
遇到问题 目前正在开发一个小程序,然后苹果真机测试时发现无法授权并提示,errMsg:"request:fail 未能完成该操作.协议错误" 开发环境下测试没问题,安卓机真机测试没 ...
- linux系统运维操作规范
1.1安装流程 1.1.1 系统如无特殊要求一律采用小化安装方式进行安装. 1.1.2 安装过程开始之前需要根据实际情况进行CPU数量.磁盘容量.内存分配.文件系统.目录结构.磁盘分区规划.磁盘管理方 ...
- Windows系统中的SVN使用方法
Windows 下搭建 SVN(3.9版本)服务器 2018年08月11日 12:22:55 Amarao 阅读数 11984 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议, ...