1001 造花(简单版) 1002 造花(困难版)
树
图
分析:
新学一招:
标准答案代码:
1001
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int fa[N],duano[N],sz[N],egu[N],egv[N],du[N];
int findfa(int x)
{
if(fa[x] == x) return x;
return fa[x] = findfa(fa[x]);
}
void mg(int x, int y)
{
int fax = findfa(x), fay = findfa(y);
fa[fax] = fay;
duano[x] ++; duano[y] ++;
sz[fay] += sz[fax];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,i,j,du2=0,ok=0;
scanf("%d",&n);
fill(du,du+1+n,0);
for(i=1;i<n;i++)
{
scanf("%d%d",&egu[i],&egv[i]);
du[egu[i]] ++; du[egv[i]] ++;
}
if(n <= 2)
{
printf("No\n"); continue;
}
for(i=1;i<=n;i++)
{
if(du[i] != 2 || du2 >= 6) continue;
du2 ++; ok = 1;
fill(duano+1,duano+1+n,0);
fill(sz+1,sz+1+n,1);
// memset() 0,-1,0x3f
iota(fa+1,fa+1+n,1);
// for(int i=1;i<=n;i++)
// fa[i]=i;
for(j=1;j<n;j++)
{
if(egu[j] == i || egv[j] == i) continue;
mg(egu[j],egv[j]);
}
for(j=1;j<=n;j++)
{
if(j == i) continue;
int f = findfa(j);
if(duano[j] == 1) sz[f] --;
}
for(j=1;j<=n;j++)
{
if(j == i) continue;
if(findfa(j) == j && sz[j] > 1) ok = 0;
}
if(ok) break;
}
if(ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}
1002
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
#define ssz(x) (int((x).size()))
vector<int> node[N];
int fa[N],sz[N],egu[N],egv[N],du[N],egcnt[N];
int findfa(int x)
{
if(fa[x] == x) return x;
return fa[x] = findfa(fa[x]);
}
void mg(int x, int y)
{
int fax = findfa(x), fay = findfa(y);
fa[fax] = fay;
du[x] ++; du[y] ++;
if(fax != fay)
{
sz[fay] += sz[fax];
egcnt[fay] += egcnt[fax]+1;
}
else egcnt[fax] ++;
}
vector<int> delnode,ans;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,i,j,u,v,x,y,ok=1;
scanf("%d%d",&n,&m);
delnode.clear(); ans.clear();
for(i=1;i<=n;i++) node[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
egu[i] = u; egv[i] = v;
node[u].push_back(v);
node[v].push_back(u);
}
for(i=1;i<=m;i++)
{
u = egu[i]; v = egv[i]; x = y = 0;
for(j=0;j<ssz(node[u]);j++)
{
if(node[u][j] != v)
{
x = node[u][j]; break;
}
}
for(j=0;j<ssz(node[v]);j++)
{
if(node[v][j] != u)
{
y = node[v][j]; break;
}
}
if(x>0 && y>0)
{
ok = 0;
delnode.push_back(u);
delnode.push_back(v);
delnode.push_back(x);
if(x != y) delnode.push_back(y);
break; //!!!!!!!!!!!
}
}
if(ok)
{
for(i=1;i<=n;i++) printf("%d%c",i," \n"[i==n]); //########
continue;
}
for(i=0;i<ssz(delnode);i++) //check if u is chaos-node
{
ok = 1; u = delnode[i];
fill(du+1,du+1+n,0);
fill(egcnt+1,egcnt+1+n,0);
fill(sz+1,sz+1+n,1);
iota(fa+1,fa+1+n,1);
for(j=1;j<=m;j++)
{
if(egu[j] == u || egv[j] == u) continue;
mg(egu[j],egv[j]);
}
for(j=1;j<=n;j++) if(findfa(j) == j && sz[j] != egcnt[j]+1) ok = 0;
for(j=1;j<=n;j++)
{
if(j == u) continue;
int f = findfa(j);
if(du[j] == 1) sz[f] --;
}
for(j=1;j<=n;j++)
{
if(j == u) continue;
if(findfa(j) == j && sz[j] > 1) ok = 0;
}
if(ok) ans.push_back(u);
}
if(ssz(ans) == 0) printf("-1\n");
else
{
sort(ans.begin(),ans.end());
for(i=0;i<ssz(ans);i++) printf("%d%c",ans[i]," \n"[i==ssz(ans)-1]);
}
}
return 0;
}
1003 飞车狂飙
分析:
模拟,用set存该点是否访问
代码:
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int ff[4][3]={{0,3,1},{1,0,2},{2,1,3},{3,2,0}};
int fx[4]={0,1,0,-1};
int fy[4]={1,0,-1,0};
int x,y,f;
int i,n;
void solve(){
x=0,y=0;f=2;
int falg=0;
set<pair<int, int>>st;
scanf("%d",&n); getchar();
for(i=0;i<n;i++){
char a; scanf("%c",&a);
x+=fx[f]; y+=fy[f];
if(st.find({x,y})!=st.end()){ falg=1; }
else{ st.insert({x,y}); }
if(a=='S'){
f=ff[f][0];
}
else if(a=='L'){
f=ff[f][1];
}
else{
f=ff[f][2];
}
// printf("x%d y%d f%d\n",x,y,f);
}
if(falg==1){ printf("-1\n");}
else{
if(x==0&&y==0&&f==2) printf("1\n");
else printf("0\n");
}
}
int main(){
freopen("D:\\1003(6).txt", "w", stdout);
int t; cin>>t;
while(t--){solve(); }
return 0;
}
1004 不醒人室
代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int st,ed;
int f;
};
bool cmp(node a,node b){
return a.st==b.st?a.f<b.f:a.st<b.st;
}
void solve(){
int n,m; scanf("%d%d",&n,&m);
node a[n+m+1];
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].st,&a[i].ed);
a[i].f=1;
}
for(int i=n+1;i<=n+m;i++){
scanf("%d%d",&a[i].st,&a[i].ed);
a[i].f=0;
}
sort(a+1,a+n+m+1,cmp);
for(int i=2;i<=n+m;i++){
if(a[i-1].ed>a[i].st){
printf("No\n"); return ;
}
}
for(int i=1;i<=n+m;i++){
if(!a[i].f){
int time=a[i].ed-a[i].st;
a[i].st=a[i].ed;
a[i].ed+=2*time;
}
}
sort(a+1,a+1+n+m,cmp);
int cover=0;
for(int i=1;i<=n+m;i++){
if(a[i].f){
if(cover<a[i].ed){
printf("No\n"); return ;
}
}
else{
cover=max(cover,a[i].ed);
}
}
printf("Yes\n");
}
int main(){
int t; cin>>t;
while(t--){
solve();
}
return 0;
}