紀中集訓2019 3 15 惡熊咆哮

2022-04-06 12:55:25 字數 2444 閱讀 9902

描述

有\(n\)隻熊,初始時座標為\((x_i,y_i)\);

這些熊會按照標號依次吼叫,當第\(i\)隻熊吼叫,其他熊會移動;

\((x_i,y_i)\)會移動到\((x_i \pm 1,y_i \pm 1)\)離吼叫的熊歐幾里得距離最小的位置;

問當第\(i\)隻熊生病了,不吼叫也不移動,其他的熊依次吼叫後的\(\sum_^x_iy_i\);

依次輸出\(ans_i\);

範圍\(2 \le n \le 2.5 \times 10^5 \ , \ 1 \le x_i ,y_i \le 10^6\)

考慮如何維護這些區間的變化;

由於一次變化後,所有被影響到的區間一定是在左端點或者右端點;

在每個區間的左端點記錄\(right\)集合,對右端點記錄\(left\)集合;

對於在\(pos_i\)左邊的區間的\(left\),顯然可以直接加到\(j\)的\(right\)上;

右邊區間的\(right\)同理;

對於左邊區間的\(right\),可以發現在變化過後所有的區間變成了相同的區間,並查集合並即可

右邊區間的\(left\)和跨越\(pos_i\)的的區間同理;

上述過程可以簡單鍊錶+並查集實現,查詢包含的區間可以用\(set\)維護;

$part \ 3 $

考慮如何求最終的答案;

先預處理乙個正常情況下的答案;

對於每個熊,設正常情況下最終位置為:\((x_i,y_i)\),相當於變成了\((x_i \pm 1, y_i \pm 1)\);

\((x_i+a)(y_i+b) - x_iy_i \ = \ ax_i + by_i + ab\);

字首和維護\(ax_i\)和\(by_i\)再加個二維數點維護\(ab\)即可;

#include#define ll long long 

#define mk make_pair

#define fir first

#define sec second

using namespace std;

const int n=1000010;

int n,px[n],py[n],idx[n],idy[n],dx[n],dy[n],p[n],rk[n];

int fa[n],pre[n],nxt[n],nt[n],sz,sta[n],top;

int lx[n],rx[n],ly[n],ry[n],lx0[n],rx0[n],ly0[n],ry0[n],tx[n],ty[n],rkx[n],rky[n];

ll sumx[n],sumy[n],pre_ans;

inline char gc()

inline int rd()

inline bool cmpx(const int&a,const int&b)

}else

for(;j;j=nt[j])fa[find(j)]=find(i);

for(j=now.r.hd;j&&p[j]<=pos;j=nt[j])fa[find(j)]=find(i);

if(j)

}} link(tmp.l,i);

s.erase(st,ed);

s.insert(mk(l,i));

} st=s.begin();ed=s.end();

for(i=st;i!=ed;++i)

s.erase(st,ed);

for(int i=1;i<=n;++i)if(find(i)!=i)l[i]=l[fa[i]],r[i]=r[fa[i]];

}struct tree

int que(int k,int lst,int l,int r,int x,int y)

void insert(int x,int y)

int query(int lx,int rx,int ly,int ry)

}t;void pre_cal()

ll cal(int id,int lx,int rx,int ly,int ry)

int main()

sort(idx+1,idx+n+1,cmpx);

sort(idy+1,idy+n+1,cmpy);

for(int i=1;i<=n;++i)

for(int i=1;i<=n;++i)t.insert(i,rky[idx[i]]);

memset(lx,-1,sizeof(lx));

memset(rx,-1,sizeof(rx));

memset(ly,-1,sizeof(ly));

memset(ry,-1,sizeof(ry));

solve(rkx,dx,lx,rx,lx0,rx0);

solve(rky,dy,ly,ry,ly0,ry0);

pre_cal();

for(int i=1;i<=n;++i)

return 0;

}

紀中集訓2019 11 05

題目鏈結 有 n 個點,求 n 1 個完美匹配,且其中不出現相同的邊。n le 10 3 打暴力 手玩找到規律。把匹配放到方格圖上,給屬於同乙個完美匹配的方格染上同樣的顏色,發現兩個性質 最後一列第一行填 n 之後往下從小到大填完偶數,再從小到大填完奇數 forall i in 1,n 1 從 1,...

紀中集訓 遊戲

題目鏈結 是紀中的題,不過我已經沒有紀中的號了,於是翻出了我的古早部落格 複習的時候又做了一遍,還是想了一會兒的,並且由衷地覺得這真是一道好題。考慮 sg 函式遞推。由於每次操作只能動最後一行和最後一列,那麼設 sg i,j 表示以 i,j 結尾的矩陣的 sg 函式值。轉移有 sg i,j mex ...

紀中集訓2019 3 21 橋

描述 有 m 條河,每條河的兩邊有居民點,所以共有 m 1 排居名點 如果要從一排居名點到另一排相鄰的居民點需要過河 現在有 n 個人,每個人的起點座標是 p s 終點 q t 你可以在每條河上修建一座橋,過河必須通過橋 相鄰居民點距離為 1 不考慮過河的時間 問 n 個人到終點的路徑之和最小是多少...