又上分了,好像打的还可以就会懒得补后面的题
sort一下,没什么好说的
很容易(并非)可以看出最多只需要一次就可以了,举个例子假设你两次删除的分别是(())和 (),你会发现你只需要删除( ( ) ) ( ) 这几个,剩下的就一定不能再删了,如果)前面还有能配对的那一定就能一次删掉,所以只需要一次,从两端循环不停的找配对的就可以了
#include <cstdio> #include <cstring> #include <vector> #include <queue> using namespace std; priority_queue < int, vector < int >, greater<int> > ans; char s[1010]; int main() { scanf("%s", s); int len = strlen(s); int l = 0, r = len - 1; while (l < r) { // printf("%d %d ", l, r); while (s[l] != '(' && l < r && l < len) l++; while (s[r] != ')' && l < r && r > 0) r--; if (l >= r) break; ans.push(l); ans.push(r); l++, r--; } if (ans.empty()) printf("0"); else { puts("1"); printf("%d ", ans.size()); while (!ans.empty()) { printf("%d ", ans.top() + 1); ans.pop(); } } return 0; }
C.Kuroni and Impossible Calculation
被C卡了半天(丢人),可以发现模很小,那么当n>m的时候,一定会存在ai 和 aj 使ai % m == aj % m,那这两个数相减就是0了,所以n>m,答案一定是0,那1000一下直接暴力就好了
#include <cstdio> #include <algorithm> using namespace std; const int N = 2 * 1e5 + 10; int a[N], b[N]; int maxn[N], minn[N], flag[N]; int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a + n); long long ans = 1; if (n > m + 10) { puts("0"); return 0; } for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) ans = (1ll * ans * ((a[j] - a[i]) % m)) % m; printf("%lld", ans); }
交互题?至少有两年没做过了,oi退役之后再也没见过交互题,没想到cf会出这种题,不过我随便水了一下没想到过了,思路就是先找到一个只连了一条边的节点,开始往上搜索,每次询问连着三个的两端两个,然后就能至少排除两个,所以可以在n/2的时间内完成,具体细节参考代码(我也不知道我怎么过的)
#include <cstdio> #include <vector> using namespace std; const int N = 1010; vector < int > e[N]; bool flag[N]; int main() { int n; scanf("%d", &n); for (int i = 0; i < n - 1; i++) { int u, v; scanf("%d %d", &u, &v); e[u].push_back(v); e[v].push_back(u); } int u = 0; for (int i = 1; i <= n; i++) if (e[i].size() == 1) u = i; flag[u] = true; while (true) { int a = 0, b = 0; for (int i = 0; i < e[u].size(); i++) if (!flag[e[u][i]]) a = e[u][i]; if (a == 0) { printf("! %d", u); break; } flag[a] = true; for (int i = 0; i < e[u].size(); i++) if (!flag[e[u][i]]) b = e[u][i]; if (b == 0) { for (int i = 0; i < e[a].size(); i++) if (!flag[e[a][i]]) b = e[a][i]; if (b == 0) printf("? %d %d ", u, a); else printf("? %d %d ", u, b); fflush(stdout); } else { printf("? %d %d ", a, b); fflush(stdout); } flag[b] = true; scanf("%d", &u); } return 0; }