2017.9.18 数颜色 思考记录
这个题暴力是不是可以过啊,感觉卡卡常数问题不大、
做这个题需要主席树套树状数组或带改莫队,,处于经济考虑,于是学了带改莫队
其实差不多,主体和普通莫队基本一样,就是多了对修改的暴力处理、、
把修改次数作为第三关键字,放到sort里就好了
码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 10005
int cnt,cnt2,da[N],tong[1000005],sy[N],v[N],ans,n,m,kuai,ksh,i,lin[10005],a,b,l,r,t;
char op[5];
struct wen
{int l,r,tm,tmq,daan,id;
}w[N],g[N];bool cmp(wen a,wen b)
{if(sy[a.l]==sy[b.l]){if(sy[a.r]==sy[b.r]){return a.tm<b.tm;}else return sy[a.r]<sy[b.r];}else return sy[a.l]<sy[b.l];
}void calc(int &o,int fx)
{if(fx==-1){tong[v[o-1]]++; if(tong[v[o-1]]==1)ans++;}else{tong[v[o]]--;if(tong[v[o]]==0)ans--; } o+=fx;
}
void carc(int &o,int fx)
{if(fx==-1){tong[v[o]]--;if(tong[v[o]]==0)ans--; }else{tong[v[o+1]]++; if(tong[v[o+1]]==1)ans++; } o+=fx;
}
void cc(int &o,int fx)
{if(fx==-1){
if(l<=g[o].r&&g[o].l<=r)
{tong[v[g[o].l]]--;if(tong[v[g[o].l]]==0)ans--;
}v[g[o].l]=g[o].tmq;if(l<=g[o].r&&g[o].l<=r)
{tong[v[g[o].l]]++;if(tong[v[g[o].l]]==1)ans++;
}
o+=fx;}else{o+=fx;if(l<=g[o].r&&g[o].l<=r)
{tong[v[g[o].l]]--;if(tong[v[g[o].l]]==0)ans--;
}v[g[o].l]=g[o].tm;if(l<=g[o].r&&g[o].l<=r)
{tong[v[g[o].l]]++;if(tong[v[g[o].l]]==1)ans++;
}}}
int main()
{scanf("%d%d",&n,&m);kuai=pow(n,2.0/3);ksh=n/kuai;for(i=1;i<=n;i++){scanf("%d",&v[i]);lin[i]=v[i];sy[i]=i/kuai;if(i/kuai>ksh)sy[i]=ksh; } for(i=1;i<=m;i++){da[i]=-1;scanf("%s",op);if(op[0]=='Q'){scanf("%d%d",&a,&b);++cnt; w[cnt].id=i;w[cnt].l=a;w[cnt].r=b;w[cnt].tm=cnt2;}else{scanf("%d%d",&a,&b);++cnt2; g[cnt2].l=g[cnt2].r=a;g[cnt2].tm=b;g[cnt2].tmq=lin[a];lin[a]=b;} }sort(w+1,w+1+cnt,cmp);l=0;r=0;t=0;for(i=1;i<=cnt;i++){while(t<w[i].tm)cc(t,1);while(t>w[i].tm)cc(t,-1);while(l<w[i].l)calc(l,1);while(l>w[i].l)calc(l,-1);while(r<w[i].r)carc(r,1);while(r>w[i].r)carc(r,-1); w[i].daan=ans; }for(i=1;i<=m;i++){da[w[i].id]=w[i].daan; }for(i=1;i<=m;i++){ if(da[i]!=-1)printf("%d\n",da[i]);}}
2017.9.18 数颜色 思考记录相关推荐
- 2017.9.29 数三角形 思考记录
这个题一看就可以离散. 利用容斥,所以可以用组合数算出所有的三点组合,,再减去在一条线上的点的组合 垂直和水平的好算,斜的就比较繁琐 首先我猜了一个错误的结论:所有直线都可以用左上边界和右下边界的点连 ...
- 2017.3.24 分裂游戏 思考记录
事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了.. 感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...
- 2017.9.28 约数研究 思考记录
这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...
- 2017.4.25 解方程 思考记录
这个题好乱啊..n*m就会炸,每个数还都可能是10^10000..这n*ai tm读进去都要10^6效率 . 一般这种似乎没有任何数论定理的东西范围还这么变态只能考虑随机化算法了.. 似乎可以用取模 ...
- 2017.3.6 地精部落 思考记录
其实这个题第一眼是没有任何思路的 强行无视题解,经过漫长的找规律,终于推出了一个可行的方法: f[i][0/1]i表示最高位的数字,0表示开始是上升,1表示开始是下降. 为什么会推出这个? 1.因为所 ...
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.9 放棋子 思考记录
.这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案 g表示 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
最新文章
- oracle期末重点,oracle期末复习题及答案
- HDU 6143 Killer Names (组合数学+DP)
- instanceof不是根据构造函数进行判断,而是原型链
- 【排错】IDEA 提示 ‘Optional.get()‘ without ‘isPresent()‘ check错误
- redis队列缓存 + mysql 批量入库 + php离线整合
- MySQL 事物隔离级别
- 浅谈Fragment
- Java边缘填充_任意画一个多边形,用边缘填充算法填充
- 自己做的一个水印生成类
- SPSS Modeler 数据审核学习笔记
- 浏览器禁用第三方Cookie
- pt函数html,pt是什么元素?
- 缺少libGeographic.so,导致运行example-Geodesic-small 失败
- 5G NR QC-LDPC MATLAB程序理解
- 知识图谱学习笔记八(知识问答)
- 任正非霸气回应:没有谷歌,华为也能成为世界第一!
- InfoPath 开发
- 个人所得税缴纳税率是多少
- show master status 时没有数据显示
- CIA真是无孔不入 2012年起它们就开始通过路由器搞监控了
热门文章
- 吴恩达 深度学习 编程作业(2-3)- TensorFlow Tutorial
- poj2387TillCowsComHome Dijlstra
- 差分跳频MATLAB,基于Matlab的短波差分跳频通信仿真设计与实现
- 如何在参考文献中优雅地引用URL?How do you get nicely formatted URLs in the bibliography?
- 常用的、现成的!正则表达式及基础知识
- android view setleft,android – 在新textview上使用setLeft / setRight方法
- 详解spring框架入门到精通
- python建立矩阵原理_怎么用python建立矩阵-问答-阿里云开发者社区-阿里云
- html如何在本页路径上拼接参数,Html图片路径拼接参数实现打印导出
- mysql判断可用性,MySQL -- 主從復制的可靠性與可用性