hdu6852
题目
就是对于有最多k个逆序的反过来往后排
前面是正序的找到一个(正序的长度+((n-正序的长度)%逆序的长度!=0)+(n-正序的长度)/逆序的长度))
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;
cin>>T;
int flag;
while(T--)
{
flag=0;
int n,x,y;
cin>>n>>x>>y;
int t=0;
for(;t<=n;t++)
{
if(t+((n-t)%y!=0)+(n-t)/y==x)
{
break;
}
}
if(t>n||(n-t)/y==0)
{
cout<<"NO"<<"\n";
continue;
}
cout<<"YES"<<"\n";
for(int i=1;i<=t;i++)
{
cout<<i<<" ";
flag++;
}
if((n-t)%y!=0)
{
for(int i=t+(n-t)%y;i>t;i--)
{
cout<<i<<" ";
flag++;
}
}
int ss=(n-t)/y;
while(ss--)
{
for(int i=n-ss*y;i>=n+1-(ss+1)*y;i--)
{
cout<<i;
flag++;
if(flag!=n)
cout<<" ";
}
}
cout<<"\n";
}
return 0;
}
hdu6853
题目
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
ll x,y;
int flag;
ll ans,bns;
map<pair<ll,ll>,int>M;
queue <pair<ll,ll> > Q;
void bfs()
{
pair<ll,ll> head,next;
head.first=x;
head.second=y;
Q.push(head);
M[head]=1;
while(!Q.empty())
{
head=Q.front();
if(head.first==head.second)
{
cout<<"0/1"<<endl;
return;
}
ans++;
Q.pop();
for(int i=0;i<8;i++)
{
next.first=head.first+dir[i][0];
next.second=head.second+dir[i][1];
if(__gcd(next.first,next.second)>1)
{
ans++;
if(M[next]==0)
{
Q.push(next);
M[next]=1;
}
}
}
if(flag==0)
{
bns=ans;
flag=1;
}
}
ll g=__gcd(ans,bns);
cout<<bns/g<<"/"<<ans/g<<"\n";
}
int main()
{
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--)
{
M.clear();
flag=0;
bns=0;
ans=0;
cin>>x>>y;
while(!Q.empty())
{
Q.pop();
}
bfs();
}
return 0;
}
hdu6850
题目
#include <bits/stdc++.h>
using namespace std;
const int maxn=2005;
typedef long long ll;
struct node
{
ll x,y;
};
node no[maxn];
int visit[maxn];
set<int>vv;
struct edge
{
int a,b;
ll dis;
bool operator<(const edge & bb)const
{
return dis>bb.dis;
}
};
edge e[maxn*maxn];
void init()
{
memset(visit,0,sizeof(visit));
vv.clear();
}
ll getdis(int i,int j)
{
return (no[i].x-no[j].x)*(no[i].x-no[j].x)+(no[i].y-no[j].y)*(no[i].y-no[j].y);
}
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
ll x,y;
cin>>x>>y;
no[i].x=x;
no[i].y=y;
}
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
res++;
e[res].a=i;
e[res].b=j;
e[res].dis=getdis(i,j);
}
}
sort(e+1,e+1+res);
ll max_=e[1].dis;
for(int i=1;i<=res;i++)
{
if(visit[e[i].a]||visit[e[i].b])
continue;
if(e[i].dis==max_)
{
int a=e[i].a;
int b=e[i].b;
vv.insert(a);
vv.insert(b);
} else
{
if(vv.find(e[i].a)!=vv.end()||vv.find(e[i].b)!=vv.end())
continue;
for(auto m:vv)
visit[m]=1;
vv.clear();
vv.insert(e[i].a);
vv.insert(e[i].b);
max_=e[i].dis;
}
}
for(auto m:vv)
visit[m]=1;
int flag=0;
for(int i=1;i<=n;i++)
{
if(visit[i]==0)
{
flag=i;
break;
}
}
if(flag==1)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
int main() {
int _=1;
cin>>_;
while(_--)
{
init();
solve();
}
return 0;
}