省队集训Day3 light

【问题描述】
“若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她。
对方表现出兴趣的话,那就慢慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简单的
问题,她一定也答不上来。” ——《上古之魔书》

天空中出现了许多的北极光,这些北极光组成了一个长度为 n 的正整数数列 a[i],远古之
魔书上记载到:2 个位置的 graze 值为两者位置差与数值差的和:
graze(x,y)=|x-y|+|a[x]-a[y]|。
要想破解天罚,就必须支持 2 种操作(k 都是正整数):
Modify x k:将第 x 个数的值修改为 k。
Query x k:询问有几个 i 满足 graze(x,i)<=k。
由于从前的天罚被圣王 lmc 破解了,所以 rhl 改进了她的法术,询问不仅要考虑当前数
列,还要考虑任意历史版本,即统计任意位置上出现过的任意数值与当前的 a[x]的 graze 值
<=k 的对数。(某位置多次修改为同样的数值,按多次统计)
【输入格式】
第 1 行两个整数 n,q。分别表示数列长度和操作数。
第 2 行 n 个正整数,代表初始数列。
第 3~q+2 行每行一个操作。
【输出格式】
对于每次询问操作,输出一个非负整数表示答案。
【样例输入】
3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1
【样例输出】
2
3
3

将每个元素看做一个点(x,A[x]),那么也就是询问一个斜着的正方形内有多少个
点;或者修改一个点的 y 值。
把斜着的正方形转成正着的正方形,也就是(x,y)->(x-y,x+y),然后变为查询矩形
内部元素个数。

然后就是CDQ裸题了··

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define maxn 60005
 6 #define maxm 260005
 7 #define maxq 60005
 8 #define lowbit(x) ((x)&(-(x)))
 9 using namespace std;
10 char s[6];
11 int n,q,x,k,cnt,lim,a[maxn],ans[(maxn+maxq)*4];
12 bool bo[maxn+maxq];
13 struct DATA{
14     int num,id,op,x,y,t;
15 }list[(maxn+maxq)*4],p,temp[(maxn+maxq)*4];
16 void add(int op,int id,int x,int y,int k){
17     int xx=x-y,yy=x+y;
18     if (!op) lim=max(lim,xx),lim=max(lim,yy),list[++cnt]=(DATA){cnt,id,op,xx,yy,0};
19     else{
20         int x1=xx-k,y1=yy-k,x2=xx+k,y2=yy+k;
21         if (y1>0) list[++cnt]=(DATA){cnt,id,op,x1-1,y1-1,1};
22         list[++cnt]=(DATA){cnt,id,op,x1-1,y2,-1};
23         if (y1>0) list[++cnt]=(DATA){cnt,id,op,x2,y1-1,-1};
24         list[++cnt]=(DATA){cnt,id,op,x2,y2,1};
25         lim=max(lim,x2),lim=max(lim,y2);
26     }
27 }
28 struct bit{
29     int val[maxm];
30     void insert(int x,int v){for (;x<=lim;x+=lowbit(x)) val[x]+=v;}
31     int query(int x){
32         int ans=0;
33         for (;x;x-=lowbit(x)) ans+=val[x];
34         return ans;
35     }
36 }T;
37 void solve(int l,int r){
38     if (l==r) return;
39     int m=(l+r)>>1;
40     solve(l,m),solve(m+1,r);
41     for (int i=l,a=l,b=m+1;i<=r;i++){
42         p=(a<=m&&(b>r||list[a].x<=list[b].x))?list[a++]:list[b++];
43         if (p.num<=m&&!p.op) T.insert(p.y,1);
44         else if (p.num>m&&p.op) ans[p.id]+=T.query(p.y)*p.t;
45         temp[i]=p;
46     }
47     for (int i=l;i<=r;i++) list[i]=temp[i];
48     for (int i=l;i<=r;i++) if (list[i].num<=m&&!list[i].op) T.insert(list[i].y,-1);
49 }
50 int main(){
51     scanf("%d%d",&n,&q);
52     for (int i=1;i<=n;i++){
53         scanf("%d",&a[i]);
54         add(0,i,i,a[i],0);
55     }
56     for (int i=n+1;i<=n+q;i++){
57         scanf("%s%d%d",s,&x,&k);
58         if (s[0]==‘M‘) a[x]=k,add(0,i,x,a[x],0);
59         else{
60             bo[i]=1;
61             add(1,i,x,a[x],k);
62         }
63     }
64     n+=q,lim++,solve(1,cnt);
65     for (int i=1;i<=n;i++) if (bo[i]) printf("%d\n",ans[i]);
66     return 0;
67 }
时间: 2024-10-23 19:01:53

省队集训Day3 light的相关文章

2015湖南省队集训DAY3——Light

Light [问题描述] "若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引 对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简 问题,她一定也答不上来." --<上古之魔书> 天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列 a[i],远 魔书上记载到:2 个位置的 graze 值为两者位置差与数值差的和: graze(x,y)=|x-y|+|a[x]-a[y]|. 要想破解天罚,就必须支持 2种操作(

bzoj4171 or 省队集训day3 chess: Rhl的游戏

[题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子),黑变白,白变黑. RHL希望把所有格子都变成白色的.不幸的是,有一些格子坏掉了,无法被按下.这时,它可以完成游戏吗? [输入格式] 第一行一个整数T,表示T组数据. 每组数据开始于三个整数n,m,k,分别表示格子的高度和宽度.坏掉格子的个数.接下来的n行,每行一个长度m

FJ省队集训DAY3 T1

思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的id 我讲的貌似不是很清楚.. 还有,蜜汁80分,打死也改不出来.. 1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 #include<algo

FJ省队集训DAY3 T2

思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用tarjan 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #define ll long

省队集训 Day3 陈姚班

[题目大意] 给一张网格图,上往下有流量限制,下往上没有,左往右有流量限制. $n * m \leq 2.5 * 10^6$ [题解] 考场直接上最大流,50分.竟然傻逼没看出狼抓兔子. 平面图转对偶图,其中没有流量限制(inf)不用转,然后直接在DAG上分层dp即可. 复杂度$O(nm)$,但是这样过不去被卡常了. 出题人的做法是先处理出每层初始的那个随机数,然后每层往下直接做,这样因为是一维数组,所以寻址方便,不会被卡常. 我的做法是动态开数组(用new),然后比较两维大小来分配第一维给谁,

省队集训 Day3 吴清华

[题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止节点,每个点只能连一条线,线不能相交,且只能连在网格的边上. 求最短布线距离.提交答案题. [题解] 前面3个点(60分)可以跑费用流,这是一个经典拆点费用流模型,大概并行跑个15min也就出来了. 后面2个点据说用原始对偶跑会快很多,ditoly后两个点就跑了36分. orz ditoly

省队集训 Day3 杨北大

[题目大意] 给出平面上$n$个点$(x_i, y_i)$,请选择一个不在这$n$个点之内的点$(X, Y)$,定义$(X, Y)$的价值为往上下左右四个方向射出去直线,经过$n$个点中的数量的最小值. Task 1: 求价值最大的点 Task 2: 求价值最大的点的个数 保证Task 1和Task 2各占50pts. 对于30%的数据,$n \leq 200$: 对于60%的数据,$n \leq 5000$: 对于100%的数据,$n \leq 300000$. 每档数据中,50%保证$1 \

省队集训Day3 tree

[题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶子结点.这 m个叶子从 1 到 m 分别被给予了一个号码,每个叶子的号码都是独一无二的.一开始根节点有一个棋子,两个玩家每次行动将棋子移动到当前节点的一个儿子节点.当棋子被移动到某个叶节点的时候游戏结束,这个叶节点的号码即为该局游戏的 result.先手的玩家要最大化result,后手的玩家要最小化

JS省队集训记

不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么心态? T2 唉,感觉好像做过类似的? T3 唉,怎么是提交答案题…… 感觉前两题都会,信心大增,于是决定先码T2 码了一会,过了第二个样列,还有一个样例?咦怎么过不去? 纠结了一会发现——读错题了,啪啪啪,全写错了……立马就凌乱了 赶快做T1,结果发现meet in middle的空间复杂度好像炸