#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <map> #include <cmath> #include <set> #include <vector> #include <queue> #include <stack> #include <ctime> #define MAXN 111111 #define eps 1e-7 #define INF 1000000007 using namespace std; char str1[555], str2[555]; char s1[555], s2[555]; int nei[333], wai[333]; int len; int nm[33]; stack<char>optr; stack<long long>opnd; bool flag; long long calculate(long long x, long long y, char c) { switch(c) { case '+': return x + y; case '-': return x - y; case '*': return x * y; case '^': long long tmp = 1; for(int i = 0; i < y; i++) tmp *= x; return tmp; } } char cmp(char a, char b) { if(nei[a] > wai[b]) return '>'; else if(nei[a] == wai[b]) return '='; return '<'; } long long gao(char *s) { int i = 0; long long num; while(s[i] != '#' || optr.top() != '#') { num = 0; if(!flag) return -1; if(s[i] >= '0' && s[i] <= '9') { while(s[i] >= '0' && s[i] <= '9') { num *= 10; num += s[i] - '0'; i++; } opnd.push(num); } else if(s[i] >= 'a' && s[i] <= 'z') { opnd.push(nm[s[i] - 'a']); i++; } else { switch(cmp(optr.top(), s[i])) { case '<' : optr.push(s[i]); i++; break; case '=' : optr.pop(); i++; break; case '>' : if(opnd.empty()) { flag = false; return -1; } long long ta = opnd.top(); opnd.pop(); if(opnd.empty()) { flag = false; return -1; } long long tb = opnd.top(); opnd.pop(); opnd.push(calculate(tb, ta, optr.top())); optr.pop(); break; } } } return opnd.top(); } void init() { while(!opnd.empty()) opnd.pop(); while(!optr.empty()) optr.pop(); optr.push('#'); } int main() { nei['+'] = 2; wai['+'] = 1; nei['-'] = 2; wai['-'] = 1; nei['*'] = 4; wai['*'] = 3; nei['^'] = 6; wai['^'] = 5; nei[')'] = 8; wai[')'] = 0; nei['('] = 0; wai['('] = 8; nei['#'] = -1; wai['#'] = -1; int T; scanf("%d", &T); getchar(); srand(time(0)); while(T--) { gets(str1); len = 0; for(int i = 0; str1[i]; i++) if(str1[i] != ' ') s1[len++] = str1[i]; s1[len++] = '#'; s1[len] = '\0'; gets(str2); len = 0; for(int i = 0; str2[i]; i++) if(str2[i] != ' ') s2[len++] = str2[i]; s2[len++] = '#'; s2[len] = '\0'; flag = 1; for(int i = 0; i < 10; i++) { for(int j = 0; j < 26; j++) nm[j] = labs(rand()) % 100; init(); long long t1 = gao(s1); init(); long long t2 = gao(s2); //printf("%lld %lld\n", t1, t2); if(t1 != t2) { flag = 0; break; } } if(flag) puts("YES"); else puts("NO"); } return 0; }
剛開始看錯題意。敲了一個小時。 然後發現錯了之後換了方法就過了。 大意是一個在二維坐標系上有一些點。 一個人會沿一些直線巡視。 這些直線是平行於X或Y軸的 然後首先這條線上的點他能看見。 他在線上走的時候也會左右瞅。 當然看的視線是垂直於行走方向的 然後如果一個點在一個點後邊。 他是看不到的。因為被擋住了 最後問的是 是否看到了所有點中60%的點 那麼我的思路是: 離散化是肯定的 首先從左到右,看每個x坐標,將其所有y坐標塞進一個vector裡,並先按y排序 然後把所有走的路線中的水平線坐標塞進一個vector裡 然後遍歷該x對應的vector中的y坐標。 在水平線那個vector裡lower_bound找其附近的兩條水平線 看是否被其他點給擋住了。 這樣的話就可以了。同理看每個y坐標
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <map> #include <cmath> #include <set> #include <vector> #include <queue> #include <stack> #include <ctime> #define MAXN 211111 #define eps 1e-7 #define INF 1000000007 using namespace std; int n, m; int xx[MAXN], yy[MAXN]; int ok[MAXN]; typedef pair<int, int> P; P p[MAXN]; vector<P>gx[MAXN], gy[MAXN]; vector<int>gh, gv; typedef vector<int>::iterator Iter; char op[5]; int main() { int T, cc; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &m); for(int i = 0; i < MAXN; i++) gx[i].clear(), gy[i].clear(); memset(ok, 0, sizeof(ok)); gh.clear(); gv.clear(); for(int i = 0; i < n; i++) { scanf("%d%d", &p[i].first, &p[i].second); xx[i] = p[i].first; yy[i] = p[i].second; } sort(xx, xx + n); sort(yy, yy + n); int nx = unique(xx, xx + n) - xx; int ny = unique(yy, yy + n) - yy; for(int i = 0; i < n; i++) { int px = lower_bound(xx, xx + nx, p[i].first) - xx; int py = lower_bound(yy, yy + ny, p[i].second) - yy; gx[px].push_back(make_pair(p[i].second, i)); gy[py].push_back(make_pair(p[i].first, i)); } for(int i = 0; i < nx; i++) sort(gx[i].begin(), gx[i].end()); for(int i = 0; i < ny; i++) sort(gy[i].begin(), gy[i].end()); for(int i = 0; i < m; i++) { scanf("%s%d", op, &cc); if(op[0] == 'H') gh.push_back(cc); else gv.push_back(cc); } sort(gh.begin(), gh.end()); sort(gv.begin(), gv.end()); unique(gh.begin(), gh.end()); unique(gv.begin(), gv.end()); for(int i = 0; i < nx; i++) { int sz = gx[i].size(); for(int j = 0; j < sz; j++) { int ty = gx[i][j].first; int id = gx[i][j].second; Iter it = lower_bound(gh.begin(), gh.end(), ty); if(it != gh.end()) { if(*it == ty) ok[id] = 1; if(*it > ty) { if(j + 1 < sz) { if(*it <= gx[i][j + 1].first) ok[id] = 1; } else ok[id] = 1; } } if(it != gh.begin()) { it--; if(j > 0) { if(*it >= gx[i][j - 1].first) ok[id] = 1; } else ok[id] = 1; } } } for(int i = 0; i < ny; i++) { int sz = gy[i].size(); for(int j = 0; j < sz; j++) { int tx = gy[i][j].first; int id = gy[i][j].second; Iter it = lower_bound(gv.begin(), gv.end(), tx); if(it != gv.end()) { if(*it == tx) ok[id] = 1; if(*it > tx && j + 1 < sz && *it <= gy[i][j + 1].first) ok[id] = 1; } if(it != gv.begin()) { it--; if(j > 0 && *it >= gy[i][j - 1].first) ok[id] = 1; } } } int cnt = 0; for(int i = 0; i < n; i++) if(ok[i]) cnt++; //printf("%d\n", cnt); if((double)cnt / (double)n >= 0.6) puts("PASSED"); else puts("FAILED"); } return 0; }