[CSP-S模拟测试74]题解
A.梦境
如果不用去重一定要用Multiset……挂30分算是出题人手下留情了。
贪心。把点排序,区间按右端点递增排序。依次考虑每个区间,取能选的最靠左的点即可。multiset维护。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=2e5+5;
int n,m,t[N],vis[N],ans;
struct inv
{
int l,r;
friend bool operator < (const inv &x,const inv &y)
{
return x.r<y.r;
}
}a[N];
multiset<int> s;
multiset<int>::iterator it1,it2;
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
a[i].l=read(),a[i].r=read();
for(int i=1;i<=m;i++)
t[i]=read();
sort(t+1,t+m+1);
for(int i=1;i<=m;i++)
s.insert(t[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(s.empty())break;
it1=s.lower_bound(a[i].l);
it2=s.upper_bound(a[i].r);
if(it1==s.end())continue;
if(it2!=s.begin())it2--;
else continue;
if((*it1)>(*it2))continue;
ans++;
s.erase(it1);
}
cout<<ans<<endl;
return 0;
}
B.玩具
注意问题的转化方式以及辅助数组的正确使用姿势。
比较难的计数往往需要探究已给出条件的一些性质,并把抽象的转移过程具体化。本题的$f[i][j]=g[i-1][j-1]$就是一个很好的例子。
还有就是状态的正确设定,计数一般不会有特别鬼畜的转移方式,所以状态数组的含义十分重要。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=205;
ll n,mod;
ll dp[N][N],g[N][N],f[N][N],inv[N];
// dp:in the 1st tree
// f:tree's depth <=j
// g:forest's depth <=j
ll qpow(ll a,ll b)
{
ll res=1;a=a%mod;
while(b)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
scanf("%lld%lld",&n,&mod);
dp[1][1]=f[1][0]=1;
for(int i=1;i<=n;i++)
inv[i]=qpow(i,mod-2);
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=(dp[i-1][j-1]*1LL*(j-1)%mod*inv[i]%mod+dp[i-1][j]*1LL*(i-j)%mod*inv[i]%mod)%mod;
for(int i=0;i<=n;i++)
g[0][i]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++)
{
if(j)f[i][j]=g[i-1][j-1];
for(int k=1;k<=i;k++)
(g[i][j]+=f[k][j]*g[i-k][j]%mod*dp[i][k]%mod)%=mod;
}
ll ans=0;
for(int i=1;i<=n;i++)
(ans+=(f[n][i]-f[n][i-1]+mod)%mod*i%mod)%=mod;
cout<<ans<<endl;
return 0;
}
C.飘雪圣域
森林的联通块个数=点数-边数,记住了!!
上次考场能YY出来这次却想不到QAQ……
那么对于每次询问,点数已知,只需要求出这些点之间有多少边即可。
设一条边连接了$x$和$y$。那么把边排序,以$x$为下标把$y$上传到主席树上,每次查询区间有多少数 $\leq y$即可。
连图都不用建2333
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
} const int N=2e5+5;
int n,Q;
struct edge
{
int x,y;
friend bool operator < (const edge &a,const edge &b)
{
return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
}e[N<<1];
int root[N<<5],ls[N<<5],rs[N<<5],size[N<<5],pos[N],type;
void update(int &k,int l,int r,int old,int val)
{
k=++type;
ls[k]=ls[old];rs[k]=rs[old];
size[k]=size[old]+1;
if(l==r)return ;
int mid=l+r>>1;
if(val<=mid)update(ls[k],l,mid,ls[old],val);
else update(rs[k],mid+1,r,rs[old],val);
}
int query(int k,int l,int r,int val)
{
if(l==r)return size[k];
int mid=l+r>>1;
if(val<=mid)return query(ls[k],l,mid,val);
else return size[ls[k]]+query(rs[k],mid+1,r,val);
}
int main()
{
n=read();Q=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
e[i]=(edge){min(x,y),max(x,y)};
}
sort(e+1,e+n);
for(int i=1;i<n;i++)
{
update(root[i],1,n,root[i-1],e[i].y);
if(!pos[e[i].x])pos[e[i].x]=i;
}
pos[n]=n;root[n]=root[n-1];
for(int i=n;i;i--)
if(!pos[i])pos[i]=pos[i+1];
while(Q--)
{
int l=read(),r=read();
int lc=pos[l],rc=pos[r];
int num=query(root[rc],1,n,r)-query(root[lc-1],1,n,r);
printf("%d\n",r-l+1-num);
}
return 0;
}
[CSP-S模拟测试74]题解的更多相关文章
- csps模拟测试74梦境,玩具,飘雪圣域题解
题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...
- [考试反思]1015csp-s模拟测试74:压迫
其实同时也是第27,一大片并列的. 真的是越考越烂. T1是个弱化的贪心原题,15分钟拿下没什么可说的. T2打的记忆化搜索,hash_mod太小撞哈希了,50->30 T3,想不到正解,90分 ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
随机推荐
- python的前景
最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Python的整体语言难度来讲又比Java简单的很多.尤其是在运维的应用 ...
- PHP_CodeIgniter 细节
下载压缩包解压之后, 可以在 application/config/config.php 中修改配置信息,包括编码,目录地址 web目录默认是system,后台目录默认是Application, 可以 ...
- jvm(4) 对象创建
1.对象的创建过程: 1.new 类名 2.根据new的参数在常量池中定位一个类的符号的引用. 3.如果没找到这个符号的引用,说明类还没有被加载.则进行类的加载,解析和初始化 4.虚拟机为对象分配内存 ...
- Day9---Python的集合类
集合类 1.生成办法: 可使用{.....} 或者set()生成集合,例如 a = {23,214,34,324,234,34} #这里的集合就是数学上的集合a = set('dsfasfsdf') ...
- Kernel Page Global Directory (PGD) of Page table of Process created in Linux Kernel
Kernel Page Global Directory (PGD) of User process created 在早期版本: 在fork一个进程的时候,必须建立进程自己的内核页目录项(内核页目录 ...
- Codeforces - 1191B - Tokitsukaze and Mahjong - 模拟
https://codeforces.com/contest/1191/problem/B 小心坎张听的情况. #include<bits/stdc++.h> using namespac ...
- 克隆虚拟机(centos7)
当我们做分布式测试时,需要多个节点(虚拟机),除了一个个虚拟机重新安装外,还可以从一个虚拟机镜像克隆出新的虚拟机 本例中要从名为master1的虚拟机克隆一个名为node1的 输入新的虚拟机名称和文件 ...
- CodeForces 711D Directed Roads (DFS找环+组合数)
<题目链接> 题目大意: 给定一个$n$条边,$n$个点的图,每个点只有一条出边(初始状态),现在能够任意对图上的边进行翻转,问你能够使得该有向图不出先环的方案数有多少种. 解题分析: 很 ...
- SQL SERVER添加表注释、字段注释
--为字段添加注释 --Eg. execute sp_addextendedproperty 'MS_Description','字段备注信息','user','dbo','table','字段所属的 ...
- 【JAVA】eclipse-使用入门及常用快捷键
目录 下载与安装 HelloWorld 新建项目 视图与视窗 快捷键 个性化设置 导入项目 jar包 下载与安装 下载 网址:官网下载 注意: 下载javaee版 注意与本机的java环境相匹配,32 ...