NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记
queen
题目大意:
在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上、下、左、右、左上、左下、右上、右下这\(8\)个方向移动。其中每一个皇后可以攻击这八个方向上离它最近的皇后。
求有多少皇后被攻击到\(0,1,\ldots,8\)次。 保证\(m\)个皇后中任意两个不在同一个位置。
思路:
考虑左右方向的攻击,对每一行开一个set
,按列编号插入,看一下是否存在前驱/后继即可。其余方向同理。
时间复杂度\(\mathcal O(m\log m)\)。
源代码:
#include<set>
#include<cstdio>
#include<cctype>
#include<climits>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1;
int n,m,cnt[N],t[N],x[N],y[N];
std::set<int> s[N*2];
inline void reset() {
for(register int i=1;i<=n*2;i++) {
s[i].clear();
s[i].insert(INT_MIN);
s[i].insert(INT_MAX);
}
}
inline int query(const int &x,const int &y) {
int ret=0;
if(*--s[x].lower_bound(y)!=INT_MIN) ret++;
if(*s[x].upper_bound(y)!=INT_MAX) ret++;
return ret;
}
int main() {
n=getint(),m=getint();
for(register int i=1;i<=m;i++) {
x[i]=getint();
y[i]=getint();
}
reset();
for(register int i=1;i<=m;i++) {
s[x[i]].insert(y[i]);
}
for(register int i=1;i<=m;i++) {
cnt[i]+=query(x[i],y[i]);
}
reset();
for(register int i=1;i<=m;i++) {
s[y[i]].insert(x[i]);
}
for(register int i=1;i<=m;i++) {
cnt[i]+=query(y[i],x[i]);
}
reset();
for(register int i=1;i<=m;i++) {
s[x[i]+y[i]].insert(y[i]);
}
for(register int i=1;i<=m;i++) {
cnt[i]+=query(x[i]+y[i],y[i]);
}
reset();
for(register int i=1;i<=m;i++) {
s[x[i]-y[i]+n].insert(y[i]);
}
for(register int i=1;i<=m;i++) {
cnt[i]+=query(x[i]-y[i]+n,y[i]);
}
for(register int i=1;i<=m;i++) {
t[cnt[i]]++;
}
for(register int i=0;i<=8;i++) {
printf("%d%c",t[i]," \n"[i==8]);
}
return 0;
}
ladder
题目大意:
最开始有\(4\)个梯子,高度都为\(n(n\le1000)\),也就是每个梯子都有\(n\)层脚蹬的横木。小明想要对梯子进行改造(撤掉一些脚蹬用的横木),要满足以下两个条件。
- 撤掉一些横木之后,要保证每一层\(4\)个梯子中有且仅有\(1\)个梯子在这一层是有横木的。
- 梯子上面连向房顶,小明希望存在至少一个梯子能通过它爬到房顶(不能爬的过程中转换梯子),其中小明每次能至多爬\(h(h\le30)\)的高度,也就是从地面上(地面高度为\(0\))可以达到高度为\(1\sim h\)的横木上,以及只可以从\(n-h+1\sim n\)高度的横木上爬到房顶(房顶高度为\(n+1\))上去。
也就是说在撤掉一些横木之后,要求存在一个梯子,它的剩下的第一个横木是不超过\(h\)的高度,剩下的最后一个横木是大于等于\(n-h+1\)的高度,中间的任意两个相邻剩下的横木之间相差高度不超过\(h\)。
小明现在想知道满足条件的撤横木的方案数,答案对\(10^9+9\)取模。 其中两个方案不同当且仅当:存在某一层在两个方案当中,他们各自保留的那一根横木在不同的梯子上。
思路:
\(f[i][dis_1][dis_2][dis_3][dis_4]\)表示考虑完前\(i\)个位置,\(dis_j\)表示第\(j\)个梯子上最上面的踏板到当前位置的距离。
这样是\(\mathcal O(nh^4)\)的。
考虑要保证有一个梯子是可以登顶的,因此我们可以用\(f[i][0/1][dis_2][dis_3][dis_4]\)表示前\(i\)个位置,第\(1\)个梯子是否是通的,\(dis_j\)与之前的状态相同。
显然\(4\)个梯子是平等的,因此最后将答案\(\times4\)。
时间复杂度\(\mathcal O(nh^3)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1001,M=31,mod=1e9+9;
int f[N][2][M][M][M];
inline void inc(int &x,const int &y) {
(x+=y)%=mod;
}
int main() {
const int n=getint(),m=getint();
f[1][1][1][1][1]=1;
for(register int i=1;i<n;i++) {
for(register int j=1;j<=m;j++) {
for(register int k=1;k<=m;k++) {
for(register int l=1;l<=m;l++) {
inc(f[i+1][1][std::min(j+1,m)][std::min(k+1,m)][std::min(l+1,m)],f[i][1][j][k][l]),
inc(f[i+1][0][std::min(j+1,m)][std::min(k+1,m)][std::min(l+1,m)],f[i][0][j][k][l]);
inc(f[i+1][j<m][1][std::min(k+1,m)][std::min(l+1,m)],f[i][1][j][k][l]);
inc(f[i+1][j<m][m][std::min(k+1,m)][std::min(l+1,m)],f[i][0][j][k][l]);
inc(f[i+1][k<m][std::min(j+1,m)][1][std::min(l+1,m)],f[i][1][j][k][l]),
inc(f[i+1][k<m][std::min(j+1,m)][m][std::min(l+1,m)],f[i][0][j][k][l]);
inc(f[i+1][l<m][std::min(j+1,m)][std::min(k+1,m)][1],f[i][1][j][k][l]),
inc(f[i+1][l<m][std::min(j+1,m)][std::min(k+1,m)][m],f[i][0][j][k][l]);
}
}
}
}
int ans=0;
for(register int i=1;i<=m;i++) {
for(register int j=1;j<=m;j++) {
for(register int k=1;k<=m;k++) {
(ans+=f[n][0][i][j][k])%=mod;
(ans+=f[n][1][i][j][k])%=mod;
}
}
}
ans=(ans-f[n][0][m][m][m]+mod)%mod;
ans=(int64)ans*4%mod;
printf("%d\n",ans);
return 0;
}
color
题目大意:
给定一串\(n\)个珠子,其中每一个珠子的颜色为\(a_i\),总共有\(k\)类颜色珠子标号从\(1\)到\(k\)。
初始给定一个参数\(T\)。询问再给定\(m\)个区间\(l_i\)到\(r_i\),每次询问这个区间有多少颜色的珠子出现了恰好\(T\)次。
\(n,m,k,T\le5\times10^5\)
思路:
将询问离线,枚举右端点。新加入一个右端点\(r\)时,假设离\(r\)第\(t\)近的同色位置为\(q\),第\(t+1\)近的是\(q\),则当\(r\)是右端点时,\((p,q]\)的点都可以作为左端点,线段树维护即可。
时间复杂度\(\mathcal O((n+m)\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5e5+1,M=5e5;
int a[N],ans[M];
struct Query {
int l,r,id;
bool operator < (const Query &rhs) const {
return r<rhs.r;
}
};
Query q[M];
std::vector<int> v[N];
class SegmentTree {
#define _left <<1
#define _right <<1|1
#define mid ((b+e)>>1)
private:
int val[N<<2];
public:
void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const int &v) {
if(b==l&&e==r) {
val[p]+=v;
return;
}
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),v);
if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r,v);
}
int query(const int &p,const int &b,const int &e,const int &x) const {
int ret=val[p];
if(b==e) return ret;
if(x<=mid) ret+=query(p _left,b,mid,x);
if(x>mid) ret+=query(p _right,mid+1,e,x);
return ret;
}
#undef _left
#undef _right
#undef mid
};
SegmentTree sgt;
int main() {
const int n=getint(),m=getint(),k=getint(),t=getint();
for(register int i=1;i<=k;i++) v[i].push_back(0);
for(register int i=1;i<=n;i++) a[i]=getint();
for(register int i=0;i<m;i++) {
q[i].l=getint();
q[i].r=getint();
q[i].id=i;
}
std::sort(&q[0],&q[m]);
for(register int i=1,j=0;i<=n;i++) {
const int tmp=v[a[i]].size();
v[a[i]].push_back(i);
if(tmp>=t+1) sgt.modify(1,1,n,v[a[i]][tmp-t-1]+1,v[a[i]][tmp-t],-1);
if(tmp>=t) sgt.modify(1,1,n,v[a[i]][tmp-t]+1,v[a[i]][tmp-t+1],1);
for(;j<m&&q[j].r==i;j++) ans[q[j].id]=sgt.query(1,1,n,q[j].l);
}
for(register int i=0;i<m;i++) {
printf("%d\n",ans[i]);
}
return 0;
}
NOI.AC NOIP模拟赛 第六场 游记的更多相关文章
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- [NOI.AC 2018NOIP模拟赛 第三场 ] 染色 解题报告 (DP)
题目链接:http://noi.ac/contest/12/problem/37 题目: 小W收到了一张纸带,纸带上有 n个位置.现在他想把这个纸带染色,他一共有 m 种颜色,每个位置都可以染任意颜色 ...
- NOI.AC NOIP模拟赛R3解题报告
心路历程 预计得分:\(100+100+50=250\) 实际得分:\(10 +100 +50 = 160\) 三道原题,真好.T2做过,T1写了个错误思路,T3写了写50分状压dp. 整场考试实际在 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
- 东北育才 NOIP模拟赛第1场
终于400了.这套题很鬼畜.两道贪心. GRACE sort过后,不能直接统计,本人毫无多想,相同的直接放在一起.结果太多人AC. SUM sigma+异或和(可使用前缀和处理),本人毫无考虑乱MOD ...
随机推荐
- [转]Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()
Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate() 觉得有用的话,欢迎一起讨论相互学习~Follow Me ...
- python学习笔记6--mockserver
一.mockserver的应用 有时候测试我们需要调用一些三方接口或者未开发完成的接口,完成我们的业务流程测试,但是这时候可能我们只知道接口返回值,接口并没有完全开发完成或可以让我们任意调用,这时候就 ...
- js拾遗: replace 替换参数
先来看一个简单的例子吧. var str = "123X321".replace("X", "$'"); 替换后的 str 是什么呢?是 & ...
- Unity3d 常用代码
//创建一个名为"Player"的游戏物体 //并给他添加刚体和立方体碰撞器. player=new GameObject("Player"); player. ...
- Servlet笔记7--HttpServletRequest介绍
通过HttpServletRequest获取表单提交的数据: 前端页面: <html> <head> <title>register</title> & ...
- 首发:极简的Centos主机监控方法,分分钟即可使用【转】
需求天天有,今年事更多.硬盘测试刚刚完成,就又来了性能监控的需求.一般我们生产就用zabbix了,用起来还行,就是蛮多脚本要写.开发和测试都是分散的,经常还要重装系统,用zabbix就算了,开发和测试 ...
- Flask源码解析:Flask上下文
一.上下文(Context) 什么是上下文: 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行, ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- Python_oldboy_自动化运维之路_线程,进程,协程(十一)
本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程 ...
- .NetCore SkyWalking APM实现服务器监控环境安装及基础使用
下载Java 8 SDK wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fw ...