(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)
(建议您从上方链接进入我的个人网站查看此 Blog,在 Luogu 中图片会被墙掉,部分 Markdown 也会失效)
原题是 LG-P1533 可怜的狗狗,但是数据弱化了,
Code:
xxxxxxxxxx66123
4using namespace std;5
6789
10mt19937 rnd(random_device{}());11int rndd(int l, int r){return rnd() % (r - l + 1) + l;}12
13typedef long long ll;14typedef unsigned long long unll;15
16template <typename T = int>17inline T read(void);18
19int N, M;20// priority_queue < pair< int, int >, vector < pair < int, int > >, greater < pair < int, int > > >a;21vector < pair < int, int > > a;22
23int main(){24 freopen("dog.in", "r", stdin);25 freopen("dog.out", "w", stdout);26 N = read(), M = read();27 for(int i = 1; i <= N; ++i)a.push_back(make_pair(read(), i)); //a.push(make_pair(read(), i));28 sort(a.begin(), a.end());29 while(M--){30 int f = read(), t = read(), k = read();31 int cnt(0);32 for(auto i : a){33 if(f <= i.second && i.second <= t)++cnt;34 if(cnt == k){printf("%d\n", i.first); break;}35 }36 }37
38
39 // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);40 return 0;41}42
43template < typename T >44inline T read(void){45 T ret(0);46 T flag(1);47 char c = getchar();48 while(!isdigit(c) && c != '-')c = getchar();49 if(c == '-')flag = 1, c = getchar();50 while(isdigit(c)){51 ret *= 10;52 ret += int(c - '0');53 c = getchar();54 }55 ret *= flag;56 return ret;57}58
59/* Examples:607 2611 5 2 6 3 7 4621 5 3632 7 164
65
66*/是一道状压 DP,从数据量就可以很显然的看出来,但是赛时没考虑到用最短路来写,因为过程中是可以重复访问已经经过的点,就被这一点卡住了没写出来转移方程,最后没什么想法了就写了个 BFS + 乱搞 + 卡时,20pts,原题是 HDU5418 Victor and World。
Code:
xxxxxxxxxx147123
4using namespace std;5
678910
111213
14// #define MAXK ((1 << i) - 1)15
16mt19937 rnd(random_device{}());17int rndd(int l, int r){return rnd() % (r - l + 1) + l;}18
19typedef long long ll;20typedef unsigned long long unll;21
22template <typename T = int>23inline T read(void);24int T, _T;25int G[20][20];26// int dp[20][1 << 16];27// int dp[20][20][100 * 20];28int N, M;29bool used[20];30int ans(INT_MAX);31void Clear(void){32 memset(G, -1, sizeof(G));33 // memset(dp, 0x3f, sizeof(dp));34 memset(used, 0, sizeof(used));35 ans = INT_MAX;36}37
38struct que{39 int pos;40 int pri;41 bitset < 17 > used;42 que(int _pos, int _pri):pos(_pos), pri(_pri){used.reset();}43 void operator=(que x){44 this->pos = x.pos;45 this->pri = x.pri;46 this->used = x.used;47 }48};49void BFS(void){50 double begT = (double)clock() / CLOCKS_PER_SEC;51 queue < que > q;52 que top(1, 0);53 top.used[1] = true; 54 q.push(top);55 while( ( (double)clock() / CLOCKS_PER_SEC - begT ) <= SUBTIME && !q.empty()){56 // printf("BFS\n");57 for(int i = 1; i <= 100 && !q.empty(); ++i){58 auto tmp = q.front(); q.pop();59 if((int)tmp.used.count() == N && tmp.pos == 1){60 // printf("FIND ANS pos = %d, cost = %d\n", tmp.pos, tmp.pri); cout<<tmp.pri<<endl;61 ans = min(ans, tmp.pri);62 continue;63 }64 for(int j = 1; j <= N; ++j){65 auto tmpp = tmp;66 if(~G[tmpp.pos][j]){67 tmpp.pri += G[tmpp.pos][j];68 tmpp.used[j] = 1;69 tmpp.pos = j;70 q.push(tmpp);71 }72 }73 }74 }75}76
77// void DFS(int dep, int pos, int cost){78// if(dep > N)return (void)(ans = min(ans, cost));79// for(int i = 1; i <= N; ++i){80// if(~G[pos][i] && !used[i]){81// used82// }83// }84// }85
86int main(){87 freopen("travel.in", "r", stdin);88 freopen("travel.out", "w", stdout);89 T = read();90 _T = T;91 while(T--){92 Clear();93 // printf("TEST: %d\n", dp[1][1]);94 N = read(), M = read();95 for(int i = 1; i <= M; ++i){96 int f = read(), t = read(), w = read();97 if(!~G[f][t])G[f][t] = G[t][f] = w;98 else G[f][t] = G[t][f] = min(G[f][t], w);99 }100 BFS();101 // printf("%.6lf", (MAXTIME / (double)T));102 printf("%d\n", ans);103 // for(int i = 1; i <= N; ++i){104 // for(int j = 0; j <= MAXJ; ++j){105 // // for(int k = 0; k <= MAXJ; ++k){106 // // dp[i][j] = min(dp[i][j], dp[i - 1][])107 // // }108 // for(int k = 0; k < i; ++k){109 // if(dp[])110 // }111 // }112 // }113 // for(int i = 1; i <= N; ++i){114 // for(int j = 1; j <= N; ++i){115
116 // }117 // }118
119 }120
121
122
123 // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);124 return 0;125}126
127template < typename T >128inline T read(void){129 T ret(0);130 T flag(1);131 char c = getchar();132 while(!isdigit(c) && c != '-')c = getchar();133 if(c == '-')flag = 1, c = getchar();134 while(isdigit(c)){135 ret *= 10;136 ret += int(c - '0');137 c = getchar();138 }139 ret *= flag;140 return ret;141}142
143/* Examples:144
145
146
147*/一道根号分治的数学题,因为看到输入数据只有一个数所以考虑本地
原题是 ICPC2019 银川 F,似乎在计蒜客上有,链接。
Code:
xxxxxxxxxx76123
4using namespace std;5
6789
1011
1213mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15
16typedef long long ll;17typedef unsigned long long unll;18
19template <typename T = int>20inline T read(void);21
22
23ll CAL(int N){24 ll ans(0ll);25 for(int a = 2; a <= N; ++a){26 ll tmp(0);27 for(int b = a; b <= N; ++b){28 tmp = ( tmp + (int)(floor(logg(a, b)) * ceil(logg(b, a))) % MOD ) % MOD; 29 }30 ans = (ans + (a * tmp) % MOD ) % MOD;31 }32 return ans;33}34
35int ans[6000010] = {0, 0, 2,7,18,34,56,85,124,175,236,308,392,489,600,726,874,1039,1222,1424,1646,1889,2154,2442,2754,3096,3464,3862,4288,4743,5228,5744,6294,6877,7494,8146,8840,9571,10340,11148,11996,12885,13816,14790,15808,16871,17980,19136,20340,21600,22910,24271,25684,27150,28670,30245,31876,33564,35310,37115,38980,40906,42894,44945,47074,49268,51528,53855,56250,58714,61248,63853,66530,69280,72104,75003,77978,81030,84160,87369,90658,94040,97504,101051,104682,108398,112200,116089,120066,124132,128288,132535,136874,141306,145832,150453,155170,159984,164896,169907,175028,36
37 //这中间是不到1e4条数据,太长了我就删了38 943867507,971865423,1626469,29639352,57659720,85687574,113722915,141765744,169816062,197873870,225939169,254011960,282092244,310180022,338275295};39
40int main(){41 42 freopen("function.in", "r", stdin);43 freopen("function.out", "w", stdout);44 ans[10483]=423591818,ans[18804]=371933020,ans[21915]=628094753,ans[15108]=922305915,ans[28044]=8382477,ans[15834]=992863592,ans[13795]=451174431,45 //这中间也是很多数据,太长了我就删了46 ans[22615]=477214908,ans[10408]=323781780,ans[12145]=205002082,ans[14837]=486795542,ans[29535]=195266508,ans[24719]=232233760,47ans[26203]=282953812,ans[18512]=447383303,ans[20765]=214864064,ans[21034]=75964550,ans[26885]=9951939,ans[26692]=628205313;48 int tmp = read();49 if(ans[tmp]){printf("%d\n", ans[tmp]); return 0;}50 printf("%lld\n", CAL(tmp));51 // printf("%d\n", ans[read()]);52 // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);fflush(stderr);53 return 0;54}55
56template < typename T >57inline T read(void){58 T ret(0);59 T flag(1);60 char c = getchar();61 while(!isdigit(c) && c != '-')c = getchar();62 if(c == '-')flag = 1, c = getchar();63 while(isdigit(c)){64 ret *= 10;65 ret += int(c - '0');66 c = getchar();67 }68 ret *= flag;69 return ret;70}71
72/* Examples:73
74
75
76*/这题本来我还以为能切掉了呢,非常显然的网络流求最小割和最小割集(或者说不需要割集,算边数就行)。没想到一次 Dinic 的做法所以写了个两次 Dinic 的,理论上是可以切的不过在第二次 Dinic 的时候,对于如何改边权有点问题所以炸了,最后 40pts。
原题 LG-P1344 [USACO4.4]追查坏牛奶Pollutant Control
Code:
xxxxxxxxxx124123
4using namespace std;5
6789
10mt19937 rnd(random_device{}());11int rndd(int l, int r){return rnd() % (r - l + 1) + l;}12
13typedef long long ll;14typedef unsigned long long unll;15
16template <typename T = int>17inline T read(void);18int N, M;19struct Edge{20 Edge* nxt;21 Edge* rev;22 int to;23 ll val;24 void* operator new(size_t);25 Edge(Edge* _nxt, Edge* _rev, int _to, ll _val):nxt(_nxt), rev(_rev), to(_to), val(_val){;}26 Edge(void) = default;27}eData[3100];28void* Edge::operator new(size_t){static Edge* P = eData; return ++P;}29Edge *head[50], *cur[50];30
31int S = 1, T;32int dep[50];33
34ll dfs(int p = S, ll curFlow = INT_MAX){35 if(p == T)return curFlow;36 ll cost(0);37 for(auto &i = cur[p]; i; i = i->nxt){38 if(i->val > 0 && dep[i->to] == dep[p] - 1){39 ll icost = dfs(i->to, min(curFlow - cost, i->val));40 cost += icost;41 i->val -= icost;42 i->rev->val += icost;43 }44 if(cost == curFlow)break;45 }46 if(!cost)dep[p] = INT_MAX;47 return cost;48}49
50bool bfs(void){51 copy(head + 1, head + N + 1, cur + 1);52 memset(dep, 0, sizeof(dep));53 queue < int > q;54 q.push(T);55 dep[T] = 1;56 while(!q.empty()){57 int t = q.front(); q.pop();58 for(auto i = head[t]; i; i = i->nxt){59 if(!dep[i->to] && i->rev->val > 0){60 dep[i->to] = dep[t] + 1;61 q.push(i->to);62 }63 }64 }65 return dep[S];66}67
68ll Dinic(void){69 ll ret(0), tmp;70 while(bfs())while((tmp = dfs()))ret += tmp;71 return ret;72}73
74int main(){75 freopen("control.in", "r", stdin);76 freopen("control.out", "w", stdout);77 N = read(), M = read();78 T = N;79 for(int i = 1; i <= M; ++i){80 int f = read(), t = read(), v = read<ll>();81 head[f] = new Edge(head[f], npt, t, v);82 head[t] = new Edge(head[t], npt, f, 0);83 head[f]->rev = head[t];84 head[t]->rev = head[f];85 }86 printf("%lld", Dinic());87 for(int i = 1; i <= N; ++i){88 for(auto j = head[i]; j; j = j->nxt){89 if(!j->val && !j->rev->val)j->rev->val = 1, j->val = 0;90 }91 }92 for(int i = 1; i <= N; ++i){93 for(auto j = head[i]; j; j = j->nxt){94 // if(!j->val && !j->rev->val)continue;95 if(!j->val)j->val = 1;96 else j->val = 0;97 }98 }99 printf(" %lld\n", Dinic());100 // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);101 return 0;102}103
104template < typename T >105inline T read(void){106 T ret(0);107 T flag(1);108 char c = getchar();109 while(!isdigit(c) && c != '-')c = getchar();110 if(c == '-')flag = 1, c = getchar();111 while(isdigit(c)){112 ret *= 10;113 ret += int(c - '0');114 c = getchar();115 }116 ret *= flag;117 return ret;118}119
120/* Examples:121
122
123
124*/别问为什么不是按顺序来的
主要是出现了以下几个问题
AC Code:
xxxxxxxxxx122123
4using namespace std;5
6789
10mt19937 rnd(random_device{}());11int rndd(int l, int r){return rnd() % (r - l + 1) + l;}12
13typedef long long ll;14typedef unsigned long long unll;15
16template <typename T = int>17inline T read(void);18int N, M;19struct Edge{20 Edge* nxt;21 Edge* rev;22 int to;23 ll val;24 bool isRev;25 void* operator new(size_t);26 Edge(Edge* _nxt, Edge* _rev, int _to, ll _val):nxt(_nxt), rev(_rev), to(_to), val(_val), isRev(false){;}27 Edge(void) = default;28}eData[3100];29void* Edge::operator new(size_t){static Edge* P = eData; return ++P;}30Edge *head[50], *cur[50];31
32int S = 1, T;33int dep[50];34
35ll dfs(int p = S, ll curFlow = INT_MAX){36 if(p == T)return curFlow;37 ll cost(0);38 for(auto &i = cur[p]; i; i = i->nxt){39 if(i->val > 0 && dep[i->to] == dep[p] - 1){40 ll icost = dfs(i->to, min(curFlow - cost, i->val));41 cost += icost;42 i->val -= icost;43 i->rev->val += icost;44 }45 if(cost == curFlow)break;46 }47 if(!cost)dep[p] = INT_MAX;48 return cost;49}50
51bool bfs(void){52 copy(head + 1, head + N + 1, cur + 1);53 memset(dep, 0, sizeof(dep));54 queue < int > q;55 q.push(T);56 dep[T] = 1;57 while(!q.empty()){58 int t = q.front(); q.pop();59 for(auto i = head[t]; i; i = i->nxt){60 if(!dep[i->to] && i->rev->val > 0){61 dep[i->to] = dep[t] + 1;62 q.push(i->to);63 }64 }65 }66 return dep[S];67}68
69ll Dinic(void){70 ll ret(0), tmp;71 while(bfs())while((tmp = dfs()))ret += tmp;72 return ret;73}74
75int main(){76 // freopen("control.in", "r", stdin);77 // freopen("control.out", "w", stdout);78 N = read(), M = read();79 for(int i = 1; i <= M; ++i){80 int f = read(), t = read(), v = read<ll>();81 N = max(N, max(f, t));82 if(f == t)continue;83 head[f] = new Edge(head[f], npt, t, v);84 head[t] = new Edge(head[t], npt, f, 0);85 head[f]->rev = head[t];86 head[t]->rev = head[f];87 head[t]->isRev = true;88 }89 T = N;90 printf("%lld", Dinic());91 for(int i = 1; i <= N; ++i){92 for(auto j = head[i]; j; j = j->nxt){93 if(!j->isRev && !j->val)j->val = 1, j->rev->val = 0;94 else if(!j->isRev && j->val)j->val = 32767, j->rev->val = 0;95 }96 }97 printf(" %lld\n", Dinic());98 // fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);99 return 0;100}101
102template < typename T >103inline T read(void){104 T ret(0);105 T flag(1);106 char c = getchar();107 while(!isdigit(c) && c != '-')c = getchar();108 if(c == '-')flag = 1, c = getchar();109 while(isdigit(c)){110 ret *= 10;111 ret += int(c - '0');112 c = getchar();113 }114 ret *= flag;115 return ret;116}117
118/* Examples:119
120
121
122*/对于 Luogu 上的数据,由于这题主席树是在太裸了,所以直接交以前写的板子就行。
(该说不说这题 128MB 如果用主席树的话空间卡的特别死,用指针写法可能会 MLE,没有 oop 的感觉了很烦)
AC Code:
xxxxxxxxxx10612using namespace std;3
4567
8typedef unsigned int uint;9typedef unsigned long long unll;10typedef long long ll;11
1213
14template<typename T = int>15inline T read(void);16
17struct Tree{18 int ls, rs, val;19}t[MAXN << 5];20int root[MAXN];21int tot(0);22int Build(int l, int r){23 int vert(++tot);24 t[vert].val = 0;25 if(l == r)return vert;26 int mid = (l + r) >> 1;27 t[vert].ls = Build(l, mid);28 t[vert].rs = Build(mid + 1, r);29 return vert;30}31int Create(int l, int r, int val, int lV){32 int vert(++tot);33 t[vert].val = t[lV].val + 1, t[vert].ls = t[lV].ls, t[vert].rs = t[lV].rs;34 if(l == r)return vert;35 int mid = (l + r) >> 1;36 if(val <= mid)t[vert].ls = Create(l, mid, val, t[vert].ls);37 else t[vert].rs = Create(mid + 1, r, val, t[vert].rs);38 return vert;39}40int Query(int l, int r, int qx, int qy, int k){//return position41 if(l == r)return l;42 int leftVal(t[t[qy].ls].val - t[t[qx].ls].val);43 int mid = (l + r) >> 1;44 if(k <= leftVal)return Query(l, mid, t[qx].ls, t[qy].ls, k);45 else return Query(mid + 1, r, t[qx].rs, t[qy].rs, k - leftVal);46}47int N, M;48// vector<int>arr;49// vector<int>oarr;50int arr[310000], oarr[310000];51int main(){52 // freopen("in.txt", "r", stdin);53
54
55 N = read(), M = read();56 for(int i = 1; i <= N; ++i)arr[i] = oarr[i] = read();57 sort(arr + 1, arr + N + 1, less<int>());58 int rn = unique(arr + 1, arr + N + 1) - (arr + 1);59 root[0] = Build(1, rn);60 for(int i = 1; i <= N; ++i){61 int pos = lower_bound(arr + 1, arr + rn + 1, oarr[i]) - arr;62 root[i] = Create(1, rn, pos, root[i - 1]);63 }64 for(int i = 1; i <= M; ++i){65 int l = read(), r = read(), k = read();66 printf("%d\n", arr[Query(1, rn, root[l - 1], root[r], k)]);67 }68
69
70 // for(int i = 1; i <= N; ++i)arr.push_back(read()), oarr.push_back(arr.at(i - 1));71 // sort(arr.begin(), arr.end());72 // int rn = unique(arr.begin(), arr.end()) - arr.begin();73 // printf("%d\n", arr.end() - arr.begin());74 // root[0] = Build(1, rn);75 // for(int i = 1; i <= N; ++i){76 // int pos = lower_bound(arr.begin(), arr.begin() + rn, oarr.at(i - 1)) - arr.begin();77 // root[i] = Create(1, rn, pos, root[i - 1]);78 // }79 // for(int i = 1; i <= M; ++i){80 // int l = read(), r = read(), k = read();81 // // int pos1 = lower_bound(arr.begin(), arr.end(), oarr.at(l - 1 - 1)) - arr.begin();82 // // int pos2 = lower_bound(arr.begin(), arr.end(), oarr.at(r - 1)) - arr.begin();83 // printf("Query: %d\n", Query(1, rn, root[l - 1], root[r], k));84 // printf("%d\n", oarr.at(Query(1, rn, root[l - 1], root[r], k) - 1));85 // }86
87 return 0;88}89
90
91
92template<typename T>93inline T read(void){94 T ret(0);95 short flag(1);96 char c = getchar();97 while(c != '-' && !isdigit(c))c = getchar();98 if(c == '-')flag = -1, c = getchar();99 while(isdigit(c)){100 ret *= 10;101 ret += int(c - '0');102 c = getchar();103 }104 ret *= flag;105 return ret;106}这题感觉挺好的(所以单独写了一篇题解)
咕咕咕
update-2022_08_25 初稿 别问我为什么8.24模拟赛8.25初稿