大學生程式設計邀請賽(華東師範大學) D 線段樹

2021-08-01 03:41:13 字數 1606 閱讀 1254

題解:二分預處理出來每個點單次傳染到的左右範圍,再用線段樹維護每個點最終的範圍最小值、最大值,利用線段樹不斷擴大範圍並更新。隨機乙個 1~

n的序列利用線段樹更新,這樣速度會變得很快,或其他優化方法均可(這裡採用sin函式排序差不多就無序了= =)。還有就是注意題目是按原來的i輸出,我因為這個被卡了一下午,mdzz。

**:

#include#include#include#include#includeusing namespace std;  

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define inf 0x3f3f3f3f

const int mx=1e5+10;

typedef long long ll;

int n,sum[mx<<2][2],a[mx],ans[mx],b[mx];

using namespace std;

struct sec

sec query(int l,int r,int l,int r,int rt)

int m=(l+r)>>1;

sec num[2]=,};

if(m>=l) num[0]=query(l,r,lson);

if(r>m) num[1]=query(l,r,rson);

return sec( min(num[0].l,num[1].l) , max(num[0].r,num[1].r) );

} void update(int l,int r,int l,int r,int rt,int vl,int vr)

int m=(l+r)>>1;

if(m>=l) update(l,r,lson,vl,vr);

if(r>m) update(l,r,rson,vl,vr);

sum[rt][0]=min(sum[rt<<1][0],sum[rt<<1|1][0]);

sum[rt][1]=max(sum[rt<<1][1],sum[rt<<1|1][1]);

}int main()a[n+1]=-inf;

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

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

for(int i=1;i<=n;i++) a[i]=s[i].l;

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

build(1,n,1);

for(int i=1;i<=n;i++) a[i]=i;

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

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

while(num[0].l!=num[1].l || num[0].r!=num[1].r)

update(t,t,1,n,1,num[id].l,num[id].r);//更新t點感染範圍

ans[po[t].r]=num[id].r-num[id].l+1;//找回原來的位置賦值

}printf("%d",ans[1]);

for(int i=2;i<=n;i++) printf(" %d",ans[i]);

puts("");

} return 0;

}

華東師範大學2020 加密2

加密2 time limit 1000ms memory limit 30000kb total submit 179 accepted 103 description 對乙個整數 32位無符號整數 進行規則如下的加密 1.低16位和高16位互換 2.此時的低16位按位取反 3.此時的高16位與低1...

2017華東師範大學網路賽 C

time limit per test 1.5 seconds time limit all tests 10.0 seconds memory limit 256 megabytes 袋鼠媽媽找不到她的孩子了。她的孩子被怪獸抓走了。袋鼠媽媽現在在地圖的左上角,她的孩子在地圖第 x 行第 y 列的位...

華東師範大學2020機試題解

1.統計卡牌的值 2.求30的倍數 include include include include include using namespace std const int maxn 1000 10 int arr maxn bool compare char x,char y intmain i...