5.26 NOI 模拟
\(T1\)石子与HH与HHの取
博弈是不可能会的
\(c_i\)相等,比较显然的\(Nim,\)直接前缀异或求一下
\(a_i=1,\)区间长度对\(2\)取模
结论\(:\)黑色石子严格大于白色个数先手赢
反证,小于等于的话,我们后手肯定存在策略使自己异或和不为\(0\)
特殊情况,先手只有一堆,并且后手此时异或和为\(0,\)寄
讨论完之后用简单数据结构维护即可
\(T2\)离子王国
能想到扫描线就比较显然了
结论很好猜\(:\)当\(k\)在最大值和最小值之间的时候有解
//考场上已经想到求区间最大最小解决了(不会维护)
//扫描线之类的题我还是不是很会
//首先我们线段树维护的是我们插入后面每个l的历史最大值
//我们只需要查区间最小最大及出现位置即可啦,感觉很强,我考场上离正解就差一步扫描线
#include<bits/stdc++.h>
#define MAXN 500005
using namespace std;
const int INF=0x3f3f3f3f;
template<class T>
T Read()
{
T x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^'0');
ch=getchar();
}
return x*f;
}
int (*read)()=Read<int>;
#define read Read<int>
struct Que
{
int l,r,k,id,res;
}que[MAXN];
int n,m,s[MAXN],val[MAXN];
vector<int>poz[MAXN];
namespace Seg
{
#define ls (x<<1)
#define rs ((x<<1)|1)
int lz[MAXN<<1],Max[MAXN<<1],Min[MAXN<<1],TagMax[MAXN<<1],TagMin[MAXN<<1];
int SumMax[MAXN<<1],SumMin[MAXN<<1];
void Init(){for(int i=1;i<2*MAXN;i++) TagMax[i]=Max[i]=-INF,TagMin[i]=Min[i]=INF;}
void pd(int x,int l,int r)
{
if(l==r)
{
lz[x]=0,TagMax[x]=-INF,TagMin[x]=INF;
return ;
}
//关于这个历史最大值最小值
//每个时刻的Tag/Sum都记录一下
Max[ls]=max(Max[ls],SumMax[ls]+TagMax[x]);
Min[ls]=min(Min[ls],SumMin[ls]+TagMin[x]);
SumMax[ls]+=lz[x];
SumMin[ls]+=lz[x];
TagMax[ls]=max(TagMax[ls],lz[ls]+TagMax[x]);
TagMin[ls]=min(TagMin[ls],lz[ls]+TagMin[x]);
lz[ls]+=lz[x];
Max[rs]=max(Max[rs],SumMax[rs]+TagMax[x]);
Min[rs]=min(Min[rs],SumMin[rs]+TagMin[x]);
SumMax[rs]+=lz[x];
SumMin[rs]+=lz[x];
TagMax[rs]=max(TagMax[rs],lz[rs]+TagMax[x]);
TagMin[rs]=min(TagMin[rs],lz[rs]+TagMin[x]);
lz[rs]+=lz[x];
lz[x]=0,TagMax[x]=-INF,TagMin[x]=INF;
}
void push_up(int x)
{
SumMax[x]=max(SumMax[ls],SumMax[rs]);
SumMin[x]=min(SumMin[ls],SumMin[rs]);
Max[x]=max(Max[ls],Max[rs]);
Min[x]=min(Min[ls],Min[rs]);
}
void change(int x,int l,int r,int L,int R,int v)
{
pd(x,l,r);
if(l>=L&&r<=R)
{
SumMax[x]+=v;
SumMin[x]+=v;
Max[x]=max(Max[x],SumMax[x]);
Min[x]=min(Min[x],SumMin[x]);
lz[x]+=v;
TagMax[x]=max(TagMax[x],lz[x]);
TagMin[x]=min(TagMin[x],lz[x]);
return ;
}
int mid=(l+r)>>1;
if(L<=mid)change(ls,l,mid,L,R,v);
if(R>mid) change(rs,mid+1,r,L,R,v);
push_up(x);
}
int query(int x,int l,int r,int L,int R,int v)
{
if(l==r) return l;
pd(x,l,r);
int mid=(l+r)>>1;
if(l<=mid&&Min[ls]<=v&&Max[ls]>=v) return query(ls,l,mid,L,R,v);
else if(R>mid&&Min[rs]<=v&&Max[rs]>=v) return query(rs,mid+1,r,L,R,v);
return INF;
}
}
void Tr_change(int x)
{
int f=val[s[x]];
for(int i=0;i<poz[s[x]].size();i++)
{
if(poz[s[x]][i]>x) Seg::change(1,1,n,poz[s[x]][i-1],poz[s[x]][i]-1,f),f*=-1;;
}
}
int main()
{
freopen("ion.in","r",stdin);
freopen("ion.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) s[i]=read(),poz[s[i]].push_back(i);
for(int i=1;i<=n;i++) val[i]=read(),poz[i].push_back(n+1);
Seg::Init();
for(int i=1;i<=m;i++)
{
que[i].l=read();que[i].r=read();que[i].k=read();
que[i].id=i;
}
sort(que+1,que+1+n,[=](Que a,Que b){return a.l<b.l;});
int now=n;
for(int i=m;i>=1;i--)
{
while(now>=que[i].l) Tr_change(now--);
que[i].res=Seg::query(1,1,n,que[i].l,n,que[i].k);
if(que[i].res>que[i].r) que[i].res=-1;
}
sort(que+1,que+1+n,[=](Que a,Que b){return a.id<b.id;});
for(int i=1;i<=m;i++)
{
printf("%d\n",que[i].res);
}
}
\(T3\)优秀
很巧妙的转化
首先,我们变化的是奇偶性不同的相邻同色两点,我们对奇数层染色之后,就变成了,两颜色不同的两点交换颜色,第一问答案就是,每个子树内部黑白差的绝对值,至于证明的话,我们要求的还是颜色翻转,每个点被交换奇数次
不是很会,待补
5.26 NOI 模拟的更多相关文章
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 10.26 noip模拟试题
enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...
- 花海漫步 NOI模拟题
题目好像难以看懂? 题目大意 给出一个字符串\(S\),统计满足以下条件的\((i,j,p,q)\)的数量. \(i \leq j, p \leq q\) \(S[i..j],S[p..q]\)是回文 ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
随机推荐
- MySQL闪回工具之binlog2sql
一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...
- Java实现数据库增删改查
代码示例: import java.sql.*; public class Renewal { // 创建类static Connection con; // 声明Connection对象static ...
- 【单片机】CH32V103串口IDLE空闲中断
CH32V103c8t6 在寻找解决接收完数据后,怎么即时判断数据已经完成了接收.发现串口有一个IDLE空闲中断.如下图描述: 意思是在串口接收完一帧数据 会产生一个中断,此时程序可判断为数据已接收完 ...
- es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es
今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...
- IDEA初始化基础配置
0.前言 这篇博客是给认识的那帮新手搞的,刚进入IT行业的崽们 这个东西配置好了,也可以选择弄成在线文档,下一次安装IDEA时,有一个import导入配置,然后就可以自己配置好了( 虽然方便,但不建议 ...
- SpringSecurity简单入门
1.简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spr ...
- Java命令行传递参数
目录 命令行传参 代码运行 视频 命令行传参 有时候你希望运行一个程序的时候再传递给它消息. 这要靠传递命令行参数给main()函数实现 package com.broky.base; public ...
- Camunda定时器事件示例Demo(Timer Events)
Camunda定时器事件(Timer Events)是由定义的计时器触发的事件.它们可以用作启动事件.中间事件或边界事件.边界事件可以中断,也可以不中断. Camunda定时器事件包括:Timer ...
- RPA人力资源简历筛选机器人
简历自动筛选及分析机器人,支持前程无忧.猎聘 1.自动登录招聘网站 2.自动填充简历筛选条件 3.RPA依次读取所筛选的简历信息 4.自动将简历数据复制到本地文档中 5.完成简历信息收集及分析表 6. ...
- Java中将对象或者集合对象转换成json字符串
1.对象和字符串相互转换 2.集合对象和字符串相互转换