思路:時間線段樹部分挺裸的,乙個點能把行和列連線在一起,那麼答案就是每個聯通快裡面行的個數乘上列的個數,把行和列看成點的思想好像挺常見的,網路流建圖什麼的也可以經常可以看見這種思想,紀錄一下
#pragma gcc optimize(3)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define for(i,a,b) for(int i(a);i<=(b);++i)
#define fol(i,a,b) for(int i(a);i>=(b);--i)
#define rew(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(1000)
#define pb push_back
#define eps 1e-8
#define lc d<<1
#define rc d<<1|1
#define pll pair#define p pair#define pi acos(-1)
int fa[600008],sx[600008],sy[600008],n;
ll ans=0;
int fid(int x)
unordered_mapmp[300008];
struct assa[300008];
struct astr[300008<<2];
void build(int d,int l,int r)
void add(int d,int l,int r,p pos)
int mid=(tr[d].l+tr[d].r)>>1;
if(mid>=r) add(lc,l,r,pos);
else if(l>mid) add(rc,l,r,pos);
else add(lc,l,mid,pos),add(rc,mid+1,r,pos);
}void query(int d)
st.clear();
}int main()
mp[a[i].x][a[i].y]=i;
}for(i,1,n) if(mp[a[i].x][a[i].y]) add(1,mp[a[i].x][a[i].y],n,p(a[i].x,a[i].y+300000));
query(1);puts("");
return 0;
}
codeforces 1194F 組合數學
傳送門 你有n個事件,你需要按照1 n的順序完成這些事件,每個事件需要 t i 的時間完成,你現在一共有t的時間去做這些事情,每做一件事情的時候,你有0.5的概率花費 t i 的時間完成他,也有0.5的概率花費 t i 1 的時間去完成他,如果在做這個事件的時候時間花完了,你就相當於沒有做成這個事件...
codeforces 1114F 線段樹練習
這是一道用線段樹維區間值的一道題,題意很簡單,就是對於給定的乙個序列,初始時每個數的值不大於300,然後有兩中操作,乙個是對區間 l,r 的每個數乘上以個數x,乙個是詢問區間的乘積的尤拉函式值,首先對於第乙個操作顯然可以用線段樹的延遲更新來完成,對於第二個操作,我最先沒考慮資料,就想著直接維護區間的...
Codeforces 985F 字串雜湊
題目鏈結 題意簡述 給定乙個長度為n n 2e5 的字串s 僅含有小寫字母 有m m 2e5 次查詢。每次查詢給三個數,x,y,len,求在s x s x len 1 和s y s y len 1 是否存在相應位置唯一對應關係。例如aba和brb,aaa和kkk,abs和ert是唯一對應。aab和a...