首页 > 代码库 > SnackDown Online Qualifier 2017

SnackDown Online Qualifier 2017

好久没做题了,然后就想着随便做一个。无奈cf都是晚上,然后就看见这个,随便做做。

资格赛,只要做出来1题就行了,4天的时间。

1. 水题 

技术分享
 1 #include <iostream> 2 #include <stdio.h> 3   4 using namespace std; 5   6 int n; 7 string s; 8 void yes() { 9     cout << "Valid" << endl;10 }11 void no() {12     cout << "Invalid" << endl;13 }14 void solve() {15     cin >> n >> s;16     int t = 0;17     for (char c : s) {18         if(c == H) {19             if(t == 0) {20                 t = 1;21             } else {22                 no();23                 return;24             }25         } else if(c == T) {26             if(t == 1) {27                 t = 0;28             } else {29                 no();30                 return;31             }32         }33     }34     if(t != 0) no();35     else yes();36 }37  38 int main() {39     //freopen("test.in", "r", stdin);40     int _;41     cin >> _;42     while(_--)43         solve();44     return 0;45 } 
View Code

2. 就是 1, 2,3,。。,3,2,1,必须是奇数个。

技术分享
 1 #include<bits/stdc++.h> 2 #define pb push_back 3 typedef long long ll; 4 using namespace std; 5 typedef pair<int, int> pii; 6 const int maxn = 1e2 + 10; 7   8 int n; 9 int a[maxn];10 void yes() {cout << "yes" << endl;}11 void no() {cout << "no" << endl;}12 void solve() {13     cin >> n;14     for (int i = 1; i <= n; i++) cin >> a[i];15     if(n % 2 == 0) {16         no(); return;17     }18     for (int i = 1; i <= n / 2 + 1; i++) {19         if(i != a[i] || a[i] != a[1 + n - i]) {20             no(); return;21         }22     }23     yes();24 }25  26 int main() {27    // freopen("test.in", "r", stdin);28     //freopen("test.out", "w", stdout);29     ios::sync_with_stdio(0);30     cin.tie(0); cout.tie(0);31     int _;32     cin >> _;33     while(_--)34     solve();35     return 0;36 }
View Code

3. 这个题,我写的很麻烦, 上来先判断线段的类型,有三种,点,水平和垂直,然后每2种进行考虑。

只要一个是点, 就判断这个点是不是在另一个线段上。

2条线段类型相同, 都是水平或者垂直, 这个时候, 必须共线才满足条件,否则不满足。

2条线段类型不同,这个时候,2条线段的有一个端点重合,才是满足的。

就是,上面的这三种情况。

技术分享
 1 #include<bits/stdc++.h> 2 #define pb push_back 3 typedef long long ll; 4 using namespace std; 5 typedef pair<int, int> pii; 6 const int maxn = 1e3 + 10; 7 int type, mx, ma, mb; 8 void work(int x, int y, int a, int b) { 9     type = mx = mb = -1;10     if(x == a && y == b) {11         type = 3;12         ma = x; mb = y;13         return;14     }15     if(x == a) {16         type = 1;17         mx = x;18         ma = min(y, b);19         mb = max(y, b);20     } else {21         type = 2;22         mx = y;23         ma = min(x, a);24         mb = max(x, a);25     }26 }27 void yes() {28     cout << "yes" << endl;29 }30 void no() {31     cout << "no" << endl;32 }33 void solve() {34     int x, y, a, b;35     cin >> x >> y >> a >> b;36     work(x, y, a, b);37     int xt = type, xx = mx, xa = ma, xb = mb;38     cin >> x >> y >> a >> b;39     work(x, y, a, b);40     //cout << xt << " " << type << endl;41     if(xt == type) {42         if(xt == 3) {43             if(xa == ma && xb == mb) {44                 yes();45             } else {46                 no();47             }48             return;49         }50         if(xx != mx) {51             no();52             return;53         }54         if(xa > mb || ma > xb) {55             no();56             return;57         }58         yes();59     } else {60         if(xt == 3) {61             if((xa == mx && xb >= ma && xb <= mb) || (xb == mx && xa >= ma && xa <= mb)) {62                 yes();63  64             } else {65                 no();66             }67             return;68         }69         if(type == 3) {70             if((ma == xx && mb >= xa && mb <= xb) || (mb == xx && ma >= xa && ma <= xb)) {71                 yes();72             } else no();73             return;74         }75         if((xx == ma || xx == mb) && (mx == xa || mx == xb)) {76             yes();77             return;78         }79         no();80     }81 }82  83 int main() {84     //freopen("test.in", "r", stdin);85     //freopen("test.out", "w", stdout);86     ios::sync_with_stdio(0);87     cin.tie(0); cout.tie(0);88     int _; cin >> _;89     while(_--)90     solve();91     return 0;92 }
View Code

4. 大蛇吃小蛇,先从小到大排序,然后对于一次查询,大于等于l的都是满足要求的, 这个是二分, 然后判断剩下的最多能凑成几条蛇。

剩下的能凑成几条,也是判断一种状况, 左边的蛇都被吃掉,右边的蛇变长成l,看需要的个数是否是左边的个数, 这个过程也是二分,然后就完了。

技术分享
 1 #include<bits/stdc++.h> 2 #define pb push_back 3 typedef long long ll; 4 using namespace std; 5 typedef pair<int, int> pii; 6 const int maxn = 1e5 + 10; 7 int n, q; 8 int a[maxn]; 9 ll s[maxn];10 ll work(int x, int y) {11     return s[y] - s[x - 1];12 }13 void solve() {14     memset(a, 0, sizeof a);15     memset(s, 0, sizeof s);16     scanf("%d%d", &n, &q);17     for (int i = 1; i <= n; i++) {18         scanf("%d", &a[i]);19         //s[i] = s[i - 1] + a[i];20     }21     sort(a + 1, a + n + 1);22     for (int i = 1; i <= n; i++)23         s[i] = s[i - 1] + a[i];24     int k;25     while(q--) {26         scanf("%d", &k);27         int t = lower_bound(a + 1, a + n + 1, k) - a;28         //cout << t <<endl;29         int res = n + 1 - t;30         int left = 1, right = t - 1, ed = t - 1;31         while(left < right) {32             int mid = (left + right) / 2;33             ll st = 1ll * (ed - mid) * k - work(mid + 1, ed);34             //cout << st << " " << mid << endl;35             if(st > mid) {36                 left = mid + 1;37             } else right = mid;38             //cout << left << " " << right << " " << mid << endl;39         }40         //cout << left << " " << right << endl;41         if(left == right)42             res += ed - left;43         printf("%d\n", res);44     }45 }46  47 int main() {48     //freopen("test.in", "r", stdin);49     //freopen("test.out", "w", stdout);50     int _;51     scanf("%d", &_);52     while(_--)53         solve();54     return 0;55 }
View Code

 

SnackDown Online Qualifier 2017