CF-1860C Game on Permutation题解
题意:在一条数轴上,Alice可以跳到在你所在点前面且值比当前所在点小的点。每回合可以向任意符合要求的点跳一次。当轮到Alice的回合同时不存在符合要求的点,Alice就赢了。Alice可以选择一个点作为起始点,然后作为后手(赛时这里把我坑了)。问有多少个点是必胜的点。 \(n\leq 3\times 10^5\)
首先看一眼 \(n\) 的范围,基本可以猜出复杂度为 \(O(n\log n)\) 或 \(O(n\sqrt n)\) 的。
题目要求有几个必胜的点,可以枚举每个点,再以 \(O(\log n)\) 或 \(O(\sqrt n)\) 的时间解决。
怎么知道一个点是必胜还是必负呢?分两种情况讨论。
一、这个点不能再向其他点跳
显然,若Alice选择了这个点,那Bob就是赢家,这对Alice来说就是必负的点。
二、这个点可以跳向数个知道结果的点
无论是Alice还是Bob,再轮到时都想让其变为一个必胜点,怎么做到呢,将可以跳的必负点留给对手。而前面可以跳的点都是必胜点,那么这个点也只能必负了。也就是说,只要前面有一个必负点,那这个点就必胜,
接下来就能解决问题了:
对于一,我们可以用前缀最小值来知道这是不是该种情况的点。
对于二,我们可以将必胜标记为0,必负标记为1,若可以跳的点的标记之和不为0,即是必胜点,否则是必负点。可以用权值线段树或树状数组,从前往后处理,当一个点必负时,将其加入线段树或树状数组。注意,一中的必负点也需要加入线段树或树状数组中。
并不喜闻乐见的代码时间
点击查看代码
#include<bits/stdc++.h>
#define fo(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define Ts template<typename Ty,typename... Ar>
#define Tp template<typename Ty>
#define ll long long
#define RS register
#define gc getchar
#define pc putchar
#define I inline
using namespace std;
Tp I Ty wmax(Ty a,Ty b){return a>=b? a:b;}
Tp I Ty wmin(Ty a,Ty b){return a<=b? a:b;}
namespace WrongIO
{
Tp I void read(Ty &x){x=0;Ty opt=1;char c=gc();while(!isdigit(c)&&c!='-')c=gc();if(c=='-')opt=-1,c=gc();while(isdigit(c))x=(x<<3)+(x<<1),x+=c-'0',c=gc();x*=opt;return;}
Tp I void write(Ty x){short OI_USE[50],OI_top=0;if(x<=0) if(x==0)pc('0');else pc('-'),x*=-1;while(x)OI_USE[++OI_top]=x%10,x/=10;while(OI_top--)pc(OI_USE[OI_top+1]+'0');return;}
I void writec(char c[]){int len=strlen(c);for(int i=0;i<len;i++)pc(c[i]);}
I void writes(string s){int len=s.length();for(int i=0;i<len;i++)pc(s[i]);}
I void readc(char &c,int l,int r){c=gc(); while(c!=EOF&&(c<l||c>r)) c=gc();}
I void readc(char &c,char val){c=gc();while(c!=EOF&&c!=val) c=gc();}
I void readc(char val){char c;c=gc();while(c!=EOF&&c!=val) c=gc();}
I void readls(string &s){char c=gc();while(c!='\n') s.push_back(c),c=gc();}
Ts I void read(Ty &x,Ar &...y) {read(x),read(y...);}
} using namespace WrongIO;
ll T,n;
ll st[300050];
ll lowbit(ll x)
{
return x&-x;
}
void add(ll x)
{
for(;x<=n;x+=lowbit(x))
st[x]+=1;
}
ll que(ll x)
{
ll sum=0;
for(;x;x-=lowbit(x))
sum+=st[x];
return sum;
}
ll e[300050];
ll minx[300050];
int main()
{
read(T);
while(T--)
{
memset(st,0,sizeof(st));
memset(minx,0x3f,sizeof(minx));
ll ans=0; read(n);
for(int i=1;i<=n;i++) read(e[i]),minx[i]=wmin(e[i],minx[i-1]);
for(int i=1;i<=n;i++)
{
if(que(e[i])>0||e[i]==minx[i]) ans++;
else add(e[i]);
}
write(n-ans),pc('\n');
}
return 0;
}
//好不容易CF上了青,结果洛谷被JC了,大号没了(悲)
CF-1860C Game on Permutation题解的更多相关文章
- CF Educational Round 78 (Div2)题解报告A~E
CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students 依题意模拟即可 #include<bits/stdc++.h> us ...
- CF 1141C Polycarp Restores Permutation
Description An array of integers p1,p2,…,pnp1,p2,…,pn is called a permutation if it contains each nu ...
- 【CF1443E】Long Permutation 题解(排列生成模板)
原题链接 题意简介 给定一个长度为 n 的排列 {1,2,3,...,n} .现有两种操作: 对某个区间 [l,r] 求和 将排列往后推 x 次 (按字典序) 其中 \(n,q \leq 2\time ...
- 坑爹CF April Fools Day Contest题解
H - A + B Strikes Back A + B is often used as an example of the easiest problem possible to show som ...
- cf B. Levko and Permutation
http://codeforces.com/contest/361/problem/B #include <cstdio> #include <cstring> #includ ...
- CF 148D Bag of mice 题解
题面 这是我做的第一道概率DP题: 做完后发现没有后效性的DP是真的水: 在这里说主要是再捋顺一下思路: 设f[i][j]表示有i只白鼠,j只黑鼠是获胜的概率: 显然:f[i][0]=1; 然后分四种 ...
- CF 11D A Simple Task 题解
题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数: 具体的转移方程和细节请看代码: PS:(i& ...
- CF 500B New Year Permutation
传送门 题目大意 给你一个数列,再给你一个矩阵,矩阵的(i,j)如果为1就表示可以将i,j位置上的数交换,问任意交换之后使原数列字典序最小并输出. 解题思路 因为如果i与j能交换,j与k能交换,那么i ...
- CF 938D Buy a Ticket 题解
题目 Musicians of a popular band "Flayer" have announced that they are going to "make t ...
- 【Codeforces】CF Round #592 (Div. 2) - 题解
Problem - A Tomorrow is a difficult day for Polycarp: he has to attend \(a\) lectures and \(b\) prac ...
随机推荐
- Django4全栈进阶之路3 apps.py 文件
在 Django 4 中,每个应用(app)都需要定义一个 apps.py 文件,用于配置应用的基本信息,如应用的名称.显示名称.图标.默认路径.启动时需要执行的操作等.apps.py 文件是一个 P ...
- GRPC与 ProtoBuf 的理解与总结
转载请注明出处: 1.GRPC 官网:https://www.grpc.io/ gRPC 官方文档中文版:http://doc.oschina.net/grpc RPC 框架的目标就是让远程服务调用更 ...
- springboot~国际化Locale正确的姿势
Java中的Locale.getDefault()获取的是操作系统的默认区域设置,如果需要获取客户端浏览器的区域设置,可以从HTTP头中获取"Accept-Language"的值来 ...
- 有关ODOO的ORM操作
1.查询操作 sale_id = self.env['sale.order'].search([]) env将对象实例化,search进行搜索,可以根据需求添加搜索条件 search_count([] ...
- CentOS7环境编译python3.9版本pjsua
环境:CentOS 7.6_x64 Python版本 :3.9.12 pjsip版本:2.13 一.背景描述 pjsip地址:https://www.pjsip.org/ GitHub地址:https ...
- CSS中常见的场景实现
如何实现两栏布局 实现两栏布局一般指的是左边固定,右边自适应,这里给出几个案例给大家参考 直接使用 calc 计算 right 宽度 .left { width: 200px; background: ...
- malloc/free 与 new/delete
malloc/free与new/delete表达式的区别?相同点: 都是用来申请堆空间不同点: 1. malloc/free是库函数; new/delete是表达式 2. malloc开空间时,并不会 ...
- 给你的 Discord 接入一个既能联网又能画画的 ChatGPT
如果有这样一款 Discord 机器人,它既能访问互联网,又能绘画,还能给 YouTube 视频提供摘要.最重要的是,它是完全免费的,不需要提供 OpenAI 的 API Key,我就问你香不香? 现 ...
- Linux系统运维之Hadoop、Hive、Flume数据处理
配置环境 主机名 IP 备注 Hadoop-Data01 192.168.0.194 Hadoop-Master/Hive/Mysql/Flume-Agent Hadoop-Data02 192.16 ...
- 记一次DNS问题排查
一.问题:域名flow.nzkong.com解析很慢: 排查过程 抓包分析:tcpdump -i eth0 -n -s 500 port domain 1 14:40:44.548553 IP 10. ...