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 ...
随机推荐
- weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394 简介 Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP.T ...
- Apollo 配置中心详细教程
一.简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...
- nuxt.js同路由跳转参数不同,mounted不执行时
watch: { '$route'(to, from) { if (to.fullPath !== from.fullPath) { this.$nextTick(() => { // 不加th ...
- Java基础系列(33)- 计算器
package method; import java.util.Scanner; public class Demo09 { static double result; static String ...
- 配置阿里云maven
在安装好Maven之后,默认的~/.m2目录下是没有maven仓库配置文件settings.xml的,默认使用的是官方的仓库,访问速度会非常慢,我们需要配置下国内的仓库. 创建~/.m2/settin ...
- php 常用算法与函数
1.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- python3中文乱码解决方法
解决方法: 修改pycharm配置: File->Settings->Editor->File encodings 把Global encoding设置成GBK即可
- MyBatis-Plus代码生成器的使用
1.MyBatis-Plus简介 在代码开发中,肯定会遇到代码中对应数据库表去编写实体类的工作,若数据库表数量多的情况下,编写Entity,属实是一件消耗时间,且并没有什么技术含量的事情,如何解决 ...
- CF917D-Stranger Trees【矩阵树定理,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/CF917D 题目大意 给出\(n\)个点的一棵树,对于每个\(k\)求有多少个\(n\)个点的树满足与给出的树恰好有 ...
- 实验4:开源控制器实践——OpenDaylight
实验4:开源控制器实践--OpenDaylight 一.实验目的 能够独立完成OpenDaylight控制器的安装配置: 能够使用Postman工具调用OpenDaylight API接口下发流表. ...