\(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 模拟的更多相关文章

  1. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  2. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  3. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  4. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  5. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  6. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  7. 花海漫步 NOI模拟题

    题目好像难以看懂? 题目大意 给出一个字符串\(S\),统计满足以下条件的\((i,j,p,q)\)的数量. \(i \leq j, p \leq q\) \(S[i..j],S[p..q]\)是回文 ...

  8. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

  9. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

随机推荐

  1. MySQL执行计划explain

    一.简介 分析查询慢的原因,在查询语句前加explain即可.如: 二.输出格式 2.0 测试数据 # 表user_info CREATE TABLE `user_info` ( `id` bigin ...

  2. 手动搭建简易web框架与django框架简介

    目录 纯手写简易web框架 基于wsgiref模块 动静态网页 简单了解jinja2模块 框架请求流程 python主流web框架 django框架 简介 应用app 命令操作django pycha ...

  3. 安装Supervisor到CentOS(YUM)

    Supervisor是一个Linux下进程管理工具. Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为守护进程,并监控进程状态,异常退出时能自动重启,可以 ...

  4. 「JOISC 2019 Day4」蛋糕拼接 3

    loj 3039 NKOJ Description \(n\)个蛋糕,每个蛋糕有\(w_i,h_i\).选\(m\)个蛋糕满足\(\sum\limits_{j=1}^mw_{k_j}-\sum\lim ...

  5. DataX异构数据源离线同步工具json文件配置说明

    DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高效的数据同步功能 ...

  6. Camunda开源流程引擎快速入门——Hello World

    市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.由于jbpm.activiti.flowable这几个流程引擎出现的比较早,国内人用的 ...

  7. C#/VB 数据库连接字符串大全

    C#/VB 数据库连接字符串大全 https://www.connectionstrings.com/ SQL Server常用 Standard Security Server=myServerAd ...

  8. Linux-Centos快速安装Docker

    卸载之前的docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-l ...

  9. 从开发一款基于Vue技术栈的全栈热重载生产环境脚手架,我学到了什么

    浏览文章前 这一期,我分享给大家三点看源码的小技巧,这也是从别的大佬那总结的. 被反复使用的代码 这样的代码是一个软件的重点函数,一个大神的写法有很多精华值得学习. 穿越时间的代码 如果一段代码10年 ...

  10. Python Socket Sever

    1. Server code 1 # !/usr/bin/env python 2 # coding:utf-8 3 import multiprocessing 4 import socket 5 ...