cogs 2320. [HZOI 2015]聪聪的世界

solution

6 7 8都好说

对于1 2 3 4只需自己yy一个函数就行

(ps:我把L打成l....)

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #define ll long long
  5 using namespace std;
  6 const int N=1000006;
  7 inline ll maxn(ll a,ll b){return a>b?a:b;}
  8 inline ll minn(ll a,ll b){return a<b?a:b;}
  9
 10 int n,m;
 11 ll v[N];
 12 struct son
 13 {
 14     ll max,min;
 15 };
 16 son a[N*5];
 17 ll ji[N*5];
 18 void pushup(int x)
 19 {
 20     a[x].max=maxn(a[x<<1].max,a[x<<1|1].max);
 21     a[x].min=minn(a[x<<1].min,a[x<<1|1].min);
 22 }
 23 void pushdown(int x)
 24 {
 25     if(ji[x])
 26     {
 27         ji[x<<1]+=ji[x];
 28         ji[x<<1|1]+=ji[x];
 29         a[x<<1].max+=ji[x];
 30         a[x<<1].min+=ji[x];
 31         a[x<<1|1].min+=ji[x];
 32         a[x<<1|1].max+=ji[x];
 33         ji[x]=0;
 34     }
 35 }
 36 void build(int l,int r,int x)
 37 {
 38     if(l==r)
 39     {
 40         a[x].min=a[x].max=v[l];
 41         return ;
 42     }
 43     int mid=(l+r)>>1;
 44     build(l,mid,x<<1);
 45     build(mid+1,r,x<<1|1);
 46     pushup(x);
 47 }
 48 void addqu(int L,int R,ll c,int l,int r,int x)
 49 {
 50     if(L<=l&&r<=R)
 51     {
 52         a[x].max+=c;
 53         a[x].min+=c;
 54         ji[x]+=c;
 55         return ;
 56     }
 57     pushdown(x);
 58     int mid=(l+r)>>1;
 59     if(L<=mid)
 60       addqu(L,R,c,l,mid,x<<1);
 61     if(mid<R)
 62       addqu(L,R,c,mid+1,r,x<<1|1);
 63     pushup(x);
 64 }
 65 void adddian(int pos,ll c,int l,int r,int x)
 66 {
 67     if(l==r)
 68     {
 69         a[x].min+=c;
 70         a[x].max+=c;
 71         return ;
 72     }
 73     int mid=(l+r)>>1;
 74     pushdown(x);
 75     if(pos<=mid)
 76       adddian(pos,c,l,mid,x<<1);
 77     else
 78       adddian(pos,c,mid+1,r,x<<1|1);
 79     pushup(x);
 80 }
 81 ll qq(int pos,int l,int r,int x)
 82 {
 83     if(l==r)
 84       return a[x].max;
 85     pushdown(x);
 86     int mid=(l+r)>>1;
 87     if(pos<=mid)
 88       return qq(pos,l,mid,x<<1);
 89     else
 90       return qq(pos,mid+1,r,x<<1|1);
 91 }
 92 void Swap(int posx,int posy)
 93 {
 94     ll valx=qq(posx,1,n,1),valy=qq(posy,1,n,1);
 95     adddian(posx,valy-valx,1,n,1);
 96     adddian(posy,valx-valy,1,n,1);
 97 }
 98 ll zuoxiao(int L,int R,ll c,int l,int r,int x)
 99 {
100     if(L<=l&&r<=R&&a[x].min>c)
101       return -1;
102     if(l==r)
103         return a[x].max<c?a[x].max:-1;
104     int mid=(l+r)>>1;
105     ll temp;
106     pushdown(x);
107     if(R>mid)
108     {
109       temp=zuoxiao(L,R,c,mid+1,r,x<<1|1);
110       return temp==-1?zuoxiao(L,R,c,l,mid,x<<1):temp;
111     }
112     else
113       return zuoxiao(L,R,c,l,mid,x<<1);
114 }
115 ll zuoda(int L,int R,ll c,int l,int r,int x)
116 {
117     if(L<=l&&r<=R&&a[x].max<c)
118       return -1;
119     if(l==r)
120         return a[x].max>c?a[x].max:-1;
121     int mid=(l+r)>>1;
122     ll temp;
123     pushdown(x);
124     if(R>mid)
125     {
126       temp=zuoda(L,R,c,mid+1,r,x<<1|1);
127       return temp==-1?zuoda(L,R,c,l,mid,x<<1):temp;
128     }
129     else
130       return zuoda(L,R,c,l,mid,x<<1);
131 }
132 ll youxiao(int L,int R,ll c,int l,int r,int x)
133 {
134     if(L<=l&&r<=R&&a[x].min>c)
135       return -1;
136     if(l==r)
137         return a[x].max<c?a[x].max:-1;
138     int mid=(l+r)>>1;
139     ll temp;
140     pushdown(x);
141     if(L<=mid)
142     {
143       temp=youxiao(L,R,c,l,mid,x<<1);
144       return temp==-1?youxiao(L,R,c,mid+1,r,x<<1|1):temp;
145     }
146     else
147       return youxiao(L,R,c,mid+1,r,x<<1|1);
148 }
149 ll youda(int L,int R,ll c,int l,int r,int x)
150 {
151     if(L<=l&&r<=R&&a[x].max<c)
152       return -1;
153     if(l==r)
154         return a[x].max>c?a[x].max:-1;
155     int mid=(l+r)>>1;
156     ll temp;
157     pushdown(x);
158     if(L<=mid)
159     {
160       temp=youda(L,R,c,l,mid,x<<1);
161       return temp==-1?youda(L,R,c,mid+1,r,x<<1|1):temp;
162     }
163     else
164       return youda(L,R,c,mid+1,r,x<<1|1);
165 }
166 int main(){
167     //freopen("1.txt","r",stdin);
168     freopen("ccsworld.in","r",stdin);
169     freopen("ccsworld.out","w",stdout);
170     scanf("%d%d",&n,&m);
171     for(int i=1;i<=n;++i)
172       scanf("%lld",&v[i]);
173
174     build(1,n,1);
175     while(m--)
176     {
177         int kk;
178         int x,y;
179         ll w;
180         scanf("%d%d",&kk,&x);
181         if(kk==1)printf("%lld\n",zuoxiao(1,x,qq(x,1,n,1),1,n,1));
182         else if(kk==2)printf("%lld\n",zuoda(1,x,qq(x,1,n,1),1,n,1));
183         else if(kk==3)printf("%lld\n",youxiao(x,n,qq(x,1,n,1),1,n,1));
184         else if(kk==4)printf("%lld\n",youda(x,n,qq(x,1,n,1),1,n,1));
185         else if(kk==5){scanf("%d",&y);Swap(x,y);}
186         else if(kk==6){scanf("%d%lld",&y,&w);addqu(x,y,w,1,n,1);}
187         else if(kk==7){scanf("%d%lld",&y,&w);addqu(x,y,-w,1,n,1);}
188     }
189     //while(1);
190     return 0;
191 }

code

时间: 2024-10-22 09:10:54

cogs 2320. [HZOI 2015]聪聪的世界的相关文章

cogs 2320. [HZOI 2015]聪聪的世界题解

2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以下操作: 1  x 询问从x向左数第一个<ax的数: 2  x 询问从x向左数第一个>ax的数: 3  x 询问从x向右数第一个<ax的数: 4  x 询问从x向右数第一个>ax的数: 5  x y 交换ax与ay: 6  x y w 给ax-ay加上w: 7  x y w 给ax-a

COGS 2188. [HZOI 2015] Math 题解

  题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不会= = 后来看了各路神犇的题解,又仔细想了想,大概明白了. 首先,k这么大,已经不是高精乘和高精开方所能承受的了(当然,你也可以找个超级计算机算算试试) 所以我们可以把k视为∞(INF). 极限思想,由于xi互不相同,所以每个元素在比它稍微大一点点的数面前都是微乎其微,不会影响到整数部分的. (可以粗略验证

[COGS 2258][HZOI 2015]复仇的序幕曲

Description 你还梦不梦痛不痛,回忆这么重你怎么背得动 ----序言 当年的战火硝烟已经渐渐远去,可仇恨却在阿凯蒂王子的心中越来越深 他的叔父三年前谋权篡位,逼宫杀死了他的父王,用铁血手腕平定了国内所有的不满 只有他一个人孤身逃了出来,而现在他组织了一只强大的军队,反攻的号角已经吹响 大战一触即发,作为他的机智又勇敢的指挥官,你必须要准确及时的完成他布置的任务 这个国家的布局是一棵树,每个城市都是树上的结点,其中每个结点上都有军队ai(人数) 树上的每条边有边权wi,表示通过这条边所需

[BZOJ 2152]聪聪可可

Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所

Bzoj1415 [Noi2005]聪聪和可可

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1586  Solved: 929 Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输

【BZOJ2152】聪聪可可

第二次学树分治,好像又没学会-- 原题: 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数

聪聪考试

2016.1.26 试题描述 聪聪是一个善良可爱.睿智聪慧的好孩子.聪聪是100%的学霸,这一天她在考数学.聪聪很快做到了最后一道题:“高一八班有n个人,从1到n编号,一次互判作业时,老师随机将作业发到这n个人手中.已知有k个人拿到的不是自己的作业,那么请问有多少种情况符合条件呢?”这么简单的问题聪聪当然会做了,她想考考你,你能不能比她先给出问题的答案呢? 输入 共1行,包含2个整数n和k. 输出 共1行,包含1个整数,表示答案.由于答案可能很大,请输出答案模10007的余数. 输入示例 4 3

聪聪和可可

  Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连. Output 输出1个实数,四舍五入保

BZOJ 1415 NOI2005 聪聪和可可 期望DP+记忆化搜索 BZOJ200题达成&amp;&amp;NOI2005全AC达成

题目大意:给定一个无向图,聪聪在起点,可可在终点,每个时刻聪聪会沿最短路走向可可两步(如果有多条最短路走编号最小的点),然后可可会等概率向周围走或不动,求平均多少个时刻后聪聪和可可相遇 今天早上起床发现194了然后就各种刷--当我发现199的时候我决定把第200题交给05年NOI仅剩的一道题--结果尼玛调了能有一个小时--我居然没看到编号最小这个限制0.0 首先我们知道,由于聪聪走两步而可可走一步,所以聪聪一定能在有限的时刻追上可可,而且两人的距离随着时间进行单调递减 于是我们记忆化搜索 首先用