勉勉强强算是五题都出了
但是第五题的算法还是一知半解的状态
单纯在贴模板而已,回头重写
B. Young Table
英语捉急,发现是Special Judge后立马就出了。。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> using namespace std; int n,sum,aim; int c[105]; struct node { int shu; int x,y; }; node s[10005]; int s2[10005]; int xx1[10005]; int yy1[10005]; int xx2[10005]; int yy2[10005]; bool cmp(int x,int y) { return x < y; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&c[i]); sum = 0; for(int i=1;i<=n;i++) { for(int j=1;j<=c[i];j++) { scanf("%d",&s[sum].shu); s[sum].x = i; s[sum].y = j; s1[sum] = s[sum].shu; sum++; } } sort(s1,s1 + sum,cmp); aim = 0; for(int i=0;i<sum;i++) { while(s[i].shu != s1[i]) { for(int j=i+1;j<sum;j++) { if(s[i].shu == s1[j]) { xx1[aim] = s[i].x; yy1[aim] = s[i].y; xx2[aim] = s[j].x; yy2[aim] = s[j].y; swap(s[i].shu,s[j].shu); aim++; break; } } } } printf("%d\n".aim); for(int i=0;i<aim;i++) { printf("%d %d %d %d\n",xx1[i],yy1[i],xx2[i],yy2[i]); } return 0; }
C. Primes on Interval
一开始二分没写好
重写简化之后就好多了
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> using namespace std; bool s[1000005]; int su[1000005]; int shu; int aa,a,b,k,aim,lia; void get(int x) { memset(s,0,sizeof(s)); shu = 0; s[0] = s[1] = 1; su[0] = su[1] = 0; for(int i=2;i<=x;i++) { if(s[i] == 0) { shu++; for(int j=i*2;j<=x;j+=i) s[j] = 1; } su[i] = shu; } } int main() { scanf("%d%d%d",&a,&b,&k); get(b); //cout<<shu<<endl; if(shu - su[a - 1]< k) { printf("-1\n"); } else { int high = b - a + 1; int low = 1; int mid,q; while(low < high) { mid = (low + high) / 2; q = 0; for(int i = a; i <= b - mid + 1;i++) { if(su[i + mid - 1] - su[i - 1] < k) { q=1; } } if(q == 0) { high=mid; } else { low = mid + 1; } } printf("%d\n",high); } return 0; }
D. T-decomposition
又是万恶的Special Judge。。早知道就写了。。还是英语问题。。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; vector<int> s[100005]; int main() { int n,x,y,i,j; scanf("%d",&n); printf("%d\n",n-1); for(i=1; i<n; i++) { scanf("%d%d",&x,&y); s[x].push_back(i); s[y].push_back(i); printf("2 %d %d\n",x,y); } for(i=1; i<=n; i++) { for(j=1; j<s[i].size(); j++) { printf("%d %d\n",s[i][j-1],s[i][j]); } } return 0; }
E. Build String
听说是最小费用最大流,但是看着模板写完也没明白是怎么运转的。。回头重写
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <map> #include <queue> #include <set> #define MAXM 1111111 #define MAXN 11111 #define INF 1000000007 using namespace std; struct EDGE { int v, cap, cost, next, re; } edge[MAXM]; int n, m, ans, flow, src, des; int e, head[MAXN]; int que[MAXN], pre[MAXN], dis[MAXN]; bool vis[MAXN]; void init() { e = ans = flow = 0; memset(head, -1, sizeof(head)); } void add(int u, int v, int cap, int cost) { edge[e].v = v; edge[e].cap = cap; edge[e].cost = cost; edge[e].next = head[u]; edge[e].re = e + 1; head[u] = e++; edge[e].v = u; edge[e].cap = 0; edge[e].cost = -cost; edge[e].next = head[v]; edge[e].re = e - 1; head[v] = e++; } bool spfa() { int i, h = 0, t = 1; for(i = 0; i <= n; i ++) { dis[i] = INF; vis[i] = false; } dis[src] = 0; que[0] = src; vis[src] = true; while(t != h) { int u = que[h++]; h %= n; vis[u] = false; for(i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(edge[i].cap && dis[v] > dis[u] + edge[i].cost) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]) { vis[v] = true; que[t++] = v; t %= n; } } } } if(dis[des] == INF) return false; return true; } void end() { int u, p, mi = INF; for(u = des; u != src; u = edge[edge[p].re].v) { p = pre[u]; mi = min(mi, edge[p].cap); } for(u = des; u != src; u = edge[edge[p].re].v) { p = pre[u]; edge[p].cap -= mi; edge[edge[p].re].cap += mi; ans += mi * edge[p].cost; } flow += mi; } char str[111], req[11111]; int nt; int tt[11111]; int ss; void build() { scanf("%s", req); scanf("%d", &nt); ss = strlen(req); for(int i = 0; i < ss; i++) tt[req[i] - 'a']++; src = 1; n = nt + 28; des = n; int v[33]; int xy; for(int i = 0; i < nt; i++) { scanf("%s%d", str, &xy); int len = strlen(str); memset(v, 0, sizeof(v)); int now = 2 + i; add(src, now, xy, 0); for(int j = 0; j < len; j++) v[str[j] - 'a']++; for(int j = 0; j < 26; j++) if(v[j]) add(now, nt + 2 + j, v[j], i + 1); } for(int i = 0; i < 26; i++) add(nt + 2 + i, des, tt[i], 0); } void MCMF() { init(); build(); while(spfa()) end(); if(flow != ss) printf("-1\n"); else printf("%d\n", ans); } int main() { MCMF(); return 0; }