2017ACM乌鲁木齐网预
A
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N
#define M
using namespace std;
typedef long long LL;
int T, n, m;
bool map[55][55], map1[55][55], map2[55][55];
int main()
{
scanf("%d", &T);
while(T--)
{
memset(map, 0, sizeof(map));
memset(map1, 0, sizeof(map1));
memset(map2, 0, sizeof(map2));
scanf("%d%d", &n, &m);
for(int i=1, x, y;i<=n;i++)
{
scanf("%d%d", &x, &y);
map[x][y]=1;
}
for(int i=1, x, y;i<=m;i++)
{
scanf("%d%d", &x, &y);
map1[x][y]=1;
}
for(int i=1;i<=50;i++)
for(int j=1;j<=50;j++)
for(int k=1;k<=50;k++)
if(map[i][j]&&map1[j][k])map2[i][k]=1;
for(int i=1;i<=50;i++)
for(int j=1;j<=50;j++)
if(map2[i][j])printf("%d %d\n", i, j);
printf("\n");
}
return 0;
}
C
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXN=1007;
int kk[MAXN];
int main()
{
int T;scanf("%d", &T);
while(T--)
{
int n, b;scanf("%d%d", &n, &b);
for(int i=1;i<=n;i++)
{
scanf("%d", &kk[i]);
}
int now=0;int fl=0;
for(int i=1;i<n;i++)
{
now+=kk[i];
int tmp;scanf("%d", &tmp);
if(tmp*b>now||fl)
{
fl=1;
}
else
{
now-=(tmp*b);
}
}
if(fl) printf("No\n");
else printf("Yes\n");
}
return 0;
}
E
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN=100000007;
struct FU
{
LL r;
LL k;
FU() {}
FU(LL _a, LL _b) { k=_a, r=_b; }
};
FU f[100];int nn=1;
void init()
{
f[0].k=1;f[1].k=2;f[2].k=7, f[3].k=12, f[4].k=41;
for(int i=5;i<=20;i++)
f[i].k=f[i-2].k*6-f[i-4].k;
for(int i=0;i<=20;i++)
{
f[i].r=f[i].k*f[i].k;
if(i%2) f[i].r*=2;
}
}
int main()
{
init();
int T;scanf("%d", &T);int cas=0;
while(T--)
{
LL tmp;scanf("%lld", &tmp);
int i=0;
for(i=0;i<=20;i++)
{
if(f[i].r>=tmp) break;
}
printf("Case #%d: %lld\n", ++cas, f[i].r);
}
return 0;
}
F
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<stack>
#include<string.h>
using namespace std;
#define MS(x) memset(x,0,sizeof(x))
stack<int> S;
vector<int> G[13000];
vector<int> C[13000];
bool used[15000];
int dfn[15000];
int low[15000];
int time_T=0;
int nv, ne;
int cmp[15000];
int ncmp;
bool instack[25000];
int in[15000];
int out[15000];
void init()
{
while(!S.empty()) S.pop();
MS(used);
MS(low);
for(int i=0;i<15000;i++)
dfn[i]=-1;
time_T=0;
ncmp=0;
MS(cmp);
MS(G);
MS(C);
MS(instack);
MS(in);
MS(out);
}
void tarjan(int n)
{
dfn[n]=low[n]=time_T++;
S.push(n);
instack[n]=1;
for(int i=0;i<G[n].size();i++)
{
int v=G[n][i];
if(dfn[v]==-1)
{
tarjan(v);
low[n]=min(low[n], low[v]);
}
else if(instack[v])
{
low[n]=min(low[n], dfn[v]);
}
}
if(dfn[n]==low[n])
{
int v;
do
{
v=S.top();
S.pop();
instack[v]=false;
cmp[v]=ncmp;
} while(v!=n);
ncmp++;
}
}
int main()
{
int cas;
scanf("%d", &cas);
for(int T=1;T<=cas;T++)
{
init();
scanf("%d%d", &nv, &ne);
for(int i=0;i<ne;i++)
{
int f, t;
scanf("%d%d", &f, &t);
f--;
t--;
G[f].push_back(t);
}
for(int i=0;i<nv;i++)
if(dfn[i]==-1)
tarjan(i);
if(ncmp==1)
{
puts("0");
continue;
}
for(int i=0;i<nv;i++)
{
for(int j=0;j<G[i].size();j++)
{
int v=G[i][j];
int cn=cmp[i];
int cv=cmp[v];
if(cn!=cv)
C[cn].push_back(cv);
}
}
int ans=0;
for(int i=0;i<ncmp;i++)
{
out[i]=C[i].size();
for(int j=0;j<C[i].size();j++)
{
int v=C[i][j];
in[v]++;
}
}
int in0=0;
int out0=0;
for(int i=0;i<ncmp;i++)
{
if(in[i]==0)
in0++;
if(out[i]==0)
out0++;
}
printf("%d\n", max(in0, out0));
}
return 0;
}
G
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN=100007;
char s[MAXN], t[20];
int la[MAXN];
int bit[MAXN];
int lowbit(int i)
{
return i&(-i);
}
void change(int pos, int v)
{
while(pos<MAXN)
bit[pos]+=v, pos+=lowbit(pos);
}
int query(int pos)
{
int ans=0;
while(pos>0)
ans+=bit[pos], pos-=lowbit(pos);
return ans;
}
void baoli(int n, int m)
{
int i, j;
for(i=m;i<=n;i++)
{
bool flag=0;
for(j=1;j<=m;j++)
{
if(s[i-j+1]!=t[m-j+1]) { flag=1; break; }
}
if(flag)continue;
la[i]=1;change(i, 1);
}
}
void xiugai(int n, int m, int L, int R, int p, char c)
{
s[p]=c;
int i, j;
for(int i=L; i<=R;i++)
{
if(la[i])
change(i, -1), la[i]=0;
}
for(i=L;i<=R;i++)
{
bool flag=0;
for(j=1;j<=m;j++)
{
if(s[i-j+1]!=t[m-j+1]) { flag=1; break; }
}
if(flag) { la[i]=0;continue; }
change(i, 1);
la[i]=1;
}
}
int main()
{
int T;scanf("%d", &T);
while(T--)
{
M(la, 0);
M(bit, 0);
int q;scanf("%d", &q);
scanf("%s", s+1);int n=strlen(s+1);
scanf("%s", t+1);int m=strlen(t+1);
baoli(n, m);
for(int i=1;i<=q;i++)
{
char ss[3];
scanf("%s", ss);
if(ss[0]=='Q')
{
int t1, t2;scanf("%d%d", &t1, &t2);
if(t1+m-1>t2) printf("0\n");
else
printf("%d\n", query(t2)-query(t1+m-2));
}
else
{
int p;char cc[3];
scanf("%d%s", &p, cc);
if(s[p]==cc[0]) continue;
s[p]=cc[0];
int st=max(p, m);
int fi=min(p+m-1, n);
if(st<=fi)
xiugai(n, m, st, fi, p, cc[0]);
}
}
printf("\n");
}
return 0;
}
H
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
struct Edge { int next, to, v; }a[100005];
int T, n, m, ans, cnt, h[10005], dis[10005];
bool vis[10005], rd[10005];
void Addedge(int x, int y, int v)
{
a[++cnt].to=y;a[cnt].next=h[x];a[cnt].v=v;h[x]=cnt;
}
queue<int> que;
int main()
{
scanf("%d", &T);
while(T--)
{
while(!que.empty()) que.pop();
scanf("%d%d", &n, &m);
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(dis));
memset(rd, 0, sizeof(rd));
memset(h, 0, sizeof(h));
ans=0, cnt=0;
for(int i=1, x, y, v;i<=m;i++)
{
scanf("%d%d%d", &x, &y, &v);
Addedge(x, y, v);
rd[y]=1;
}
for(int i=1;i<=n;i++)
if(!rd[i])que.push(i);
else vis[i]=1;
while(!que.empty())
{
int x=que.front();que.pop();
for(int i=h[x];i;i=a[i].next)
{
int y=a[i].to;
if(dis[y]<dis[x]+a[i].v)
{
dis[y]=dis[x]+a[i].v;
if(ans<dis[y])ans=dis[y];
if(vis[y]) { que.push(y);vis[y]=0; }
}
}
vis[x]=1;
}
printf("%d\n", ans);
}
return 0;
}