千山鸟飞绝

  1 #include <cmath>
  2 #include <ctime>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <iostream>
  7 #include <algorithm>
  8 # define maxn 30010
  9 using namespace std;
 10 void ot(int x){cout<<"***** ->"<<x<<endl;}
 11 int n,m;
 12 int bd[maxn];
 13 int ans1[maxn],ans2[maxn];   //ans2==num
 14 struct ROU{
 15     int val,id;
 16 };
 17 bool operator < (const ROU a,const ROU b){
 18     if(a.val==b.val) return a.id<b.id;
 19     return a.val<b.val;
 20 }
 21 struct Treap{
 22     Treap* ch[2];
 23     ROU tt;
 24     int size,key,mk1,mk2;
 25     Treap(int v,int ii)
 26         {size=1; tt.val=v; tt.id=ii; key=rand(); mk1=mk2=0; ch[0]=ch[1]=NULL;}
 27     void update()
 28         {size=1+(ch[0]?ch[0]->size:0)+(ch[1]?ch[1]->size:0);}
 29 };
 30 typedef pair<Treap*,Treap*> D;
 31 int Size(Treap* now){return now? now->size:0;}
 32 int mmxx(Treap *now){return now? now->tt.val:0;}
 33 void pushdown(Treap* &now){
 34     if(!now) return;
 35     if(now->ch[0]){
 36         now->ch[0]->mk1=max(now->mk1,now->ch[0]->mk1);
 37         now->ch[0]->mk2=max(now->mk2,now->ch[0]->mk2);
 38     }
 39     if(now->ch[1]){
 40         now->ch[1]->mk1=max(now->mk1,now->ch[1]->mk1);
 41         now->ch[1]->mk2=max(now->mk2,now->ch[1]->mk2);
 42     }
 43     int ii=now->tt.id;
 44     ans1[ii]=max(ans1[ii],now->mk1);
 45     ans2[ii]=max(ans2[ii],now->mk2);
 46     now->mk1=0; now->mk2=0;
 47 }
 48 D Split(Treap* now,int k){
 49     if(!now) return D(NULL,NULL);
 50     D y;
 51     pushdown(now);
 52     if(Size(now->ch[0])>=k)
 53         {y=Split(now->ch[0],k); now->ch[0]=y.second; now->update(); y.second=now;}
 54     else
 55         {y=Split(now->ch[1],k-Size(now->ch[0])-1); now->ch[1]=y.first; now->update(); y.first=now;}
 56     return y;
 57 }
 58 Treap* Merge(Treap* a,Treap* b){
 59     if(!a) return b;
 60     if(!b) return a;
 61     if(a->key < b->key)
 62         {a->ch[1]=Merge(a->ch[1],b); a->update(); return a;}
 63     else
 64         {b->ch[0]=Merge(a,b->ch[0]); b->update(); return b;}
 65 }
 66 int Getkth(Treap* now,ROU o){
 67     if(!now) return 0;
 68     return (!(now->tt<o))? Getkth(now->ch[0],o):Getkth(now->ch[1],o)+Size(now->ch[0])+1;
 69 }
 70 int Findkth(Treap* &rt,int k){
 71     D x=Split(rt,k-1);
 72     D y=Split(x.second,1);
 73     Treap* ans=y.first;
 74     rt=Merge(Merge(x.first,ans),y.second);
 75     return ans? ans->tt.val:0;
 76 }
 77 void add_mk(ROU o,Treap* &now){
 78     if(!now) return ;
 79     int da=Findkth(now,now->size);
 80     now->mk1=max(now->mk1,o.val);
 81     now->mk2=max(now->mk2,now->size);
 82     ans1[o.id]=max(ans1[o.id],da);
 83     ans2[o.id]=max(ans2[o.id],now->size);
 84 }
 85 void Insert(ROU o,Treap* &rt){
 86     add_mk(o,rt);
 87     int k=Getkth(rt,o);
 88     D x=Split(rt,k);
 89     Treap* now=new Treap(o.val,o.id);
 90     rt=Merge(Merge(x.first,now),x.second);
 91 }
 92 void Delete(ROU o,Treap* &rt){
 93     int k=Getkth(rt,o);
 94     D x=Split(rt,k);
 95     D y=Split(x.second,1);
 96     int ii=y.first->tt.id;
 97     ans1[ii]=max(ans1[ii],y.first->mk1);
 98     ans2[ii]=max(ans2[ii],y.first->mk2);
 99     rt=Merge(x.first,y.second);
100 }
101 struct HHs{
102     struct node{
103         int x,y,nxt;
104         Treap* rt;
105     }g[4000000];
106     int e,adj[80000];
107     int modx;
108     int mody;
109     int mod;
110     HHs(){
111         memset(adj,-1,sizeof(adj));
112         modx=7307; mody=9991; mod=76543;
113     }
114     void add(int now,int x,int y){
115         g[e].x=x; g[e].y=y; g[e].nxt=adj[now];
116         adj[now]=e++;
117     }
118     int find(int x,int y){
119         int now=(((x%modx)+modx)%modx)*(((y%mody)+mody)%mody)%mod;
120         for(int i=adj[now];i!=-1;i=g[i].nxt){
121             if(x==g[i].x && y==g[i].y){
122                 return i;
123             }
124         }
125         add(now,x,y); return e-1;
126     }
127 }hs;
128 int pos[maxn][3];
129 void init(){
130     scanf("%d",&n);
131     int now; ROU o;
132     for(int i=1;i<=n;i++){
133         scanf("%d%d%d",&bd[i],&pos[i][0],&pos[i][1]);
134         now=hs.find(pos[i][0],pos[i][1]);
135         o.id=i; o.val=bd[i];
136         Insert(o,hs.g[now].rt);
137     }
138 }
139 void work(){
140     scanf("%d",&m);
141     int iid,x,y;
142     int now; ROU o;
143     for(int i=1;i<=m;i++){
144         scanf("%d%d%d",&iid,&x,&y);
145         o.id=iid; o.val=bd[iid];
146         now=hs.find(pos[iid][0],pos[iid][1]);
147         Delete(o,hs.g[now].rt);
148         pos[iid][0]=x; pos[iid][1]=y;
149         now=hs.find(x,y);
150         Insert(o,hs.g[now].rt);
151     }
152     for(int i=1;i<=n;i++){
153         now=hs.find(pos[i][0],pos[i][1]);
154         o.id=i; o.val=bd[i];
155         Delete(o,hs.g[now].rt);
156     }
157     long long ans;
158     for(int i=1;i<=n;i++){
159         ans=(long long)ans1[i]*ans2[i];
160         printf("%lld\n",ans);
161     }
162 }
163 int main(){
164     // freopen("a.in","r",stdin);
165     init();
166     work();
167 }
时间: 2024-11-08 23:23:56

千山鸟飞绝的相关文章

bzoj 2827: 千山鸟飞绝

2827: 千山鸟飞绝 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 802  Solved: 228[Submit][Status][Discuss] Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. 这时鸟王用鸟语说道:“[email protected]#$%……?”安抚了一下众鸟的情绪.鸟王

bzoj2827: 千山鸟飞绝

Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.vfleaking顿时膜拜不已. 这时鸟王用鸟语说道:“[email protected]#$%……?”安抚了一下众鸟的情绪.鸟王生性好斗,作出了一个决定——要排鸟布阵把刚才吓到它们的人类赶出山去. 每只鸟都有一个编号,都有一个威武值.每秒钟鸟王都会发一个命令,编号为v的鸟飞到(x,y)去(坐标系原点是山顶,坐标单位为鸟爪).鸟飞得

bzoj2827: 千山鸟飞绝 treap

离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树.每次插入时打2个标记,同时更新自身.这个方法比较显然,而且好写.正解好像用很迷的方法乱搞了一波,然后用线段树不打标记就做出来了,并不会. treap旋转没传引用,调了好久. #include<bits/stdc++.h> #define N 30005 #define M 330005 #define x first #define y second #define IF else if using namespace std; int n

【BZOJ2827】千山鸟飞绝 离散化+splay

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45721413"); } 题解: 首先先把坐标离散化一下, 然后对于每个坐标点我们建一棵平衡树,每次插入操作后给整颗平衡树下传一下需求的两个标记. 注意: splay有的人(比如我)习惯每棵都先建-inf.inf两个节点以便于查找前驱

2827: 千山鸟飞绝 非旋treap

国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离,这个平衡树的关键字是节点编号.然后把每个点当做一个节点,放进其所在位置的平衡树里.剩下要做的就是平衡树分离出一个点,合并一个点,还有打标记了.对于士气值的标记,我们维护平衡树中的max,每次合并的时候,用这个新点的威武值去给整棵树打标记,再用树中的max给这个新点打标记.团结值的标记,合并后一起打

python/HTML基础

---恢复内容开始--- python/HTML基础 HTML: 超文本标记(标签)语言 (以<>扩起来的都是标签语言,放入标签里的不仅仅是文本)一套语言规则 浏览器的渲染顺序是从上到下,从左到右 不同的浏览器,对同一标签可能会有不完全相同的解释(兼容性)至今已经解决的差不多了 .html或htm   静态网页文件扩展名后缀 标签可以进行嵌套,但是不能进行交叉嵌套 HTML 不是一种编程语言,而是一种标记语言,HTML使用标记标签来描述网页 HTML结构: <html></h

冬天的雪

时光,从一缕清风中飘然而过,散发出幽幽的暗香,在四季轮回的罅隙中,缓缓地步入了冬季.冬,蕴含着深邃悠远的意韵:雪,舞动着空灵曼妙的风姿.静静聆听雪花飘落的声音,感受那份宁静幽美的意境. 让我们从古人的诗情画意中,去细细品味雪带给人们的那种空寂悠远的意境吧. "千山鸟飞绝,万径人踪灭,孤舟蓑笠翁,独钓寒江雪."柳宗元的一首<江雪>,描绘了一幅动人的画面.在白雪覆盖的江面上,一叶小舟,一个披蓑戴笠的老渔翁,独自在寒冷的江心垂钓.天地间空旷寂静,彰显了渔翁的清高与孤傲. 张岱的&

C# Tcp协议收发数据(TCPClient发,Socket收)

运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的"控制面板\系统和安全\Windows 防火墙\自定义设置"路径中,将"家庭或工作(专用)网络位置设置"和"公用网络位置设置"下面的选项都选到"关闭Windows防火墙(不推荐)". 1.界面设计 左侧为发送数据的输入框,单击"发送数据"把数据发送到指定IP地址的指定端口号.(本例中,IP地址和端口号都被写死到代码中)

怎样有效提高记忆力?

周筠 ,虚晃一枪. 陈甫鸼等 747 人赞同 我是坚定的“最浅的墨水胜过最深的记忆”党人.这辈子永不退党,哈哈. 读书记不住,可能原因有两点. 一,那是你不得不读的书:二,你没有随手做点笔记的习惯. 拿我自己来讲,如果是我想读的书,我才不会正襟危坐从头读起,我会快速翻页,找自己感兴趣的章节.关键词.图片,从最有兴趣的地方读起.比如,最近两天出差,读完了陈平原的书从文人之文到学者之文 (豆瓣) .300多页的书,一阵乱翻后,从顾炎武开始看,然后又跳到前面看张岱,接着又跑到后面看黄宗羲,继而跑到前面