NOIP模拟89(多校22)
T1 谜之阶乘
解题思路
二分答案,发现 \(a-b\) 至多为 19,毕竟 \(20!\) 已经大于 \(10^{18}\) 了。
对于每一种可能的差值,每一次二分 \(b+1\) 直接枚举乘积进行 check。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int T,n,fac[20];
inline int work(int x,int cnt)
{
__int128 temp=1;
for(int i=1;i<=cnt;i++)
{
temp*=x+i-1;
if(temp>n) return 1;
}
if(temp==n) return 0;return -1;
}
void solve()
{
n=read(); if(n==1) return printf("-1\n"),void();
vector<pair<int,int> > ans;
for(int cnt=1;cnt<=19&&fac[cnt]<=n;cnt++)
{
int l=2,r=n-cnt+1,temp=-1;
while(l<=r)
{
int mid=(l+r)>>1,t=work(mid,cnt);
if(!t){temp=mid;break;}
if(t==-1) l=mid+1; else r=mid-1;
}
if(~temp) ans.push_back(make_pair(temp+cnt-1,temp-1));
}
sort(ans.begin(),ans.end()); printf("%lld\n",(int)ans.size());
for(auto it :ans) printf("%lld %lld\n",it.first,it.second);
}
#undef int
int main()
{
#define int long long
freopen("factorial.in","r",stdin); freopen("factorial.out","w",stdout);
T=read(); fac[0]=1;
for(int i=1;i<=19;i++) fac[i]=fac[i-1]*i;
while(T--) solve();
return 0;
}
T2 子集
解题思路
假设每个集合的大小是 \(cnt\) 那么对于 \(cnt\) 是偶数的情况是可以直接对于奇偶按照不同的顺序来填就行。
那么对于 \(n\) 是偶数但是 \(cnt\) 是奇数的情况可以证明是不可行的。
然后对于 \(k,cnt\) 都是奇数的情况发现每个集合的前三个如果可以成功的排布,那么剩下的按照偶数的情况处理就好了。
对于第一列直接 \(1,2,3...n\) 顺序排布就好了,第二列先向 \(\frac{k+1}{2}+1\sim k\) 这一段区间从大到小填,然后再从大到小填 \(1\sim\frac{k+1}{2}\) 这一段区间就好了。
对于剩下的一列直接根据前两列的情况补上就好了。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
#define count __builtin_popcountll
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10;
int T,n,m,cnt;
vector<int> ans[N];
void work1(int bas,int all)
{
for(int i=1;i<=all;i++)
if(i&1) for(int j=1;j<=m;j++) ans[j].push_back(++bas);
else for(int j=m;j>=1;j--) ans[j].push_back(++bas);
}
void work2(int bas=0)
{
for(int i=1;i<=m;i++) ans[i].push_back(++bas);
for(int i=m/2+2;i<=m;i++) ans[i].push_back(++bas);
for(int i=1;i<=m/2+1;i++) ans[i].push_back(++bas);
for(int i=1;i<=m;i++) ans[i].push_back(3*(3*m+1)/2-ans[i][0]-ans[i][1]);
}
void solve()
{
n=read(); m=read(); cnt=n/m;
if(m==1){printf("Yes\n");for(int i=1;i<=n;i++)printf("%lld ",i);putchar('\n');return ;}
if(n%2==0&&cnt%2) return printf("No\n"),void();
if(cnt%2&&cnt<3) return printf("No\n"),void();
for(int i=1;i<=m;i++) vector<int>().swap(ans[i]); printf("Yes\n");
if(cnt%2==0) work1(0,cnt);
else work2(),work1(3*m,cnt-3);
for(int i=1;i<=m;i++)
{
for(auto it:ans[i]) printf("%lld ",it);
putchar('\n');
}
}
#undef int
int main()
{
#define int long long
freopen("subset.in","r",stdin); freopen("subset.out","w",stdout);
T=read(); while(T--) solve();
return 0;
}
T3 混凝土粉末
解题思路
询问本质是:作若干次区间加,并询问 \(x\) 位置上的值最早 \(\ge y\) 的时间。
于是我们可以选择主席树,然后暴力二分+主席树可以达到 \(O(qlog^2n)\) 的复杂度,然后就会被卡常。
考虑一种离线做法,我们对于每一次插入操作 \((l,r,h)\) 分别在 \(l,r+1\) 两个地方记录下一个二元组 \((id,h)\) 。
然后扫描线扫 \(1\sim n\) 这个序列,用建立在操作标号上对于高度进行维护的树状数组或者线段树来处理答案。
这样我们就有了对于每一个下标而言所有有影响的操作的相对时间关系以及对应高度。
每次二分查找一个答案下标 \(mid\) 用树状数组查找 \(mid\) 操作以及以前操作所达到的高度 check。
这就是二分树状数组,由于常数优秀因此可以卡过,线段树或者树状数组二分也是类似的思路。
code
超大常数主席树
#include<bits/stdc++.h>
#define ll long long
#define ls tre[x].l
#define rs tre[x].r
using namespace std;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10;
int n,q,all,rt,root[N],id[N]; ll cnt;
struct Segment_Tree
{
struct Node{int l,r;ll dat;}tre[N*35];
inline int insert(register int pre,register int l,register int r,register int L,register int R,register int val)
{
register int x=++all,mid=(l+r)>>1; tre[x]=tre[pre];
if(L<=l&&r<=R) return tre[x].dat+=val,x;
if(L<=mid) ls=insert(tre[pre].l,l,mid,L,R,val);
if(R>mid) rs=insert(tre[pre].r,mid+1,r,L,R,val);
return x;
}
inline void query(register int x,register int l,register int r,register int pos)
{
if(!x||l==r) return cnt+=tre[x].dat,void(); register int mid=(l+r)>>1;
if(pos<=mid) return cnt+=tre[x].dat,query(ls,l,mid,pos),void();
return cnt+=tre[x].dat,query(rs,mid+1,r,pos),void();
}
}T;
int main()
{
freopen("concrete.in","r",stdin); freopen("concrete.out","w",stdout);
n=read(); q=read();
for(register int i=1,opt,x,z;i<=q;i++)
{
ll y; opt=read(); x=read(); y=read(); cnt=0;
if(opt==1){z=read();id[++rt]=i;root[rt]=T.insert(root[rt-1],1,n,x,y,z);continue;}
T.query(root[rt],1,n,x); if(cnt<y){printf("0\n");continue;}
register int l=0,r=rt,ans=0;
while(l<=r)
{
register int mid=(l+r)>>1; cnt=0; T.query(root[mid],1,n,x);
if(cnt>=y) ans=id[mid],r=mid-1; else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}
二分树状数组
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10;
int n,q,cnt,ans[N];
vector< pair<int,int> > v[N],ask[N];
struct BIT
{
int lim,tre[N];
#define lowbit(x) (x&(-x))
inline void insert(int x,int val){for(int i=x;i<=lim;i+=lowbit(i))tre[i]+=val;}
inline int query(int x){int sum=0;for(int i=x;i;i-=lowbit(i))sum+=tre[i];return sum;}
}T;
#undef int
int main()
{
#define int long long
freopen("concrete.in","r",stdin); freopen("concrete.out","w",stdout);
n=read(); q=read(); T.lim=q; memset(ans,-1,sizeof(ans));
for(int i=1,opt,x,y,z;i<=q;i++)
{
opt=read(); x=read(); y=read();
if(opt==2){ask[x].push_back(make_pair(i,y));continue;}
z=read(); v[x].push_back(make_pair(i,z));
v[y+1].push_back(make_pair(i,-z));
}
for(int i=1;i<=n;i++)
{
for(auto it:v[i]) T.insert(it.first,it.second);
for(auto it:ask[i])
{
int l=1,r=it.first; ans[it.first]=0;
while(l<=r)
{
int mid=(l+r)>>1,temp=T.query(mid);
if(temp>=it.second) ans[it.first]=mid,r=mid-1;
else l=mid+1;
}
}
}
for(int i=1;i<=q;i++) if(~ans[i]) printf("%lld\n",ans[i]);
return 0;
}
T4 排水系统
解题思路
考虑边 \((x,y)\) 堵塞所造成的影响。
其实就是对于 \(x\) 的其他出点的贡献增加了,而对于 \(y\) 的减少了。
相当于我们可以对于 \(x\) 点加上贡献然后在 \(y\) 点减去就好了。
具体实现就是先忽略所有老化的情况,算出每个点应该有污水,然后依次为基础算出每个点的初始期望污水。
最后在跑一遍就好了。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=2e5+10,M=5e5+10,mod=998244353;
int n,m,base,sta[N],r,ed,cnt[N],du[N],f[N],g[N];
int tot,head[N],ver[M],nxt[M],edge[M],fro[M];
void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
void add_edge(int x,int y,int val)
{
ver[++tot]=y; edge[tot]=val;
fro[tot]=x; du[y]++; cnt[x]++;
nxt[tot]=head[x]; head[x]=tot;
}
int power(int x,int y,int p=mod)
{
int temp=1;
for(;y;y>>=1,x=x*x%p)
if(y&1) temp=temp*x%p;
return temp;
}
#undef int
int main()
{
#define int long long
freopen("water.in","r",stdin); freopen("water.out","w",stdout);
n=read(); m=read(); r=read(); ed=read();
for(int i=1,x,y,val;i<=ed;i++)
{
x=read(); y=read(); val=read();
add_edge(x,y,val); add(base,val);
}
int top=0,pos=0; base=power(base,mod-2);
for(int i=1;i<=m;i++) sta[++top]=i;
while(top<n)
{
int x=sta[++pos];
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i]; du[to]--;
if(!du[to]) sta[++top]=to;
}
}
for(int i=1;i<=m;i++) f[i]=1;
for(int i=1;i<=n;i++)
{
int x=sta[i],temp=power(cnt[x],mod-2)*f[x]%mod;
for(int j=head[x];j;j=nxt[j]) add(f[ver[j]],temp);
}
for(int i=1;i<=n;i++)
{
if(!cnt[i]) continue;
int temp=f[i]*power(cnt[i]-1,mod-2)%mod;
for(int j=head[i];j;j=nxt[j])
{
add(g[i],temp*edge[j]%mod*base%mod);
add(g[ver[j]],(mod-temp%mod)*edge[j]%mod*base%mod);
}
}
for(int i=1;i<=m;i++) add(g[i],1);
for(int i=1;i<=n;i++)
{
int x=sta[i],temp=power(cnt[x],mod-2)*g[x]%mod;
for(int j=head[x];j;j=nxt[j]) add(g[ver[j]],temp);
}
for(int i=n-r+1;i<=n;i++) printf("%lld ",g[i]);
return 0;
}
NOIP模拟89(多校22)的更多相关文章
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...
- NOIP模拟赛-2018.10.22
模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...
- NOIP模拟92(多校25)
前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- NOIP模拟85(多校18)
前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...
- NOIP模拟86(多校19)
T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...
- NOIP模拟88(多校21)
前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...
- NOIP模拟96(多校29)
T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...
- NOIP模拟99(多校31)
T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...
随机推荐
- CTFshow命令执行29-123
命令执行 WEB29 eval是php中执行以PHP脚本执行的命令 PHP命令可以执行脚本命令 本题使用方法是先 system(cp f*.php 1.txt) 然后访问1.txt WEB30 在PH ...
- mac版本vscode窗口崩溃crashed
1.截图 出现时机 当安装依赖的时候大概率会出现,甚至安装一次依赖会出现几次 解决 具体原因未知 重新启动电脑以及退出软件都不能解决 去官网重新下载,重新安装问题解决
- 【笔记】go语言--接口
[笔记]go语言--接口 接口的概念 强类型语言:熟悉接口的概念 弱类型语言:没(少)有接口的概念 接口的详解︰使用Google Guice实现依赖注入 curl 是获取http请求的命令工具 cur ...
- 力扣387(java)-字符串中的第一个唯一字符(简单)
题目: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode"输出: 0示例 2: 输 ...
- 写给大家看的“不负责任” K8s 入门文档
前言 2019 年下半年,我做了一次转岗,开始接触到 Kubernetes,虽然对 K8s 的认识还非常的不全面,但是非常想分享一下自己的一些收获,希望通过本文能够帮助大家对 K8s 有一个入门的了解 ...
- 现代斗山X瓴羊:“一横四纵“解决方案聚焦中台场景级部署
简介: 经过充分的调研后,现代斗山IT团队和业务团队,与瓴羊数据中台项目组一起完成了涵盖客户.商机.设备等多层面的问题梳理及痛点分析,并借助于瓴羊Dataphin+Quick BI+Quick Aud ...
- 一个好的科技公司logo长这样!
简介:一个好的科技logo能体现出行业独有的专业性和技术优势,让你的公司科技感加满! 近年来,越来越多的初创公司崭露头角,其中科技互联网公司的比重非常高.小云也收到很多朋友的留言,询问科技类公司应该 ...
- 阿里开源支持10万亿模型的自研分布式训练框架EPL(EasyParallelLibrary)
简介:EPL背后的技术框架是如何设计的?开发者可以怎么使用EPL?EPL未来有哪些规划?今天一起来深入了解. 作者 | 王林.飒洋 来源 | 阿里技术公众号 一 导读 最近阿里云机器学习PAI平 ...
- 每次都需要解释大量指令?使用 PolarDB-X 向量化引擎
简介: 向量化引擎为PolarDB-X的表达式计算带来了显著的性能提升. 介绍 PolarDB-X是阿里巴巴自研的云原生分布式数据库,采用了计算-存储分离的架构,其中计算节点承担着大量的表达式计算任务 ...
- GitHub 的 Action 判断仅在主仓库才执行脚本
我有一个 GitHub 项目,这个项目配置了仅需要在源仓库才能执行的 Action 如推送 NuGet 等发布动作.如何在 Action 里面设置让 Fork 的仓库不执行 Action 的步骤 想要 ...