string
【題目描述】
給定乙個由小寫字母組成的字串 s。有 m 次操作,每次操作給
定 3 個引數 l,r,x。如果 x=1,將 s[l]~s[r]公升序排序;如果 x=0,將 s[l]~s[r]
降序排序。你需要求出最終序列。
【輸入資料】
第一行兩個整數 n,m。第二行乙個字串 s。接下來 m 行每行三
個整數 x,l,r。
【輸出資料】
一行乙個字串表示答案。
【樣例輸入】
5 2cabcd
1 3 1
3 5 0
【樣例輸出】
abdcc
【資料範圍】
對於 40%的資料,n,m<=1000。
對於 100%的資料,n,m<=100000。
題解:正解不明,但可以寫出nlogn*26*26的線段樹(然而只比暴力多10分)。
看到一共只有26個字母,考慮列舉每個字母,統計在區間內部的個數,那麼對於每種字母,顯然如果按順序排序,那麼顯然是從a~z,乙個乙個區間覆蓋,區間清空。
線段樹實現,當然lz打的是區間覆蓋的標記,只要當前這個節點的元素值是什麼,那麼其他兒子節點的元素值就什麼,就實現了區間清空和區間加法。
**:
#include #include#include
#include
#include
#include
#define maxn 110000
#define rg register
using
namespace
std;
struct
nodea[maxn*4
];int
n,q;
char
ch[maxn];
int chuan[maxn],tot[26
];inline
void pushup(int
xv)inline
void pushdown(int xv,int x,int
y) a[xv*2].lz=a[xv*2+1].lz=1
; }
}inline
void build(int xv,int l,int
r) a[xv].l=l,a[xv].r=r;
int mid=(l+r)/2
; build(xv*2,l,mid),build(xv*2+1,mid+1
,r);
pushup(xv);
}inline
int query(int xv,int l,int r,int
k) pushdown(xv,mid-l+1,r-mid);
if(r<=mid) return query(xv*2
,l,r,k);
else
if(l>mid) return query(xv*2+1
,l,r,k);
else
return query(xv*2,l,mid,k)+query(xv*2+1,mid+1
,r,k);
}inline
void update(int xv,int l,int r,int
k) pushdown(xv,mid-l+1,r-mid);
if(r<=mid) update(xv*2
,l,r,k);
else
if(l>mid) update(xv*2+1
,l,r,k);
else update(xv*2,l,mid,k),update(xv*2+1,mid+1
,r,k);
pushup(xv);
}inline
int query2(int xv,int
ps) pushdown(xv,mid-l+1,r-mid);
if(ps<=mid) return query2(xv*2
,ps);
else
return query2(xv*2+1
,ps);
}int
main()}}
else}}
}for(int i=1;i<=n;i++)
return0;
}
考試題題解
主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...
C程式考試題
1 構成乙個c程式的是 a 若干個主函式和最多乙個非主函式 b 若干個主函式和若干個非主函式 c 乙個主函式和最多乙個非主函式 d 乙個主函式和若干個非主函式 2 合法的 語言識別符號是 a a1 b a b c 3abc d ab,cd 3 表示式a c b 的值是 其中 a 4,b 5,c 6 ...
linux入門考試題
rhcsa模擬測試 考試時間為2小時 共18題 考試資訊 ipaddr 172.25.254.x x 在這裡指您的工作站編號加100 netmask 255.255.255.0 gateway 172.25.254.250 dns 172.25.254.250 yum源位址為 1.在進行考試之前,請...