6.17 NOI 模拟
\(T1\ crime\)
计算几何\(+\)最短路,我的写法很麻烦
比较无脑,直接扫一遍判断能否连接即可,需要特别判断对角线的情况
#include<bits/stdc++.h>
#define double long double
#define MAXN 200005
using namespace std;
const double g=9.80665,eps=1e-6,addx=1e-10;
int head[MAXN],nxt[MAXN<<1],to[MAXN<<1],tot;
int dis[MAXN],h[25][25];
int dx,dy,w,v,lx,ly;
void put(double x)
{
printf("%.3f\n",x);
}
bool ck(int x,int y,int xx,int yy,double Sx,double Sy,double t)
{
double Vx=Sx/t;
double Vy=(Sy+0.5*g*t*t)/t;
if(x>xx)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=x;i>xx;i--)
{
double disx=(x-i)*w*1.0+0.5*w;
double disy=disx/Sumx*Sumy;
double nowy=(y-1)*w+0.5*w+(yy>y?1:(yy==y?0:-1))*disy+addx;
int id=(ceil)(nowy/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowy)<eps)
{
zah=1.0*max({h[i][id],h[i][id-1],h[i-1][id],h[i-1][id-1]});
}
else
{
zah=1.0*max(h[i][id],h[i-1][id]);
}
if(peoh<zah) return false;
}
}
if(x<xx)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=x;i<xx;i++)
{
double disx=(i-x)*w*1.0+0.5*w;
double disy=disx/Sumx*Sumy;
double nowy=(y-1)*w+0.5*w+(yy>y?1:(yy==y?0:-1))*disy+addx;
int id=(ceil)(nowy/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowy)<eps)
{
zah=1.0*max({h[i][id],h[i][id-1],h[i+1][id],h[i+1][id-1]});
}
else
{
zah=1.0*max(h[i][id],h[i+1][id]);
}
if(peoh<zah) return false;
}
}
if(y>yy)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=y;i>yy;i--)
{
double disy=(y-i)*w*1.0+0.5*w;
double disx=(disy/Sumy)*Sumx;
double nowx=(x-1)*w+0.5*w+(xx>x?1:(xx==x?0:-1))*disx+addx;
int id=(ceil)(nowx/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowx)<eps)
{
zah=max({h[id][i],h[id-1][i],h[id][i-1],h[id-1][i-1]});
}
else
{
zah=max(h[id][i],h[id][i-1]);
}
if(peoh<zah) return false;
}
}
if(y<yy)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=y;i<yy;i++)
{
double disy=(i-y)*w*1.0+0.5*w;
double disx=(disy/Sumy)*Sumx;
double nowx=(x-1)*w+0.5*w+(xx>x?1:(xx==x?0:-1))*disx+addx;
int id=(ceil)(nowx/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowx)<eps)
{
zah=max({h[id][i],h[id-1][i],h[id][i+1],h[id-1][i+1]});
}
else
{
zah=max(h[id][i],h[id][i+1]);
}
if(peoh<zah) return false;
}
}
return true;
}
bool check(int x,int y,int xx,int yy)
{
double Sx=sqrt(pow((abs(x-xx)*w),2)+pow((abs(y-yy)*w),2));
double Sy=h[xx][yy]-h[x][y];
double det=pow(v*v-g*Sy,2)-g*g*Sy*Sy-g*g*Sx*Sx;
if(det<0) return false;
double t1=sqrt((v*v-Sy*g+sqrt(det))/(0.5*g*g));
double t2=sqrt((v*v-Sy*g-sqrt(det))/(0.5*g*g));
return ck(x,y,xx,yy,Sx,Sy,t1)|ck(x,y,xx,yy,Sx,Sy,t2);
}
int id(int x,int y)
{
return (x-1)*dy+y;
}
void add(int u,int v)
{
tot++;
to[tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void bfs()
{
queue<int>q;
memset(dis,-1,sizeof(dis));
q.push(id(lx,ly));
dis[id(lx,ly)]=0;
while(q.size())
{
int now=q.front();
q.pop();
for(int i=head[now];i;i=nxt[i])
{
int y=to[i];
if(dis[y]==-1)
{
dis[y]=dis[now]+1;
q.push(y);
}
}
}
}
int main()
{
scanf("%d%d%d%d%d%d",&dx,&dy,&w,&v,&lx,&ly);
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
scanf("%d",&h[j][i]);
}
}
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
for(int i1=1;i1<=dy;i1++)
{
for(int j1=1;j1<=dx;j1++)
{
if(i==i1&&j==j1) continue;
if(check(j,i,j1,i1))
{
add(id(j,i),id(j1,i1));
}
}
}
}
}
bfs();
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
if(dis[id(j,i)]==-1) cout<<"X ";
else cout<<dis[id(j,i)]<<" ";
}
cout<<"\n";
}
}
\(T2\ circle\)
猜结论的二次剩余题 \(kill\ me\)
这道题是一个纯纯的结论题
\(bz\)掏出了三个结论:
\(Sit_1:\)
\]
我们记 \(Num(r,p)\)
\\
Num(r,p)=\prod\limits_{}^i Num(r,p_i)
\]
其实考场上靠直觉能猜到的
\(Sit_2:\)
\(r\ne 0\) 值一样,可以打个表观察一下
\]
\(Sit_3:\)
如果 \(-1\) 有在\(\mod p\)二次剩余 \(Num(0,p)=2\times p-1\)
否则 \(Num(0,p)=1\)
一般这种结论题代码都比较简单了
#include<bits/stdc++.h>
#define int long long
#define MAXN 10000005
using namespace std;
int pri[MAXN+5],val[MAXN+5],Mp[MAXN+5],cnt,p,r;
bool vis[MAXN+5];
int my_pow(int a,int b,int p)
{
int res=1;
while(b)
{
if(b&1)
{
res=(res*a)%p;
}
a=(a*a)%p;
b>>=1;
}
return res;
}
void Init()
{
for(int i=2;i<=MAXN;i++)
{
if(!vis[i])
{
pri[++cnt]=i;
if(my_pow(i-1,(i-1)/2,i)==1) val[i]=(2*i-1);
else val[i]=1;
Mp[i]=i;
}
for(int j=1;j<=cnt&&i*pri[j]<=MAXN;j++)
{
vis[i*pri[j]]=true;
Mp[i*pri[j]]=max(Mp[i],pri[j]);
if(i%pri[j]==0) break;
}
}
}
int Num(int r,int p)
{
if(r==0) return val[p];
return (p*p-val[p])/(p-1);
}
// 1 5 0
int dfs(int now)
{
if(now==1) return 1;
int x=now,pr=Mp[now];
while(x%pr==0) x/=pr;
return Num(r%Mp[now],Mp[now])*dfs(x);
}
void sol()
{
scanf("%lld%lld",&p,&r);
cout<<dfs(p)<<"\n";
}
int T;
signed main()
{
scanf("%lld",&T);
Init();
while(T--) sol();
}
\(T3\ crystal\)
和曾经的一道\(CF\)的题有点像
\(\mod 998244353\) 其实感觉像是在提示误导 \(FWT\)
\(a\oplus b=c,a\oplus c=b1\)
我们前\(n-1\)个数任选都不能大于最后选的数的 \(m\) 的话,就可以直接乘法原理了
这就和 \(CF\) 那道题先解除一些数位的限制一样。
考虑,枚举 \(a_p\) 和 \(m_p\) 的最短 \(LCP\), 然后我们这个数系数为 \(1\),其余的数系数相乘即可
具体的,我们只需要让第 \(i\) 位是 \(0\),并且有一个位置 \(p\),\(a_p\) 的第 \(i\) 位是 \(1\) 就可以统计答案了
\(dp[j][k][l]\) 表示第 \(j\) 个数,第 \(i\) 位异或起来为 \(k\) ,有没有钦定 \(p\) 的方案数
考虑 \(m_j\) 第 \(i\) 位为 \(1\),\(a_j\) 可以选 \(0/1\),选 \(0\) 的话贡献的系数是 \(2^i\) ,选 \(1\) 贡献的系数是 \(m\& (2^i-1)+1\),如果确定这一位的话,系数是 \(1\)
#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define MAXN 200005
using namespace std;
const int mod=998244353;
int n,Ans,dat[MAXN];
int dp[2][2][2];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&dat[i]);
Ans^=dat[i];
}
Ans=!Ans;
int Xor=0;
for(int i=31;i>=0;i--)
{
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int j=1;j<=n;j++)
{
int now=(j&1);
int pre=(now^1);
Xor^=(dat[j]>>(i+1));
if(dat[j]>>i&1)
{
for(int k=0;k<=1;k++)
{
for(int l=0;l<=1;l++)
{
(dp[now][k^1][l]=dp[pre][k][l]*((dat[j]&(1<<i)-1)+1)%mod)%=mod;
}
}
for(int k=0;k<=1;k++)
{
(dp[now][k][1]+=dp[pre][k][0]+(ull)(dp[pre][k][1]<<i)%mod)%=mod;
}
}
else
{
for(int k=0;k<=1;k++)
{
for(int l=0;l<=1;l++)
{
(dp[now][k][l]=dp[pre][k][l]*((dat[j]&(1<<i)-1)+1)%mod)%=mod;
}
}
}
}
if(Xor) continue;
//3 1 2 3
Ans=(Ans+dp[n&1][0][1])%mod;
}
cout<<Ans<<"\n";
}
6.17 NOI 模拟的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- 【2018.12.17】NOI模拟赛4
题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
随机推荐
- el-form 中的数组表单验证(数组可动态添加删除)
除了一些简单的表单验证之外,我们还会有一些稍微复杂点的多层级表单的验证,如下图所示可点击添加,删除对数组进行操作,当点击确定时需要验证每一条form-item不能为空 其tempalte部分主要代码如 ...
- CenterNet和CenterNet2笔记
CenterNet和CenterNet2笔记 CenterNet是基于anchor-free的一阶段检测算法 CenterNet2是CenterNet作者基于两阶段的改进 CenterNet(Obje ...
- Win10系统下怎么让局域网内其他电脑通过IP访问网站
最近,有位win10系统用户在电脑上制作好网站后,希望能让局域网内的其他电脑通过IP直接访问自己电脑的网站,以便得到更好地测试效果.可是,该用户操作了很久都没成功.那么,我们如何配置win10电脑的I ...
- 用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性
背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行. 这个规模不算大,测试数据以及库表结构是用Dump ...
- Python数据分析--Numpy常用函数介绍(9)--Numpy中几中常见的图形
在NumPy中,所有的标准三角函数如sin.cos.tan等均有对应的通用函数. 一.利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波器上显示出利萨茹曲线 ...
- 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版
2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...
- .net core 抛异常对性能影响的求证之路
一.前言 在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问.项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题. 查阅了各种文档,微软官 ...
- 开发工具-在线计算MD5
更新记录: 2022年6月8日 更新标题. 2022年6月1日 开始. 都记在这以后就不用到处找了. 在线计算MD5 https://www.sojson.com/md5/ http://www.ip ...
- JS:函数的形参与实参
形参: 函数显式参数在函数定义时列出. 函数调用未传参时,参数会默认设置为: undefined. function fn(a,b,c){ //a,b,c为形参 //此时有一个隐式操作:var a,v ...
- CVPR2022 | 弱监督多标签分类中的损失问题
前言 本文提出了一种新的弱监督多标签分类(WSML)方法,该方法拒绝或纠正大损失样本,以防止模型记忆有噪声的标签.由于没有繁重和复杂的组件,提出的方法在几个部分标签设置(包括Pascal VOC 20 ...