BZOJ4066: 简单题
生活随笔
收集整理的這篇文章主要介紹了
BZOJ4066: 简单题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BZOJ4066: 簡單題
Description
你有一個N*N的棋盤,每個格子內有一個整數,初始時的時候全部為0,現在需要維護兩種操作:?
| 命令 | 參數限制 | 內容 |
| 1 x y A | 1<=x,y<=N,A是正整數 | 將格子x,y里的數字加上A |
| 2 x1?y1?x2?y2 | 1<=x1<= x2<=N 1<=y1<= y2<=N | 輸出x1?y1?x2?y2這個矩形內的數字和 |
| 3 | 無 | 終止程序 |
Input
輸入文件第一行一個正整數N。 接下來每行一個操作。每條命令除第一個數字之外,均要異或上一次輸出的答案last_ans,初始時last_ans=0。Output
對于每個2操作,輸出一個對應的答案。Sample Input
41 2 3 3
2 1 1 3 3
1 1 1 1
2 1 1 0 7
3
Sample Output
35
HINT
數據規模和約定 1<=N<=500000,操作數不超過200000個,內存限制20M,保證答案在int范圍內并且解碼之后數據仍合法。題解Here!
看完題二話不說一個樹狀數組$+Treap$。 然后就$MLE$了。。。 回頭看題:怎么只有$20M$??? 這。。。強制在線。。。只好$K-D\ Tree$。。。 其實有一道弱化版:BZOJ1176: [Balkan2007]Mokia
但是這道題卻只能用$K-D\ Tree$。。。
感覺$K-D\ Tree$要變成替罪羊樹了。。。
還拍平重建。。。
附代碼:
#include<iostream> #include<algorithm> #include<cstdio> #define MAXN 200010 #define MAX (1LL<<30) #define Alpha 0.75 using namespace std; int n,m; int root,size=0,l1,r1,l2,r2; int top,recycle[MAXN]; bool sort_flag=false; struct Point{int x,y,z;friend bool operator <(const Point &p,const Point &q){if(sort_flag)return p.y<q.y;return p.x<q.x;} }point[MAXN],now; struct Tree{Point point;int maxx,maxy,minx,miny,val,sum,size,lson,rson; }a[MAXN]; inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w; } inline bool check_inside(int x1,int y1,int x2,int y2){return ((l1<=x1&&x2<=l2)&&(r1<=y1&&y2<=r2)); } inline bool check_outside(int x1,int y1,int x2,int y2){return ((x2<l1||x1>l2)||(y2<r1||y1>r2)); } inline int newnode(const Point &p){int rt;if(top)rt=recycle[top--];else rt=++size;a[rt].point=p;a[rt].maxx=a[rt].minx=p.x;a[rt].maxy=a[rt].miny=p.y;a[rt].val=a[rt].sum=p.z;a[rt].lson=a[rt].rson=0;a[rt].size=1;return rt; } inline void pushup(int rt){int lson=a[rt].lson,rson=a[rt].rson;a[rt].size=a[lson].size+a[rson].size+1;a[rt].sum=a[lson].sum+a[rson].sum+a[rt].val;a[rt].maxx=max(a[rt].maxx,max(a[lson].maxx,a[rson].maxx));a[rt].maxy=max(a[rt].maxy,max(a[lson].maxy,a[rson].maxy));a[rt].minx=min(a[rt].minx,min(a[lson].minx,a[rson].minx));a[rt].miny=min(a[rt].miny,min(a[lson].miny,a[rson].miny)); } void buildtree(int l,int r,int &rt,int flag){int mid=l+r>>1;sort_flag=flag;nth_element(point+l,point+mid,point+r+1);rt=newnode(point[mid]);if(l<mid)buildtree(l,mid-1,a[rt].lson,flag^1);if(mid<r)buildtree(mid+1,r,a[rt].rson,flag^1);pushup(rt); } void pia(int rt,int num){if(a[rt].lson)pia(a[rt].lson,num);point[num+a[a[rt].lson].size+1]=a[rt].point;recycle[++top]=rt;if(a[rt].rson)pia(a[rt].rson,num+a[a[rt].lson].size+1); } inline void check(int &rt,int flag){if(Alpha*a[rt].size<max(a[a[rt].lson].size,a[a[rt].rson].size)){pia(rt,0);buildtree(1,a[rt].size,rt,flag);} } void insert(int &rt,int flag){if(!rt){rt=newnode(now);return;}sort_flag=flag;if(a[rt].point<now)insert(a[rt].rson,flag^1);else insert(a[rt].lson,flag^1);pushup(rt);check(rt,flag); } int query(int rt){if(check_inside(a[rt].minx,a[rt].miny,a[rt].maxx,a[rt].maxy))return a[rt].sum;if(check_outside(a[rt].minx,a[rt].miny,a[rt].maxx,a[rt].maxy))return 0;int ans=0;if(check_inside(a[rt].point.x,a[rt].point.y,a[rt].point.x,a[rt].point.y))ans+=a[rt].val;if(a[rt].lson)ans+=query(a[rt].lson);if(a[rt].rson)ans+=query(a[rt].rson);return ans; } void work(){int f,last=0;while(1){f=read();if(f==3)return;if(f==1){now.x=read()^last;now.y=read()^last;now.z=read()^last;insert(root,0);}else{l1=read()^last;r1=read()^last;l2=read()^last;r2=read()^last;last=query(root);printf("%d\n",last);}} } void init(){n=read();a[0].maxx=a[0].maxy=-MAX;a[0].minx=a[0].miny=MAX; } int main(){init();work();return 0; }?
轉載于:https://www.cnblogs.com/Yangrui-Blog/p/10660079.html
總結
以上是生活随笔為你收集整理的BZOJ4066: 简单题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AHOI(十二省联考)2019 退役记
- 下一篇: 《Java编程的逻辑》第三部分 泛型与容