做題記錄 區間排序 線段樹

2022-07-06 17:24:10 字數 2652 閱讀 3992

給定由小寫字母組成的字串 \(s\) 每一次操作如下:

輸出最終字串

大致思想為,建 \(26\) 棵線段樹,代表每一種字母。

操作:區間查詢出每一種字母的個數,記為 \(cnt[c]\) 。

排序:按照從 \(a\) 至 \(z\)從 \(z\) 至 \(a\)依次向後覆蓋 \(cnt[i]\) 個位置 。

輸出答案:對於每一位,列舉 \([a,z]\) ,找出覆蓋這一位的字母 。

**:

#includeusing namespace std;

#define maxn 100005

#define maxc 27

int n,m;

struct tree

tree[maxc][maxn<<2];

int cnt[maxc];

void build(int opt,int p,int nl,int nr)

void pushup(int opt,int p)

void change(int opt,int p,int nl,int nr,int l,int r,int x)

pushdown(opt,p,nl,nr);

int mid=(nl+nr)>>1;

if(mid>=l) change(opt,p<<1,nl,mid,l,r,x);

if(mid=l && nr<=r) return tree[opt][p].sum;

pushdown(opt,p,nl,nr);

int mid=(nl+nr)>>1,ret=0;

if(mid>=l) ret+=query(opt,p<<1,nl,mid,l,r);

if(mid>n>>m;

for(int i=0;i<26;i++) build(i,1,1,n);

char x;

for(int i=1;i<=n;i++) cin>>x,change(x-'a',1,1,n,i,i,1);

for(int i=1,l,r,k;i<=m;i++)

else

} for(int i=1;i<=n;i++) for(int j=0;j<26;j++)

if(query(j,1,1,n,i,i))

printf("\n");

//fclose(stdin);

//fclose(stdout);

return 0;

}

給定由 \([1,n]\) 組成的排列,每一次操作如下:

最後輸出第 \(pos\) 位的值。

考慮二分答案!!

二分第 \(pos\) 位的取值,將大於等於 \(mid\) 的值都改為 \(1\) ,將小於 \(mid\) 的值都改為 \(0\) ,離線進行一遍所有操作。

若操作完後第 \(pos\) 位為 \(1\) ,則 \(ans\ge mid\) ,否則 \(ans。

注意:(**第 \(72\) 行)

cnt=query(1,1,n,l[i],r[i]);中, \(cnt\) 的可能為 \(0\) ,在接下來的覆蓋中可能會出現 \(l>r\) ,應該及時判斷 。

**:

#includeusing namespace std;

#define maxn 100005

typedef long long ll;

inline int rd()

int n,m,pos,l,r,ans;

int a[maxn],tmp[maxn],opt[maxn],l[maxn],r[maxn];

struct data

tree[maxn<<2];

void pushup(int p)

void pushdown(int p,int nl,int nr)

}void build(int p,int nl,int nr)

int mid=(nl+nr)>>1;

build(p<<1,nl,mid),build(p<<1|1,mid+1,nr);

pushup(p);

}void change(int p,int nl,int nr,int l,int r,int k)

pushdown(p,nl,nr);

int mid=(nl+nr)>>1;

if(mid>=l) change(p<<1,nl,mid,l,r,k);

if(mid=l && nr<=r) return tree[p].sum;

pushdown(p,nl,nr);

int mid=(nl+nr)>>1,ret=0;

if(mid>=l) ret+=query(p<<1,nl,mid,l,r);

if(mid=val)?1:0;

build(1,1,n);

for(int i=1,cnt;i<=m;i++)

return query(1,1,n,pos,pos);

}int main()

printf("%d\n",ans);

//fclose(stdin);

//fclose(stdout);

return 0;

}

KMP做題記錄

題目太長不貼了 這道題很巧妙,給定乙個字串s,求最少在首尾新增幾個字元後,s變為乙個迴圈了n次的字串 n 1 假設我們有乙個迴圈串s abcabcabc 我們根據kmp求一次next陣列,就可以通過next strlen s 得到乙個迴圈節的位置從而求出迴圈節的長度,顯然,迴圈節能被s整除。如果s ...

8 25 9 25 做題記錄

2018.8.25 上午 1.ac 洛谷p1514引水入城 搜尋 貪心 2.ac 洛谷p3918 國家集訓隊 特技飛行 貪心 下午 3.ac 洛谷p1120 小木棍 資料加強版 搜尋 剪枝 4.ac 洛谷p1441 砝碼稱重 dfs列舉 01揹包 2018.8.26 上午 參加模擬賽 下午 1.ac...

8 25 9 25 做題記錄

2018.8.25 上午 1.ac 洛谷p1514引水入城 搜尋 貪心 2.ac 洛谷p3918 國家集訓隊 特技飛行 貪心 下午 3.ac 洛谷p1120 小木棍 資料加強版 搜尋 剪枝 4.ac 洛谷p1441 砝碼稱重 dfs列舉 01揹包 2018.8.26 上午 參加模擬賽 下午 1.ac...