思路

update 11.2 树状数组AC

本题莫队过不去,会TLE

但也是个不错的莫队练手题

毕竟Chen_Zhe还给了100分莫队分 (还会给你小对勾)

莫队&&树状数组代码

// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2e6 + 7;
int n, m, a[maxn], sum[maxn << 1];
struct edge {
int size,las1,las2;
} zz[maxn];
int ans[maxn];
struct node {
int s, t,id;
bool operator < (const node b ) const {
return t < b.t;
}
} b[maxn]; int read() {
int x = 0, f = 1; char s = getchar();
for (; s < '0' || s > '9'; s = getchar()) if (s == '-') f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
} int lowbit(int x) {
return x & -x;
} void add(int x, int dat) {
for (; x <= n; x += lowbit(x))
sum[x] += dat;
} int query(int x) {
int ans = 0;
for (; x >= 1; x -= lowbit(x))
ans += sum[x];
return ans;
} int main() {
n = read();
m = read();
m=read();
for (int i = 1; i <= n; ++i)
a[i] = read();
for (int i = 1; i <= m; ++i)
b[i].s = read(), b[i].t = read(), b[i].id = i;
sort(b + 1, b + 1 + m);
int js = 1;
for (int i = 1; i <= n; ++i) {
if(!zz[a[i]].size) {
zz[a[i]].las1=i;
} else {
if(zz[a[i]].size>=2)
add(zz[a[i]].las2,-1);
add(zz[a[i]].las1,1);
swap(zz[a[i]].las1,zz[a[i]].las2);
zz[a[i]].las1=i;
}
++zz[a[i]].size;
if(b[js].t==i) {
int end_ans=query(b[js].t);
for(; b[js].t==i; ++js) {
ans[b[js].id]=end_ans-query(b[js].s-1);
}
}
}
for (int i = 1; i <= m; ++i) {
printf("%d\n", ans[i]);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 2000007
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {
if(s=='-') f=-1;
s=getchar();
}
while('0'<=s&&s<='9') {
x=x*10+s-'0';
s=getchar();
}
return x*f;
}
int n,m,k,now;
int a[maxn];
int belong[maxn];
int vis[maxn];
int ans[maxn];
struct node{
int l,r,id;
}q[maxn];
inline bool cmp(const node &a,const node &b)
{
return belong[a.l]==belong[b.l] ? a.r<b.r : belong[a.l]<belong[b.l];
}
inline void Add(int x)
{
vis[x]==1 ? ++now : now;
++vis[x];
}
inline void Delet(int x)
{
vis[x]==2 ? --now : now;
--vis[x];
}
int main()
{
n=read();
int meiyongdebianliang_qidaotixingfanweidezuoye__233zhemechangdebianliangming=read();
m=read();
k=sqrt(n);
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=n;++i)
belong[i]=(i-1)/k+1;
for(int i=1;i<=m;++i)
{
q[i].l=read();
q[i].r=read();
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;++i)
{
while(l > q[i].l) Add(a[--l]);
while(l < q[i].l) Delet(a[l++]);
while(r < q[i].r) Add(a[++r]);
while(r > q[i].r) Delet(a[r--]);
ans[q[i].id]=now;
}
for(int i=1;i<=m;++i)
printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
  2. 338. Counting Bits
  3. grunt学习笔记
  4. sass/less/stylus css编译
  5. js完美转换阿拉伯数字为数字大写(原创)
  6. Swift闭包
  7. CSS3卡片旋转效果
  8. 触发UIButton长按事件
  9. 华为路由器AR1220F-S的端口映射NAT配置(拨号光纤上网)
  10. 各种语言一句话反弹shell
  11. CSS选择器:伪类(图文详解)
  12. 3.3.4 PCI设备进行DMA写时发生Cache命中
  13. SSM的搭建
  14. unity3d 代码动态添加,修改BoxCollider2D
  15. sharepoint 2007页面显示真实的错误信息
  16. 多线程中使用CheckForIllegalCrossThreadCalls = false访问窗口
  17. 小程序 canvas实现图片预览,图片保存
  18. 多媒体指令(AVX加速数组求和)
  19. 使用 IntraWeb (22) - 基本控件之 TIWCalendar
  20. windows多线程窗口程序设计

热门文章

  1. Java中的反射机制(一)
  2. wordpress如何正确自动获取中文日志摘要
  3. URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)
  4. Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
  5. XenServer:使用XenCenter开设VPS(多图完整版)
  6. docker命令及操作
  7. react native 示例代码
  8. photoshop打造超酷炫火焰人像效果
  9. Dapper Extensions中修改Dialect
  10. C#导出Excel总结