为了Rating!打了场月赛
感觉比以前菜了?
T1
大水题,直接暴力搞,我用上了dfs
结果行末有空格竟然只有50分!!!
诶wa了一次,乐多赛制扣了5分
Code:
#include <bits/stdc++.h>
#define maxn 2010
using namespace std;
int n, a[maxn][maxn];
void dfs(int x1, int y1, int x2, int y2){
if (x1 == x2) a[x1][y1] = 1; else{
int l = x2 - x1 + 1;
l >>= 1;
dfs(x1, y1 + l, x2 - l, y2);
dfs(x1 + l, y1, x2, y2 - l);
dfs(x1 + l, y1 + l, x2, y2);
}
}
int main(){
scanf("%d", &n);
n = 1 << n;
dfs(1, 1, n, n);
for (int i = 1; i <= n; printf("%d\n", a[i++][n])) for (int j = 1; j < n; ++j) printf("%d ", a[i][j]);
return 0;
}
T2
数组模拟链表,我打的可能比较麻烦,还有wa了一发
又扣了5分
Code:
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
struct node{
int x, id, l, r;
}a[maxn];
int val[maxn], n, cnt, print[maxn], vis[maxn], id[maxn];
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
bool cmp(node x, node y){ return x.x > y.x; }
int main(){
n = read();
for (int i = 1; i <= n; ++i) a[i].x = val[i] = read(), a[i].id = i;
for (int i = 1; i <= n; ++i) a[i].l = i - 1, a[i].r = i + 1;
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; ++i) id[a[i].id] = i;
for (int i = 1; i <= n; ++i)
if (!vis[a[i].id]){
if (a[i].r < 1 || a[i].r > n) continue;
print[++cnt] = a[i].x, print[++cnt] = val[a[i].r];
a[id[a[id[a[i].r]].r]].l = a[i].l, a[id[a[i].l]].r = a[id[a[i].r]].r;
vis[a[i].r] = 1;
}
for (int i = 1; i < cnt; ++i) printf("%d ", print[i]);
printf("%d\n", print[cnt]);
return 0;
}
T3
区间逆序对总数
马上反应过来树状数组
离散化+树状数组就行啦
然后这道题非常坑,一开始wa了3个,一直不知道拿错了
在我提交了6次以后终于意识到,爆longlong!
什么鬼?这怎么搞
后来在%%%xzy神仙的帮助下知道可以用__int128,最后一位一位输出就行了
Code:
#include <bits/stdc++.h>
#define maxn 2000010
#define LL long long
using namespace std;
struct node{
int x, id;
}a[maxn];
int b[maxn], n, p;
LL tree[maxn];
__int128 ans;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
bool cmp(node x, node y){ return x.x < y.x; }
void update(int x, int y){ for (; x; x -= x & -x) tree[x] += y; }
LL query(int x){ LL sum = 0; for (; x <= p; x += x & -x) sum += tree[x]; return sum; }
inline void write(__int128 x){
if(x<0){putchar('-');x=~(x-1);}
int s[200],top=0;
while(x){s[++top]=x%10;x/=10;}
if(!top)s[++top]=0;
while(top)putchar(s[top--]+'0');
puts("");
}
signed main(){
n = read();
for (int i = 1; i <= n; ++i) a[i].x = read(), a[i].id = i;
sort(a + 1, a + 1 + n, cmp);
a[0].x = a[1].x - 1;
p = 0;
for (int i = 1; i <= n; ++i) b[a[i].id] = a[i].x == a[i - 1].x ? p : ++p;
for (int i = 1; i <= n; ++i){
ans += query(b[i] + 1) * 1LL * (n - i + 1);
update(b[i], i);
}
write(ans);
return 0;
}
T4
直接打了个暴力去吃饭了
没什么可说的,感觉挺难
Code:
#include <bits/stdc++.h>
#define maxn 1000010
using namespace std;
int f[maxn], cnt, a[maxn], vis[1000][1000], l[1000], r[1000], n, ans;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int get(int k){ return k == f[k] ? k : f[k] = get(f[k]); }
void Do(){
int sum = 0;
for (int i = 1; i <= cnt; ++i) f[a[i]] = a[i];
for (int i = 1; i <= cnt; ++i)
for (int j = i + 1; j <= cnt; ++j)
if (vis[a[i]][a[j]]){
++sum;
int s1 = get(a[i]), s2 = get(a[j]);
if (s1 != s2) f[s1] = s2;
}
if (sum != cnt - 1) return;
for (int i = 2; i <= cnt; ++i) if (get(a[i]) != get(a[1])) return;
++ans;
}
void dfs(int k){
if (k > n) Do(); else{
a[++cnt] = k;
dfs(k + 1);
--cnt;
dfs(k + 1);
}
}
int main(){
n = read();
for (int i = 1; i <= n; ++i) l[i] = read(), r[i] = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j){
int L = max(l[i], l[j]), R = min(r[i], r[j]);
if (L <= r[i] && R >= l[i] && L <= r[j] && R >= l[j]) vis[i][j] = vis[j][i] = 1;
}
dfs(1);
printf("%d\n", ans);
return 0;
}
感觉挺简单的,不过今天心情有点浮躁所以没打好
继续加油

872

被折叠的 条评论
为什么被折叠?



