題目描述
在乙個 minecraft 村莊中,村長有這一本小寫字母構成的名冊(字串的表),
每個名字旁邊都記錄著這位村民的聲望值,而且有的村民還和別人同名。
隨著時間的推移,因為沒有村民死亡,這個名冊變得十分大。
現在需要您來幫忙維護這個名冊,支援下列 4 種操作:
插入新人名 si,聲望為 ai
給定名字字首 pi 的所有人的聲望值變化 di
查詢名字為 sj 村民們的聲望值的和(因為會有重名的)
查詢名字字首為 pj 的聲望值的和
輸入描述:
第一行為兩個整數 0 ≤ n ≤ 105,表示接下來有 n 個操作;
接下來 n 行,每行輸入乙個操作,行首為乙個整數 1 ≤ oi ≤ 4,表示這一行的操作的種類,
那麼這一行的操作和格式為:
插入人名,這一行的格式為 1 si ai,其中 |ai| ≤ 103
字首修改聲望,這一行的格式為 2 pi di,其中 |di| ≤ 103
查詢名字的聲望和,這一行的格式為 3 sj
查詢字首的聲望和,這一行的格式為 4 pj
輸入保證插入人名的字串的長度和小於或等於 105,總的字串的長度和小於或等於 106。
輸出描述:
對於每一次詢問操作,在一行裡面輸出答案。
示例1輸入
201 a -10
1 abcba -9
1 abcbacd 5
4 a2 a 9
3 aadaa
3 abcbacd
4 a3 a
2 a 10
3 a2 a -2
2 d -8
1 ab -2
2 ab -7
1 aadaa -3
4 a3 abcba
4 a4 c
輸出-14014
13-1911
1110tags:
裸裸的字典樹,然後加個lazy 標記。
//
#includeusing namespace std;
#pragma comment(linker, "/stack:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef long long ll;
const int n = 2000005;
struct item p[n*3];
int tr[n][27], index;
char s[n];
void pushdown(int now)
p[now].lazy = 0;
}void insert(ll x)
p[now].val2 += x, ++p[now].cnt2;
}void update(ll x)
int tnow = now; now = 0;
for(int i=1; i<=len; ++i)
p[now].lazy += x;
p[now].val2 += x*p[now].cnt2;
}ll query1()
return p[now].val2;
}ll query2()
return p[now].val1;
}int main()
else if(type==2)
else if(type==3)
else
}return 0;
}
Wannafly挑戰賽14 F 細胞
題解 ntt 二項式定理 再逆fft求出係數ans i 本題即可解了 另 採用fft的話,複數既不方便,誤差也很大。從fft到ntt 由費馬小定理可知 gp 1 p 1 p為質數 所以利用這個性質來對應單位複數根乘方的週期性,即 includeusing namespace std typedef ...
Wannafly挑戰賽14 E 線性基
題目描述 給乙個1 base陣列,有n次操作,每次操作會使乙個位置無效。乙個區間的權值定義為這個區間裡選出一些數的異或和的最大值。求在每次操作前,所有不包含無效位置的區間的權值的最大值。輸入描述 第一行讀入乙個正整數 1 n 105 第二行讀入n個正整數,第i個表示a i 0 a i 109 第三行...
Wannafly挑戰賽5 B 數學規律
題目描述 這個比賽,歸根結底就是控制乙個虛擬的小拖拉機跑完整個賽道。一般一場比賽會有 9 個到 13 個賽道,最後看能跑完多少個賽道。通常在一場可程式設計拖拉機比賽中,分別會有實際參賽隊伍數 10 20 30 向下取整的隊伍獲得金 銀 銅牌,其餘隊伍獲得榮譽提名,俗稱 鐵牌 但是主辦方往往會多準備一...