NOIP模拟82
T1 魔法
解题思路
发现选择情况无非就是两种,连续的一段或者间隔为 \(R+B\) 的倍数的一段。
直接对于原序列贪心,每次选择可以消除的部分并将其删掉。
对于合法的情况将操作倒序输出即可。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<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=1e5+10;
int n,r,b,head,tail,cntr,cntb,que[N];
char ch[N];
vector<int> ans;
void print()
{
printf("YES\n%lld",n/(r+b));
for(int i=n-1;~i;i--)
{
if((n-i-1)%(r+b)==0) printf("\n");
printf("%lld ",ans[i]);
}
}
bool solve_front()
{
multiset<int> res;
for(int i=1;i<=n;i++) res.insert(i);
while(res.size())
{
bool flag=false; head=1; tail=cntr=cntb=0;
for(auto it=res.begin();it!=res.end();it++)
{
int i=(*it); que[++tail]=i; cntr+=(ch[i]=='R'); cntb+=(ch[i]=='B');
if(tail>r+b) cntr-=(ch[que[head]]=='R'),cntb-=(ch[que[head]]=='B'),head++;
if(cntr==r&&cntb==b&&tail>=r+b){flag=true;break;}
}
if(!flag) return false;
for(int i=head;i<=tail;i++)
ans.push_back(que[i]),
res.erase(res.find(que[i]));
}
return true;
}
#undef int
int main()
{
#define int long long
freopen("magic.in","r",stdin); freopen("magic.out","w",stdout);
n=read(); r=read(); b=read(); scanf("%s",ch+1);
for(int i=1;i<=n;i++) cntr+=(ch[i]=='R'),cntb+=(ch[i]=='B');
if((!r&&cntr)||(!b&&cntb)) printf("NO"),exit(0);
if((r&&cntr%r)||(b&&cntb%b)) printf("NO"),exit(0);
if(solve_front()) print();
else printf("NO");
return 0;
}
T2 连通性
解题思路
\(f(n,m)\) 表示 \(n,m\) 对应的答案, \(g(n)\) 表示点数为 \(n\) 的合法无向图的个数。
\(g(n)\) 可以通过容斥求出来,钦定枚举 1 所在联通块的点的大小
\]
对于 \(f(n,m)\) 的转移考虑两种情况
全部是没有循环到的点的联通块: \(\sum\limits_{i=1}^m f(n-i,m-i)\binom{m-1}{i-1}\)
计算联通块内有循环到的点的情况钦定 \(n\) 节点在最后一个: \(\sum\limits_{i=1}^m\sum\limits_{j=1}^{n-m}f(n-i-j,m-j)\binom{m-1}{i-1}\binom{n-m}{j}g(j)\times(2^j-1)^i\times 2^{\frac{(i-1)i}{2}}\)
第二个柿子的后半部分就是联通块内与外面的有连边的点数方案数,以及所连的点的方案数。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<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=110,mod=1e9+7;
int T,n,m,p2[N*N],f[N][N],g[N],h[N][N],fac[N],ifac[N];
int C(int x,int y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
int power(int x,int y,int p=mod)
{
int temp=1;
while(y)
{
if(y&1) temp=temp*x%p;
x=x*x%p; y>>=1;
}
return temp;
}
int dfs(int n,int m)
{
if(~f[n][m]) return f[n][m];
if(!m) return f[n][m]=p2[n*(n-1)/2];
int rec=0;
for(int i=1;i<=m;i++) rec=(rec+dfs(n-i,m-i)*C(m-1,i-1))%mod;
for(int i=1;i<=m;i++) for(int j=1;j<=n-m;j++) rec=(rec+dfs(n-i-j,m-i)*C(m-1,i-1)%mod*C(n-m,j)%mod*h[i][j])%mod;
return f[n][m]=rec;
}
#undef int
int main()
{
#define int long long
freopen("floyd.in","r",stdin); freopen("floyd.out","w",stdout);
memset(f,-1,sizeof(f)); f[1][0]=f[0][0]=f[1][1]=1;
fac[0]=ifac[0]=p2[0]=1; for(int i=1;i<=100;i++) fac[i]=fac[i-1]*i%mod;
ifac[100]=power(fac[100],mod-2); for(int i=99;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
for(int i=1;i<=10000;i++) p2[i]=p2[i-1]*2%mod;
for(int i=1;i<=100;i++) g[i]=p2[i*(i-1)/2];
for(int i=1;i<=100;i++) for(int j=1;j<i;j++) g[i]=(g[i]-g[j]*p2[(i-j)*(i-j-1)/2]%mod*C(i-1,j-1)%mod+mod)%mod;
for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) h[i][j]=g[j]*power(p2[j]-1,i)%mod*p2[i*(i-1)/2]%mod;
T=read(); while(T--) n=read(),m=read(),printf("%lld\n",dfs(n,m));
return 0;
}
T3 矩形
解题思路
发现对于 L 以及 R 所对应的数字可以通过二分求出来。
直接枚举所有的数字,查询排名在 L 和 R 之间的数字,向 L,R 中间填就好了
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<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=3e5+10,INF=1e18,Lim=3e5*1e9;
int n,L,R,top,sta[N],s[N],l[N],r[N];
vector<int> ans;
int S(int x){return x<=0?0:x*(x+1)/2;}
int g(int w,int l,int r){return S(w)-S(w-l-1)-S(w-r-1)+S(w-l-r-2);}
int work(int x){if((--x)<=0)return 0;int sum=0;for(int i=1;i<=n;i++) sum+=g(min(x/s[i],r[i]-l[i]+1),i-l[i],r[i]-i);return sum;}
int divide(int num)
{
int li=0,ri=Lim,ans=0;
while(li<=ri)
{
int mid=(li+ri)>>1;
if(work(mid)<num) li=mid+1,ans=mid;
else ri=mid-1;
}
return ans;
}
#undef int
int main()
{
#define int long long
freopen("rectangle.in","r",stdin); freopen("rectangle.out","w",stdout);
n=read(); for(int i=1;i<=n;i++) s[i]=read(); L=read(); R=read();
sta[++top]=l[1]=1;
for(int i=2;i<=n;i++)
{
while(top&&s[i]<s[sta[top]]) r[sta[top--]]=i-1;
l[i]=sta[top]+1; sta[++top]=i;
}
while(top) r[sta[top--]]=n;
int posl=divide(L),posr=divide(R),ending=min(R,work(posl+1));
for(int i=L;i<=ending;i++) ans.push_back(posl);
for(int i=1;i<=n;i++)
{
int up=max(r[i]-i+1,i-l[i]+1),down=min(r[i]-i+1,i-l[i]+1);
int fro=posl/s[i]+1,to=min(r[i]-l[i]+1,(posr-1)/s[i]),cnt;
for(int j=fro;j<=to;j++)
{
cnt=(j<=down)?j:(j<=up?down:r[i]-l[i]-j+2);
while(cnt--) ans.push_back(j*s[i]);
}
}
while(ans.size()<=R-L) ans.push_back(posr); sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) printf("%lld ",ans[i]);
return 0;
}
T4 排列
大坑未补
NOIP模拟82的更多相关文章
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- sql 语句系列(每个季度的开始日期和结束日期)[八百章之第二十二章]
前言 基本上统计财务一定会用到. mysql select QUARTER(ADDDATE(y.dy,-1)) QTR, DATE_ADD(y.dy,INTERVAL -3 MONTH) Q_star ...
- Faiss 向量库编译安装
Faiss 是 Facebook 开源的一套高效相似性搜索以及向量聚类的开发库,支持各类相似性搜索的算法,Faiss 项目本身是使用 C++ 编写的,但是提供 Python 的绑定,可以直接使用 nu ...
- WebRTC获取IP地址问题,Uncaught TypeError: Cannot read property '1' of null
WebRTC获取IP地址问题,Uncaught TypeError: Cannot read property '1' of null 临时接了个任务,客户要求某个账号只能在某个ip或者mac上登录, ...
- Oracle邮件发送(内容中带有收件人独有信息)
Oracle邮件发送(内容中带有收件人独有信息) Oracle邮件发送(内容中带有收件人独有信息) Oracle发送邮件最简单的应该就是用smtp,具体使用和参数讲解我这儿没有 简单来说,发送邮件的思 ...
- 【笔记】oracle INTERSECT指令&邮箱的正则匹配&trim()函数
[笔记]oracle INTERSECT 和 UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的. 不同的地方是, UNION 基本上是一个 OR (如果这个值存 ...
- 【Oracle】Oracle数据库,第N大数据取值
Oracle数据库,第N大数据取值 没想到力扣还有数据库的练习,正好本菜鸡跑过来练手 要显示第二大的数据可以使用order by进行排序,然后用limit对显示的数据进行限制,limit1,1,以此来 ...
- 5年磨一剑|优酷Android包瘦身治理思路全解
简介: 稳定性.性能.包大小,在移动端基础用户体验领域"三分天下",是app承载业务获得稳定.高效.低成本.快速增长的重要基石.其中,包大小对下载转化率.拉新拉活成本等方面的影响至 ...
- 云原生应用实现规范 - 初识 Operator
简介: 本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理,下面让我们来一探究竟吧. 作者 | 匡大虎.阚俊宝 ...
- 基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
简介: 针对VPC FlowLog的五元组和捕获窗口信息,在分析时使用不同时间窗口精度,可能得到不一样的流量特征,本文介绍一种方法将原始采集日志的时间窗口做拆分,之后重新聚合为新的日志做分析,达到更细 ...
- dotnet 在 UOS 统信系统上运行 UNO 程序输入时闪烁黑屏问题
本文记录我在虚拟机内安装了 UOS 统信系统,运行 UNO 的基于 Skia 的 Gtk 应用程序时,在输入的过程中不断窗口闪黑问题 本质上说这个问题和 UNO 毫无关系,这是一个 OpenGL 硬件 ...