BZOJ 1828

program bzoj1828;
const maxn=100001;
    check=10000000;

type node=record
    l,r,s,a:longint;
end;

var t:array [0..maxn*5] of node;
    a,b,c:array [0..maxn] of longint;
    n,m,i,ans,mini:longint;

procedure swap(var x,y:longint);
begin
  x:=x xor y;
  y:=x xor y;
  x:=x xor y;
end;

procedure qsort(l,r:longint);
var i,j,mia,mib:longint;
begin
  i:=l; j:=r;
  mia:=a[(l+r) shr 1]; mib:=b[(l+r) shr 1];
  while i<=j do
    begin
      while (b[i]<mib) or (b[i]=mib) and (a[i]<mia) do inc(i);
      while (b[j]>mib) or (b[j]=mib) and (a[j]>mia) do dec(j);
        if i<=j then
          begin
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            inc(i);
            dec(j);
          end;
    end;
    if i<r then qsort(i,r);
    if j>l then qsort(l,j);
end; 

function min(x,y:longint):longint;
begin
  if x<y then exit(x)
  else exit(y);
end;

procedure build(l,r,i:longint);
var mid:longint;
begin
  t[i].l:=l;
  t[i].r:=r;
  if l=r then
    begin
      t[i].s:=c[l];
      exit;
    end;
    mid:=(l+r)>>1;
    build(l,mid,i<<1);
    build(mid+1,r,i<<1+1);
    t[i].s:=min(t[i<<1].s,t[i<<1+1].s);
end;

procedure pass(i,add:longint);
var lch,rch:longint;
begin
  lch:=i shl 1;
  rch:=lch+1;
  inc(t[lch].s,add);
  inc(t[rch].s,add);
  inc(t[lch].a,add);
  inc(t[rch].a,add);
  t[i].a:=0;
end; 

procedure change(l,r,add,i:longint);
var mid:longint;
begin
  if (t[i].l=l)and(t[i].r=r) then
  begin
    inc(t[i].s,add);
    inc(t[i].a,add);
    exit;
  end;
  if t[i].a<>0 then pass(i,t[i].a);
    mid:=(t[i].l+t[i].r)>>1;
  if r<=mid then change(l,r,add,i<<1)
    else
  if l>mid then change(l,r,add,i<<1+1)
    else
    begin
        change(l,mid,add,i<<1);
        change(mid+1,r,add,i<<1+1);
    end;
    t[i].s:=min(t[i<<1].s,t[i<<1+1].s);
end; 

function getans(l,r,i:longint):longint;
var mid,ans1,ans2:longint;
begin
  if t[i].a<>0 then pass(i,t[i].a);
  if (t[i].l=l)and(t[i].r=r) then exit(t[i].s);
  ans1:=check;
  ans2:=check;
  mid:=(t[i].l+t[i].r)>>1;
  if r<=mid then ans1:=getans(l,r,i<<1)
  else
  if l>mid then ans2:=getans(l,r,i<<1+1)
  else
    begin
      ans1:=getans(l,mid,i<<1);
      ans2:=getans(mid+1,r,i<<1+1);
    end;
  exit(min(ans1,ans2));
end; 

begin
  read(n,m);
  for i:=1 to n do read(c[i]);
  build(1,n,1);
  for i:=1 to m do read(a[i],b[i]);
  sort(1,m);
  for i:=1 to m do
    begin
      mini:=getans(a[i],b[i],1);
      if mini>0 then
        begin
          inc(ans);
          change(a[i],b[i],-1,1);
        end;
    end;
  writeln(ans);
end.
时间: 2024-12-11 12:11:02

BZOJ 1828的相关文章

BZOJ 1828: [Usaco2010 Mar]balloc 农场分配

Description Input 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i Output * 第一行: 一个整数表示最多能够被满足的要求数 题解: 将请求按右端点排序,然后依次添加,用线段树判断是否能添加,不能的放弃.统计个数即可. 代码: #include<cstdio> #include<cstring> #include<algorithm>

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列

【BZOJ】【1016】【JSOI2008】最小生成树计数

Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的,再加上权值为2和2的,不也满足题意吗?事实上,如果这样的话……最小生成树应该是1和2,而不是1和3或2和2!!! 所以呢?所以对于一个图来说,最小生成树有几条边权为多少的边,都是固定的!所以我们可以做一遍Kruskal找出这些边权,以及每种边权出现的次数.然后,对于每种边权,比方说出现了$v_i$

【BZOJ】【2844】albus就是要第一个出场

高斯消元解XOR方程组 srO  ZYF  Orz 膜拜ZYF…… http://www.cnblogs.com/zyfzyf/p/4232100.html 1 /************************************************************** 2 Problem: 2844 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:252 ms 7 Memory:2052 kb 8 *******