牛客網多校5 I vcd (樹狀陣列)

2021-08-22 05:58:21 字數 1238 閱讀 3018

題目:有 n 個點,乙個點集 s 是好的,當且僅當對於他的每個子集 t,存在乙個右邊無限長的矩形,使得這個矩形包含了 t,但是和 s-t 沒有交求這 n 個點裡有幾個好的點集 1<=n<=10^5

思路:對於 |s|=1,他顯然是好的

對於 |s|=2,只要兩個點的 y 座標不相同,那麼這個集合也是好的

對於 |s|=3,三個點的形狀必須是   <   型。用樹狀陣列統計,按x從大到小排序,對於乙個點,ans+=小於他y座標的點數*大他要y座標的點數。

對於 |s|>3,不可能任何三個點都是 < 型,所以一定不是好的。

能讀懂題意就好了。。。

取模不是1e9+7啊,

#include using namespace std;

typedef long long ll;

const int maxn=1e5+10;

const ll mod=998244353ll;//取模不是1e9+7!!!

struct nodea[maxn];

int n,tot,b[maxn];

bool cmp(const node &a,const node &b)

int c[maxn];

int lowbit(int x)

void update(int pos,int val)

}int query(int pos)

return ans;

}int main()

sort(b+1,b+n+1);

ll ans=0;

ans+=1ll*n;//1

(ans+=1ll*(n-1)*n/2)%=mod;//2

int num=0;

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

tot=unique(b+1,b+n+1)-b-1;

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

a[i].y=lower_bound(b+1,b+tot+1,a[i].y)-b;

sort(a+1,a+n+1,cmp);

int last=1;

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

int s1=query(a[i].y-1);

int s2=query(n)-query(a[i].y);

ans=(ans+1ll*s1*s2)%mod;

}printf("%lld\n",ans);

return 0;

}

牛客網多校5 H subseq (樹狀陣列)

題目 給定乙個序列 a 1.n 求下標字典序第 k 小的嚴格遞增子串行 1 n 10 5 0 k 10 18 思路 考慮逐位確定,每次大概要算 a i n 中,第一項 x 的嚴格遞增子串行的個數,這個可以用乙個可持久化線段樹或者樹狀陣列維護。include using namespace std t...

牛客網多校5 A gpa

輸入 第一行n,k 第二行n個s i 第三行n個c i 最多剪掉k個數使 答案用二分找,做題時想到過,但沒有仔細去想。假設max已知 s i c i s i c i max s i s i 即 s i c i ma x s i c i max 0,只需要每次按 c i max 排序,從k 1開始加到...

Hash Function 牛客網多校

這題竟然卡memset.一開始t了以為陣列開小了 就往大了搞.首先是判矛盾 如果i位置上的乙個數ary i 本來應該在ary i n j處 那j到i之間肯定不能有負數 字首和判斷一下 如果暫時沒矛盾 那就將從j到i 1的位置都向i連一條邊 因為ary i 這個數會出現在i這個位置就是因為j到i 1都...