西安邮电大学第五届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;
}