西安邮电大学第五届ACM-ICPC校赛(同步赛) 解题报告
A拯救咕咕咕之史莱姆
签到题。从1到6天,依次扣除3,6,9,12,18,27,求个和就是75,也就是说只要hp<=75,他就会乖乖求饶,否则,死磕到底。
#include <iostream> #include <map> #include <ctime> #include <vector> #include <climits> #include <algorithm> #include <random> #include <cstring> #include <cstdio> #include <map> #include <set> #include <bitset> #include <queue> #define inf 0x3f3f3f3f #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define rep(i, a, n) for(register int i = a; i <= n; ++ i) #define per(i, a, n) for(register int i = n; i >= a; -- i) #define ONLINE_JUDGE using namespace std; typedef long long ll; const int mod=1e9+7; template<typename T>void write(T x) { if(x<0) { putchar('-'); x=-x; } if(x>9) { write(x/10); } putchar(x%10+'0'); } template<typename T> void read(T &x) { x = 0;char ch = getchar();ll f = 1; while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();} while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f; } ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);} ll lcm(ll a,ll b){return a/gcd(a,b)*b;}; ll ksm(ll a,ll n){//看是否要mod ll ans=1; while(n){ if(n&1) ans=(ans*a)%mod; a=a*a%mod; n>>=1; } return ans%mod; } //============================================================== ll n; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif clock_t c1 = clock(); //=========================================================== while(~scanf("%lld",&n)&&n){ if(n<=75) puts("AOLIGEI!"); else puts("DAAAAAMN!"); } //=========================================================== std::cerr << "Time:" << clock() - c1 << "ms" << std::endl; return 0; }
B. 烦人的依赖
裸的拓扑排序,只是需要把字符串转为数字进行排序(是字符串,不是字符!)。对于安装字典序小的要求,我们可以用优先队列进行处理。
PS.听说卡常,需要注意下。
#include <iostream> #include <map> #include <ctime> #include <vector> #include <climits> #include <algorithm> #include <random> #include <cstring> #include <cstdio> #include <map> #include <set> #include <bitset> #include <queue> #define inf 0x3f3f3f3f #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define rep(i, a, n) for(register int i = a; i <= n; ++ i) #define per(i, a, n) for(register int i = n; i >= a; -- i) #define ONLINE_JUDGE using namespace std; typedef long long ll; const int mod = 1e9 + 7; template<typename T>void write(T x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) { write(x / 10); } putchar(x % 10 + '0'); } template<typename T> void read(T& x) { x = 0; char ch = getchar(); ll f = 1; while (!isdigit(ch)) { if (ch == '-')f *= -1; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }x *= f; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }; ll ksm(ll a, ll n) {//看是否要mod ll ans = 1; while (n) { if (n & 1) ans = (ans * a) % mod; a = a * a % mod; n >>= 1; } return ans % mod; } //============================================================== const int maxn = 3e4 + 10, maxm = 1e5 + 10; int t, n, m; struct Edge { int next, to; }e[maxm];// int head[maxn], cnt;// void add(int x, int y) { e[cnt].to = y; e[cnt].next = head[x]; head[x] = cnt++; } int in[maxn];// vector<int> ans;// map<string, int> li;// vector<string> tmp;// bool topo() { priority_queue<int, vector<int>, greater<int>> que; rep(i, 1, n) { if (in[i] == 0) que.push(i); } if (que.size() == 0) return false; while (!que.empty()) { int u = que.top(); que.pop(); ans.push_back(u); for (int i = head[u]; ~i; i = e[i].next) { int v = e[i].to; in[v]--; if (in[v] == 0) { que.push(v); } } } return true; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt","w",stdout); #endif clock_t c1 = clock(); //=========================================================== read(t); int kase = 0; while (t--) { read(n), read(m); cnt = 0; ans.clear(); memset(head, -1, sizeof(head)); memset(e, 0, sizeof(e)); memset(in, 0, sizeof(in)); li.clear(), tmp.clear(); rep(i, 1, n) { string na; cin >> na; tmp.push_back(na); } sort(tmp.begin(), tmp.end()); rep(i, 0, tmp.size() - 1) { li[tmp[i]] = i + 1; } while (m--) { string s, t; cin >> s >> t; int a = li[s], b = li[t]; add(a, b); in[b]++; } printf("Case #%d:\n", ++kase); if (!topo()) { puts("Impossible"); } else { if (ans.size() != n) { puts("Impossible"); } else { rep(i, 0, ans.size() - 1) { printf("%s",tmp[ans[i] - 1].c_str()), putchar('\n'); } } } } //=========================================================== std::cerr << "Time:" << clock() - c1 << "ms" << std::endl; return 0; }