theme:n個數編號為1~n,兩種操作:1 x:將編號為x的數置為不可得,2 x:詢問x位置及其後第乙個可得數的編號。1<=n,x<1e9,1<=q<1e6
solution:首先想到用線段樹維護。初始時線段樹每個l==r位置的值為l,1 x操作對應將x位置值置為inf,2 x 操作相當於查詢區間[x,n]的最小值。由於n很大,所以要離散化。可以記錄下所有操作的x值,進vector,並把x+1也作為節點,這樣的話查詢[x,n]就保證一定正確了
#include#include#includeusing namespace std;
#define far(i,t,n) for(int i=t;iv;
int tree[2000020<<2];
void push_up(int rt)
void build(int rt,int l,int r)
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
push_up(rt);
}void update(int rt,int l,int r,int pos)
int mid=(l+r)>>1;
if(pos<=mid)
update(rt<<1,l,mid,pos);
else
update(rt<<1|1,mid+1,r,pos);
push_up(rt);
}int query(int rt,int l,int r,int l,int r)
int main()
sort(v.begin(),v.end());
int sz=unique(v.begin(),v.end())-v.begin();
build(1,1,sz);
far(i,0,q)
}}
theme:給定n個二維平面上的點,問至少新增幾個點可以使得有這些點組成的圖形是中心對稱圖形(對稱中心任意)。1<=n<=1000,-1e6<=x,y<=1e6
solution:如果乙個圖形是中心對稱圖形,則對稱中心是某些點對的中點。n範圍較小,我們可以列舉出每個點與任意其他點的中點)(只要有乙個點不同,則中點肯定不同),看哪個點是最多點對的中點。實現的話可以放在map裡,再求map最大值。由於某個點自己也可能是對稱中心,所以列舉i,i時對答案的貢獻+1,其他情況+2表示這兩個點都不需要給它加點,結果就為n-ans.注意特判n=1
#include#include#includeusing namespace std;
#define far(i,t,n) for(int i=t;ium;
map<_a,int>::iterator it;
int main()
printf("%d",ans[0]);
far(i,1,n)
printf(" %d",ans[i]);
puts("");
}
2019ICPC亞洲區域賽徐州網路賽
題意 有兩種操作 1,x 表示將x這個點標記,2,x 表示查詢x後面第乙個未被標記的數。思路 q的值比較小,所以解題應該從q入手,用並查集模擬實現乙個鍊錶,用map模擬並查集。當標記乙個點x時,令x的父親等於x 1的父親,查詢時直接輸出x的父親即可。accepted code author lzyw...
2019徐州網路賽 query
題目鏈結 題解,這個題目巧妙地按下標進行樹狀陣列處理,先預處理所有有倍數關係的和每個元素的位置i,然後把下標小的存到下標大 的陣列中,查詢也離線,然後從左到右,邊加入,邊求和。include include include using namespace std int n int sum 1000...
2019 ICPC徐州 A Cat題解
題目大意 從1到正無窮的排列。t次詢問,每次給乙個l,r,s 每次在 l,r 選擇乙個最長的區間,使它的異或小於等於s.t 5e5 l,r 都是1e18 s 1e18 資料範圍這麼大一定是規律題 打表發現異或後為0的區間是長度為4而且迴圈的,這樣子的長度為4的區間的開始位置應該模4等於2或者0,這樣...