服务器时不时爆炸,有点难受。
题目链接:http://acm.hdu.edu.cn/userloginex.php?cid=849
A:
神仙题。不可做题。
B:
dp。
C:
推式子题。
D:
边分治。
E:
可以数学推理的题。但是显然打表更快找出规律。对打出来的结果做两次差分即可。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 #define mid (curl+curr>>1) 17 /* namespace */ 18 using namespace std; 19 /* header end */ 20 21 const ll mod = 998244353; 22 23 ll qp(ll x, ll b) { 24 ll ret = 1, base = x; 25 while (b) { 26 if (b & 1) ret = ret * base % mod; 27 base = base * base % mod; 28 b >>= 1; 29 } 30 return ret; 31 } 32 33 int main() { 34 ll n; 35 while (~scanf("%lld", &n)) { 36 ll k = 0, tmp = 3; 37 rep1(i, 2, n) k += tmp, tmp += 2; 38 printf("%lld\n", k * qp(9, mod - 2) % mod); 39 } 40 return 0; 41 }
F:
fwt题。
G:
不均等博弈题。用surrealnumber秒杀。
H:
最小割。
I:
求出本质不同的回文串的数量分布(求每种回文串的个数),然后对每种check一下叠加答案。manacher或者字符串hash都可以。
J:
签到题。1e6+3的阶乘后面全是0已经暗示一切。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 #define mid (curl+curr>>1) 17 /* namespace */ 18 using namespace std; 19 /* header end */ 20 21 const int mod = 1e6 + 3; 22 ll p[mod + 10]; 23 int n; 24 25 int main() { 26 p[0] = p[1] = 1; 27 rep0(i, 2, mod) p[i] = 1ll * i * p[i - 1] % mod; 28 while (~scanf("%d", &n)) { 29 if (n >= mod) { 30 puts("0"); 31 continue; 32 } 33 n %= mod; 34 printf("%lld\n", p[n]); 35 } 36 return 0; 37 }
K:
对于某个区间,首先考虑区间第1、2、3大的边能否构成三角形,然后考虑区间第2、3 、4大的边能否构成三角形,以此类推。
只要考虑区间前44大即可,因为区间最坏情况是斐波那契数列,然而第45项就爆了1e9的范围。时间复杂度O(44*nlogn)。
1 /* basic header */ 2 #include <iostream> 3 #include <cstring> 4 /* define */ 5 #define ll long long 6 #define dou double 7 #define pb emplace_back 8 #define mp make_pair 9 #define sot(a,b) sort(a+1,a+1+b) 10 #define rep1(i,a,b) for(int i=a;i<=b;++i) 11 #define rep0(i,a,b) for(int i=a;i<b;++i) 12 #define eps 1e-8 13 #define int_inf 0x3f3f3f3f 14 #define ll_inf 0x7f7f7f7f7f7f7f7f 15 #define lson (curpos<<1) 16 #define rson (curpos<<1|1) 17 /* namespace */ 18 using namespace std; 19 /* header end */ 20 21 const int maxn = 1e5 + 10; 22 int a[maxn]; 23 24 struct Node { 25 int l, r, val[50]; 26 }; 27 28 Node segt[maxn << 2]; 29 30 void maintain(Node &fa, Node &ls, Node &rs) { 31 int i = 0, j = 0; 32 rep0(c, 0, 50) { 33 if (i >= 50) 34 fa.val[c] = rs.val[j++]; 35 else if (j >= 50) 36 fa.val[c] = ls.val[i++]; 37 else if (ls.val[i] < rs.val[j]) 38 fa.val[c] = rs.val[j++]; 39 else fa.val[c] = ls.val[i++]; 40 } 41 } 42 43 void build(int curpos, int curl, int curr) { 44 segt[curpos].l = curl, segt[curpos].r = curr; 45 // memset(segt[curpos].val, 0, sizeof(segt[curpos].val)); 46 if (curl < curr) { // if is not leaf node 47 int mid = curl + curr >> 1; 48 build(lson, curl, mid); build(rson, mid + 1, curr); 49 maintain(segt[curpos], segt[lson], segt[rson]); 50 } else 51 segt[curpos].val[0] = a[curl]; // if is leaf node 52 } 53 54 Node query(int curpos, int curl, int curr) { 55 if (segt[curpos].l == curl && segt[curpos].r == curr) return segt[curpos]; 56 else { 57 int mid = segt[curpos].l + segt[curpos].r >> 1; 58 if (curr <= mid) return query(lson, curl, curr); 59 else if (curl > mid) return query(rson, curl, curr); 60 else { 61 Node lnode = query(lson, curl, mid), rnode = query(rson, mid + 1, curr); 62 Node ret; ret.l = curl, ret.r = curr; 63 maintain(ret, lnode, rnode); 64 return ret; 65 } 66 } 67 } 68 69 int main() { 70 int n, q; 71 while (~scanf("%d%d", &n, &q)) { 72 rep1(i, 1, n) scanf("%d", &a[i]); 73 build(1, 1, n); 74 while (q--) { 75 int l, r; scanf("%d%d", &l, &r); 76 Node cur = query(1, l, r); 77 ll ans = -1; 78 rep0(i, 0, 48) { 79 if ((ll)cur.val[i] < (ll)cur.val[i + 1] + (ll)cur.val[i + 2]) { 80 ans = (ll)cur.val[i] + (ll)cur.val[i + 1] + (ll)cur.val[i + 2]; 81 break; 82 } 83 } 84 printf("%lld\n", ans); 85 } 86 } 87 return 0; 88 }
L:
又是线段树题,背锅。
原文地址:https://www.cnblogs.com/JHSeng/p/11241234.html
时间: 2024-11-09 05:46:41