「NOI2017」整数 解题报告
「NOI2017」整数
有一些比较简单的\(\log^2n\)做法
比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位的影响只有区间覆盖,通过线段树上二分可以得到区间覆盖的位置,然后暴力区间覆盖即可。
反正我这种菜鸡大常数写法只得到了68分..
考虑利用势能,注意到如果同时改变加法和减法,势能很容易被\(b\)搞掉
如果分开维护加法和减法,把位置上的\(1\)的个数当做势能,可以发现,暴力修改是均摊\(O(n\log a)\)的
直接暴力维护两个数组\(plu\)和\(dec\)
考虑单点求值,因为保证了\(x\ge 0\)
所以我们发现只需要两个条件就可以确定第\(k\)位的值,即
- \(ans_1=[plu_k=dec_k]\)
- \(ans_2=[plu[k-1,1]\ge[dec[k-1,1]]]\),这里是倒着进行字符串比较的意思
第\(k\)位的答案即为\(ans_1 \ xor \ ans_2\),这里讨论一下就可以得到了
考虑找到\(\le p\)位置的两个数组第一个不同的位置,然后比较大小
一个暴力的想法是,把每个不同的位置塞到set里面去,然后每次在set里面二分找一下位置,也是\(\log^2n\)的
考虑到每次修改的一个长为\(\log a\)连续的区间(这里实际上饶了一个大圈子)
所以把区间每\(\log a\)分一块,块也是有势能的,然后set里面一次赛一个块就可以了
复杂度就一个\(\log\)了
Code:
#include <cstdio>
#include <cctype>
#include <set>
#include <algorithm>
#define ll long long
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
int f=0;x=0;char c=gc();
while(!isdigit(c)) f|=c=='-',c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
if(f) x=-x;
}
const int N=1e6+10;
int n,t1,t2,t3;
int plu[N*30],dec[N*30],bel[N*30];
int edt[N],vis[N];
std::set <int> s;
std::set <int>::iterator it;
int qry(int p)
{
while(p%32!=0&&plu[p]==dec[p]) --p;
if(plu[p]!=dec[p])
{
if(plu[p]>dec[p]) return 1;
else return 0;
}
p=bel[p];
it=s.upper_bound(p);
if(s.empty()||it==s.begin()) return 1;
--it;
p=(*it)*32;
while(plu[p]==dec[p]) --p;
if(plu[p]>dec[p]) return 1;
else return 0;
}
int main()
{
read(n),read(t1),read(t2),read(t3);
int m=n*30+31,T=(m-1)/32+1;
for(int L,R=0,i=1;i<=T;i++)
{
L=R+1,R=i*32;
for(int j=L;j<=R;j++) bel[j]=i;
}
for(int op,a,b,k,i=1;i<=n;i++)
{
read(op);
if(op==1)
{
edt[0]=0;
read(a),read(b);
if(a>0)
{
for(int p,j=1;j<=30;j++)
if(a>>j-1&1)
{
p=j+b;
if(vis[bel[p]]!=i)
edt[++edt[0]]=bel[p],vis[bel[p]]=i;
while(plu[p])
{
plu[p++]=0;
if(vis[bel[p]]!=i)
edt[++edt[0]]=bel[p],vis[bel[p]]=i;
}
plu[p]=1;
}
}
else
{
a=-a;
for(int p,j=1;j<=30;j++)
if(a>>j-1&1)
{
p=j+b;
if(vis[bel[p]]!=i)
edt[++edt[0]]=bel[p],vis[bel[p]]=i;
while(dec[p])
{
dec[p++]=0;
if(vis[dec[p]]!=i)
edt[++edt[0]]=bel[p],vis[bel[p]]=i;
}
dec[p]=1;
}
}
for(int j=1;j<=edt[0];j++)
{
int L=(edt[j]-1)*32+1,R=edt[j]*32,flag=1;
for(int l=L;l<=R;l++)
if(plu[l]!=dec[l])
{
flag=0;
break;
}
if(flag)
{
if(s.find(edt[j])!=s.end()) s.erase(edt[j]);
}
else
s.insert(edt[j]);
}
}
else
{
read(k);
int p=k++;
int ans=0;
if(plu[k]==dec[k]) ans=1;
printf("%d\n",ans^qry(p));
}
}
return 0;
}
2019.5.31
「NOI2017」整数 解题报告的更多相关文章
- 「NOI2017」蔬菜 解题报告
「NOI2017」蔬菜 首先考虑流 可以从 \(s\) 流入表示得到蔬菜,流出到 \(t\) 表示卖出蔬菜,给每个蔬菜拆点,并给它它每天应得的蔬菜. 但是我们没办法直接给,注意到如果把变质看成得到并可 ...
- 「NOI2017」游戏 解题报告
「NOI2017」游戏 \(d\)这么小,你考虑直接对\(d\)个东西暴力 枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-s ...
- LibreOJ2302 - 「NOI2017」整数
Portal Description 有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作: 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\( ...
- 「ZJOI2016」旅行者 解题报告
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...
- 「HAOI2018」染色 解题报告
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...
- 「HNOI2016」最小公倍数 解题报告
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...
随机推荐
- @RequestParam和@PathVariable的区别
一:@RequestParam @RequestParam是传递参数的. @RequestParam用于将请求参数区数据映射到功能处理方法的参数上. public Object Login(@Requ ...
- sql server 2000安装程序配置服务器失败
第一种方法 今天安装SQL Server 2000遇到了个很BT的问题,提示出下: 安装程序配置服务器失败.参考服务器错误日志和C:\Windows\sqlstp.log了解更多信息. 以前进安装目录 ...
- html中ul,ol和li的区别
ul是无序列表,全称是unordered list,先来个例子: ●张三 ●李四 ●王二 ●刘五 ol是有序列表 ,全称是ordered list,同样举个例子: 1.张 ...
- python类与对象练习题扑克牌
#定义一个扑克类,属性是颜色,数字.#定义一个手类,属性是扑克牌得颜色数字#定义一个人类,属性是左手,右手.类里定义一些方法,比如交换,展示 class Poker : def __init__(se ...
- 北风设计模式课程---外观模式(Facade)总结
北风设计模式课程---外观模式(Facade)总结 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备 ...
- Chrome-谷歌页面翻译增强插件开发
最近想做一个 Chrome 的插件(看别的博客说其实叫插件不准确,应该叫拓展,大家叫习惯了就按习惯的来吧).一开始咱先直接看了[Chrome 开发(360 翻译)](http://open.chrom ...
- jmeter添加自定义扩展函数之Strng---base64解密
1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...
- DIV置底层或置最高层的方法下拉菜单被挡住
网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告微信开店等. 解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=& ...
- Python3学习(18)--偏函数(Partial) --转载存地址
由于最近出差,没有时间更, 倒不是忙,而是费心,项目其实并不难,主要是涉及钱的地方谈技术略显苍白:没有技术解决不了的问题,但是钱没到位,没人愿意无偿给你提供技术,算是停更一周后的,吐槽吧. 赶上今天 ...
- CSS实现文字阴影的效果
CSS中有两种阴影效果,一种是DropShadow(投影),另一种是Shadow(阴影).1.DropShadow语法:{FILTER:DropShadow(Color=color,OffX=offX ...