目录
T3
码风较为清奇的70分代码(赛时写的,现在懒得调,先放上来再说)
用一个map将角色名映射成数字,然后建2个map数组,其下标对应映射前的角色,然后分别表示这个角色关联的用户和用户组名称,用bool的值代表该角色是否关联了用户和用户组。
然后同上,建3个map数组分别表示下标对应角色能进行的操作,资源和资源名称。
map乱搞。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
string res[N];//临时存关联用户组
map<string, int> peo;//将角色映射成数字
int f1[N], f2[N], f3[N];//判断分别可以匹配所有操作,资源,资源种类
map<string, bool> up[N], gp[N];//分别对应用户,用户组
map<string, bool> op[N], sc[N], sn[N];//操作,资源,资源种类
//数组的维度代表是哪一个角色
//然后就是硬模拟一下
int main(){
string a, b, c, d, e;
int n, m, q;
cin >> n >> m >> q;
for(int i = 1; i <= n; i++) {
cin >> a;
peo[a] = i;
int nv;
cin >> nv;
for(int j = 1; j <= nv; j++) {
cin >> b;
if(b == "*") {
f1[i] = 1;
}
op[i][b] = 1;
}
int no;
cin >> no;
for(int j = 1; j <= no; j++) {
cin >> c;
if(c == "*") {
f2[i] = 1;
}
sc[i][c] = 1;
}
int nn;
cin >> nn;
if(nn == 0) f3[i] = 1;
for(int j = 1; j <= nn; j++) {
cin >> d;
sn[i][d] = 1;
}
}
for(int i = 1; i <= m; i++) {
cin >> a;
int ns;
cin >> ns;
while(ns --){
cin >> b >> c;
if(b == "g") {
gp[peo[a]][c] = 1;
}
if(b == "u") {
up[peo[a]][c] = 1;
}
}
}
while(q--) {
int flag = 0;
cin >> a;
int ng;
cin >> ng;
for(int i = 1; i <= ng; i++)
cin >> res[i];
cin >> b >> c >> d;
for(int i = 1; i <= ng; i++) {
for(int j = 1; j <= n; j++) {
if(gp[j][res[i]]) {
if((f1[j] || op[j][b]) && (f2[j] || sc[j][c]) && (f3[j] || sn[j][d])) {
flag = 1;
break;
}
}
}
if(flag) break;
}
if(!flag)
for(int i = 1; i <= n; i++) {
if(up[i][a]) {
if((f1[i] || op[i][b] ) &&(f2[i] || sc[i][c]) && (f3[i] || sn[i][d])) {
flag = 1;
break;
}
}
}
if(flag) cout << 1 << "\n";
else cout << 0 << "\n";
}
}
T2
用map模拟一下就行了。
先用一个数组记录一下大地图里面1的坐标。然后以每个为1的坐标为左下角的点,直接和藏宝图匹配就行了。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
map<pair<int,int>, bool> a;
int b[N][N];
pair<int, int> c[N];
int main() {
int n, L, s;
cin >> n >> L >>s;
for(int i = 1, x, y; i <= n; i++) {
cin >> x >> y;
a[{x, y}] = 1;
c[i - 1].first = x;
c[i - 1].second = y;
}
for(int i = s; i >= 0; i--) {
for(int j = 0; j <= s; j++) {
cin >> b[i][j];
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
if(c[i].first <= L -s && c[i].second <= L -s) {
bool flag = 1;
int x = c[i].first, y = c[i].second;
for(int i = 0; i <= s; i++){
for(int j = 0; j <=s;j++) {
if(b[i][j] != a[{x + i, y + j}]) {
flag = 0;
break;
}
}
}
if(flag) ans++;
}
}
cout << ans << "\n";
}
T1
简单模拟
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
double a[N];
int main() {
double n;
cin >> n;
double sum = 0;
for(int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
double b = sum / n;
double d = 0;
for(int i = 1; i <= n; i++) {
d += (a[i] - b) * (a[i] - b);
}
d = d / n;
for(int i = 1; i <= n; i++) {
double ans = (a[i] - b) / sqrt(d);
printf("%.6f\n", ans);
}
return 0;
}
——————————————————————————————————————————
由于赛时只动了三题就只放了三题上来了。
本次感悟:stl永远的神。