t1:
有n種方塊,每種方塊有權值和個數。
每次尋找區間[l,r]的權值範圍在[a,b]的方塊中,選k個搭積木。
問每個積木的最大的權值最小是多少。
n,m<=30000
題解:
問最大的權值最小不就是……
排個序之後的第k個,就是最大的最小權值了啊……
然後所以我們考慮這個東西不就是有權值範圍限制的第k大嗎……
這不是裸的可持久化線段樹嗎……
隨便搞搞就好了。
#include
#include
#include
#define rep(i,n) for(int i = 1;i <= n;i ++)
#define u t[x]
#define o t[y]
#define mid (l + r >> 1)
#define lson u.lc,l,mid
#define rson u.rc,mid + 1,r
using namespace std;
const int n = 30005;
const int nn = ((1
<< 30) - 5);
int tot = 0,n,m,ql,qr,qwl,qwr,k,rt[n];
struct segt[n << 5];
void ins(int &x,int l,int r,int val,int ct,int
y)int qry_val(int
x,int l,int r,int
y)int qry(int
x,int l,int r,int
y)int main ()
scanf("%d",&m);
rep(i,m)
swap(qwl,qwr),qwl = 1,qwr --;
int cpp;
if(qwl > qwr)cpp = 0;
else cpp = qry_val(rt[qr],1,nn,rt[ql - 1]);
k = cpp + k;
printf("%d\n",qry(rt[qr],1,nn,rt[ql - 1]));
}return
0;}
t2:
給乙個點帶權有向圖,每個點有花費,你需要選擇一些點,使得拆掉這些點之後,不能從入度為0的點到達出度為0的點。
求最小的花費總和。
n<=1000,m<=6000
題解:
炸了。
t3:
給乙個數列,數列相當於一條彩帶,可以選擇把數列的某個位置x切開,拼接a[x,n]和a[1,x - 1]。
求拼接之後的最小字典序的數列。
例子:4 3 2 1
答案:1 4 3 2
題解:
最小表示法。
我們用兩個指標去掃,假設:
s[i - > i + k - 1] == s[j - > j + k - 1]
s[i + k] > s[j + k]
則: 考慮i有沒有可能是最終答案:
顯然不可能對吧,因為從j開始就比i優。
那麼i + 1可不可能是最終答案呢?
顯然j + 1比i + 1還要優。
所以s[i + k + 1]之後的才有可能作為最終答案。
我們就直接把i跳到i + k + 1的部分就成了。
總的複雜度顯然是o(n)的。
#include
#include
#define rep(i,n) for(int i = 1;i <= n;i ++)
using namespace std;
ints[300005],n;
int get(int
*a) return i;
}int main ()
t3死因:字尾陣列寫不出來,水不過。 六一兒童節
六一兒童節,老師帶了很多好吃的巧克力到幼兒園。每塊巧克力j的重量為w j 對 於每個小朋友i,當他分到的巧克力大小達到h i 即w j h i 他才會上去表演節目。老師的目標是將巧克力分發給孩子們,使得最多的小孩上台表演。可以保證每個w i 0且不能將多塊巧克力分給乙個孩子或將一塊分給多個孩子。第一...
六一兒童節
六一兒童節,老師帶了很多好吃的巧克力到幼兒園。每塊巧克力j的重量為w j 對於每個小朋友i,當他分到的巧克力大小達到h i 即w j h i 他才會上去表演節目。老師的目標是將巧克力分發給孩子們,使得最多的小孩上台表演。可以保證每個w i 0且不能將多塊巧克力分給乙個孩子或將一塊分給多個孩子。imp...
寫在六一兒童節
六一兒童節,大朋友 小朋友們,節日快樂 感謝你們深夜點開我這長圖 好久沒有寫東西了,好幾次都有寫作的衝動,可是,每次提筆的時候感覺好沉重,又好匱乏的樣子,似乎有很多東西要表達,又無從下手,甚至於一兩個字都蹦不出來窘態,冥冥之中是自廢武功好幾年的感慨,是啊,自從那年的出走,文字寫作的習慣戛然而止,趁著...